]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/24899 (loop.c miscompiles libgnomecanvas)
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Dec 2005 12:12:41 +0000 (13:12 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Dec 2005 12:12:41 +0000 (13:12 +0100)
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

gcc/ChangeLog
gcc/loop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20051215-1.c [new file with mode: 0644]

index ccebcd768705a1a6d3e426030965a8542b9ac3f2..f5e91e609fbeca1c7643827784b2a76e1e4457d6 100644 (file)
@@ -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>
index 0de77beab36278660b5c85f9aa63af44cb9226dc..4aa1ff9ab707a037a6a8e009941b323e64920986 100644 (file)
@@ -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
index 8c498964ce5df40d7d4ed2f70887721e474283cb..075dd3b615e239442e38b9bd185d3accb743fe1d 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gcc.c-torture/execute/20051215-1.c b/gcc/testsuite/gcc.c-torture/execute/20051215-1.c
new file mode 100644 (file)
index 0000000..143a449
--- /dev/null
@@ -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;
+}