diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-10-09 11:04:46 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-10-09 11:04:46 +0000 |
commit | b6c8535d9898b28f87016a4f8ced9d95f98df125 (patch) | |
tree | 380064bdc5ece64e0334820d84d2da25451f50cd /gcc | |
parent | 7bd530d97ac94ef8540dd2bb9c9549828f6293ef (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr33615.C | 20 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 3 |
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 |