re PR tree-optimization/33615 (Hoisting of potentially-throwing values for -fnon...
authorRichard Sandiford <rsandifo@nildram.co.uk>
Tue, 9 Oct 2007 11:04:46 +0000 (11:04 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 9 Oct 2007 11:04:46 +0000 (11:04 +0000)
gcc/
PR tree-optimization/33615
* tree-ssa-loop-im.c (movement_possibility): Return MOVE_IMPOSSIBLE
if the rhs might throw.

gcc/testsuite/
PR tree-optimization/33615
* g++.dg/tree-ssa/pr33615.C: New test.

From-SVN: r129163

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr33615.C [new file with mode: 0644]
gcc/tree-ssa-loop-im.c

index 4717ca8a4b0e382d811991f5b6a691eb3e0ee552..1d66ea3ac7886867ec42630cb33ab64bd0c71a90 100644 (file)
@@ -1,3 +1,9 @@
+2007-10-09  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR tree-optimization/33615
+       * tree-ssa-loop-im.c (movement_possibility): Return MOVE_IMPOSSIBLE
+       if the rhs might throw.
+
 2007-10-09  Jan Hubicka  <jh@suse.cz>
 
        * invoke.texi (align-threshold, align-loop-iterations): Document.
index 0b1e91610d6ff9bfb162b14782bcc08f82c1a72a..f6665d5c7076589eabfc374fc96d3bc5ebe7e78f 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-09  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR tree-optimization/33615
+       * g++.dg/tree-ssa/pr33615.C: New test.
+
 2007-10-08  Alexandre Oliva  <aoliva@redhat.com>
 
        PR tree-optimization/33572
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr33615.C b/gcc/testsuite/g++.dg/tree-ssa/pr33615.C
new file mode 100644 (file)
index 0000000..e8a5369
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fnon-call-exceptions -fdump-tree-lim-details -w" } */
+
+extern volatile int y;
+
+double
+foo (double a, int x)
+{
+  while (x--)
+    {
+      y++;
+      a += 1.0 / 0.0;
+    }
+  return a;
+}
+
+// The expression 1.0 / 0.0 should not be treated as a loop invariant
+// if it may throw an exception.
+// { dg-final { scan-tree-dump-times "invariant up to" 0 "lim" } }
+// { dg-final { cleanup-tree-dump "lim" } }
index d2ab41ce0543eac3e9cb059d2b750b1a1b2532ab..83ad70c2890528843160a4c26b7a1903c9bc5420 100644 (file)
@@ -260,7 +260,8 @@ movement_possibility (tree stmt)
 
   rhs = GIMPLE_STMT_OPERAND (stmt, 1);
 
-  if (TREE_SIDE_EFFECTS (rhs))
+  if (TREE_SIDE_EFFECTS (rhs)
+      || tree_could_throw_p (rhs))
     return MOVE_IMPOSSIBLE;
 
   if (TREE_CODE (lhs) != SSA_NAME