summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-09 11:04:46 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-09 11:04:46 +0000
commitb6c8535d9898b28f87016a4f8ced9d95f98df125 (patch)
tree380064bdc5ece64e0334820d84d2da25451f50cd /gcc
parent7bd530d97ac94ef8540dd2bb9c9549828f6293ef (diff)
downloadgcc-b6c8535d9898b28f87016a4f8ced9d95f98df125.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129163 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr33615.C20
-rw-r--r--gcc/tree-ssa-loop-im.c3
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4717ca8a4b0..1d66ea3ac78 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0b1e91610d6..f6665d5c707 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..e8a536935b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr33615.C
@@ -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" } }
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index d2ab41ce054..83ad70c2890 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -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