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> 2010-06-07 Richard Guenther <rguenther@suse.de>
* gimplify.c (gimplify_cleanup_point_expr): For empty body * 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 /* 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 used in the mem insn since this will become the new index
register. */ 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 (count_occurrences (PATTERN (mem_insn.insn), inc_insn.reg_res, 1) != 0)
{ {
if (dump_file) 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> 2010-06-07 Kai Tietz <kai.tietz@onevision.com>
PR target/44159 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;
}