re PR rtl-optimization/44404 (auto-inc-dec generates an invalid assembly instruction)

gcc/
	PR rtl-optimization/44404
	* auto-inc-dec.c (find_inc): Use reg_overlap_mentioned_p instead
	of count_occurrences to see if it's safe to modify mem_insn.insn.
	gcc/testsuite/

gcc/testsuite/
	PR rtl-optimization/44404
	* gcc.dg/pr44404.c: New.

From-SVN: r160372
This commit is contained in:
Kazu Hirata 2010-06-07 13:12:42 +00:00 committed by Kazu Hirata
parent ae0595b089
commit 5e52ffc4f0
4 changed files with 54 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2010-06-07 Kazu Hirata <kazu@codesourcery.com>
PR rtl-optimization/44404
* auto-inc-dec.c (find_inc): Use reg_overlap_mentioned_p instead
of count_occurrences to see if it's safe to modify mem_insn.insn.
gcc/testsuite/
2010-06-07 Richard Guenther <rguenther@suse.de>
* gimplify.c (gimplify_cleanup_point_expr): For empty body

View File

@ -1068,6 +1068,13 @@ find_inc (bool first_try)
/* For the post_add to work, the result_reg of the inc must not be
used in the mem insn since this will become the new index
register. */
if (count_occurrences (PATTERN (mem_insn.insn), inc_insn.reg_res, 1) == 0
&& reg_overlap_mentioned_p (inc_insn.reg_res, PATTERN (mem_insn.insn)))
{
debug_rtx (mem_insn.insn);
debug_rtx (inc_insn.reg_res);
gcc_unreachable ();
}
if (count_occurrences (PATTERN (mem_insn.insn), inc_insn.reg_res, 1) != 0)
{
if (dump_file)

View File

@ -1,3 +1,8 @@
2010-06-07 Kazu Hirata <kazu@codesourcery.com>
PR rtl-optimization/44404
* gcc.dg/pr44404.c: New.
2010-06-07 Kai Tietz <kai.tietz@onevision.com>
PR target/44159

View File

@ -0,0 +1,35 @@
/* PR rtl-optimization/44404
foo() used to be miscompiled on ARM due to a bug in auto-inc-dec.c,
which resulted in "strb r1, [r1], #-36". */
/* { dg-do run } */
/* { dg-options "-O2 -fno-unroll-loops" } */
extern char *strcpy (char *, const char *);
extern int strcmp (const char*, const char*);
extern void abort (void);
char buf[128];
void __attribute__((noinline))
bar (int a, const char *p)
{
if (strcmp (p, "0123456789abcdefghijklmnopqrstuvwxyz") != 0)
abort ();
}
void __attribute__((noinline))
foo (int a)
{
if (a)
bar (0, buf);
strcpy (buf, "0123456789abcdefghijklmnopqrstuvwxyz");
bar (0, buf);
}
int
main (void)
{
foo (0);
return 0;
}