diff options
author | Richard Guenther <rguenther@suse.de> | 2011-05-23 12:08:41 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-05-23 12:08:41 +0000 |
commit | 094f6ab3d5aa9753f5fc0c36a8cdfef4c2938140 (patch) | |
tree | 517ad43ddd93528a11fead28a4b00d0da1d17b8b | |
parent | 9a9822e13ece30035ad18fed7f3946d8b1ce67a9 (diff) | |
download | gcc-094f6ab3d5aa9753f5fc0c36a8cdfef4c2938140.zip gcc-094f6ab3d5aa9753f5fc0c36a8cdfef4c2938140.tar.gz gcc-094f6ab3d5aa9753f5fc0c36a8cdfef4c2938140.tar.bz2 |
re PR tree-optimization/49115 (invalid return value optimization (?) when exception is thrown and caught)
2011-05-23 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49115
* tree-ssa-alias.c (stmt_kills_ref_p_1): If the assignment
is not necessarily carried out, do not claim it kills the ref.
* tree-ssa-dce.c (mark_aliased_reaching_defs_necessary_1): Likewise.
* g++.dg/torture/pr49115.C: New testcase.
From-SVN: r174066
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr49115.C | 25 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 9 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 9 |
5 files changed, 53 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25b569e..6299081 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2011-05-23 Richard Guenther <rguenther@suse.de> + PR tree-optimization/49115 + * tree-ssa-alias.c (stmt_kills_ref_p_1): If the assignment + is not necessarily carried out, do not claim it kills the ref. + * tree-ssa-dce.c (mark_aliased_reaching_defs_necessary_1): Likewise. + +2011-05-23 Richard Guenther <rguenther@suse.de> + PR middle-end/15419 * builtins.c (fold_builtin_memory_op): Be less restrictive about what pointer types we accept for folding. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c41d324..e647cb5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-05-23 Richard Guenther <rguenther@suse.de> + PR tree-optimization/49115 + * g++.dg/torture/pr49115.C: New testcase. + +2011-05-23 Richard Guenther <rguenther@suse.de> + PR middle-end/15419 * gcc.dg/memcpy-3.c: New testcase. diff --git a/gcc/testsuite/g++.dg/torture/pr49115.C b/gcc/testsuite/g++.dg/torture/pr49115.C new file mode 100644 index 0000000..c4cce21 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49115.C @@ -0,0 +1,25 @@ +// { dg-do run } + +extern "C" void abort (void); +struct MyException {}; +struct Data { + int nr; + Data() : nr(66) {} +}; +Data __attribute__((noinline,noclone)) getData(int i) +{ + if (i) throw MyException(); + Data data; + data.nr = i; + return data; +} +int main(int, char **) +{ + Data data; + try { + data = getData(1); + } catch (MyException& e) { + if (data.nr != 66) + abort (); + } +} diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 315a252..ba76ae1 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1633,7 +1633,14 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref *ref) return false; if (gimple_has_lhs (stmt) - && TREE_CODE (gimple_get_lhs (stmt)) != SSA_NAME) + && TREE_CODE (gimple_get_lhs (stmt)) != SSA_NAME + /* The assignment is not necessarily carried out if it can throw + and we can catch it in the current function where we could inspect + the previous value. + ??? We only need to care about the RHS throwing. For aggregate + assignments or similar calls and non-call exceptions the LHS + might throw as well. */ + && !stmt_can_throw_internal (stmt)) { tree base, lhs = gimple_get_lhs (stmt); HOST_WIDE_INT size, offset, max_size; diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 6dc8a57..b13ef59 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -521,7 +521,14 @@ mark_aliased_reaching_defs_necessary_1 (ao_ref *ref, tree vdef, void *data) /* If the stmt lhs kills ref, then we can stop walking. */ if (gimple_has_lhs (def_stmt) - && TREE_CODE (gimple_get_lhs (def_stmt)) != SSA_NAME) + && TREE_CODE (gimple_get_lhs (def_stmt)) != SSA_NAME + /* The assignment is not necessarily carried out if it can throw + and we can catch it in the current function where we could inspect + the previous value. + ??? We only need to care about the RHS throwing. For aggregate + assignments or similar calls and non-call exceptions the LHS + might throw as well. */ + && !stmt_can_throw_internal (def_stmt)) { tree base, lhs = gimple_get_lhs (def_stmt); HOST_WIDE_INT size, offset, max_size; |