2011-05-23 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 May 2011 12:08:41 +0000 (12:08 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 May 2011 12:08:41 +0000 (12:08 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174066 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr49115.C [new file with mode: 0644]
gcc/tree-ssa-alias.c
gcc/tree-ssa-dce.c

index 25b569e..6299081 100644 (file)
@@ -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.
index c41d324..e647cb5 100644 (file)
@@ -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 (file)
index 0000000..c4cce21
--- /dev/null
@@ -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 ();
+  }
+}
index 315a252..ba76ae1 100644 (file)
@@ -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;
index 6dc8a57..b13ef59 100644 (file)
@@ -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;