Commit 5e52ffc4 by Kazu Hirata Committed by Kazu Hirata

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
parent ae0595b0
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
......
...@@ -1068,6 +1068,13 @@ find_inc (bool first_try) ...@@ -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)
......
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
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment