re PR rtl-optimization/24899 (loop.c miscompiles libgnomecanvas)
PR rtl-optimization/24899 * loop.c (strength_reduce): Don't reduce giv that is not always computable and where add_val or mult_val can trap. * gcc.c-torture/execute/20051215-1.c: New test. From-SVN: r108642
This commit is contained in:
parent
0c8c236b7a
commit
a1615718f5
4 changed files with 48 additions and 0 deletions
|
@ -1,5 +1,9 @@
|
|||
2005-12-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/24899
|
||||
* loop.c (strength_reduce): Don't reduce giv that is not always
|
||||
computable and where add_val or mult_val can trap.
|
||||
|
||||
* doc/invoke.texi (-fdump-tree-*): Remove note about C/C++ only.
|
||||
|
||||
2005-12-16 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
|
11
gcc/loop.c
11
gcc/loop.c
|
@ -6486,6 +6486,17 @@ strength_reduce (struct loop *loop, int flags)
|
|||
v->ignore = 1;
|
||||
bl->all_reduced = 0;
|
||||
}
|
||||
else if (!v->always_computable
|
||||
&& (may_trap_or_fault_p (v->add_val)
|
||||
|| may_trap_or_fault_p (v->mult_val)))
|
||||
{
|
||||
if (loop_dump_stream)
|
||||
fprintf (loop_dump_stream,
|
||||
"giv of insn %d: not always computable.\n",
|
||||
INSN_UID (v->insn));
|
||||
v->ignore = 1;
|
||||
bl->all_reduced = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check that we can increment the reduced giv without a
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2005-12-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/24899
|
||||
* gcc.c-torture/execute/20051215-1.c: New test.
|
||||
|
||||
2005-12-16 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
PR 24823
|
||||
|
|
28
gcc/testsuite/gcc.c-torture/execute/20051215-1.c
Normal file
28
gcc/testsuite/gcc.c-torture/execute/20051215-1.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* PR rtl-optimization/24899 */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
__attribute__ ((noinline)) int
|
||||
foo (int x, int y, int *z)
|
||||
{
|
||||
int a, b, c, d;
|
||||
|
||||
a = b = 0;
|
||||
for (d = 0; d < y; d++)
|
||||
{
|
||||
if (z)
|
||||
b = d * *z;
|
||||
for (c = 0; c < x; c++)
|
||||
a += b;
|
||||
}
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
if (foo (3, 2, 0) != 0)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue