2006-05-04 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 07:44:37 +0000 (07:44 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 07:44:37 +0000 (07:44 +0000)
PR tree-optimization/26447
* tree-ssa-pre.c (realify_fake_stores): For necessary loads
produce SSA_NAME copies before the store stmt to avoid
breaking exception handling.

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

gcc/ChangeLog
gcc/tree-ssa-pre.c

index 59d7153..fda813a 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-04  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/26447
+       * tree-ssa-pre.c (realify_fake_stores): For necessary loads
+       produce SSA_NAME copies before the store stmt to avoid
+       breaking exception handling.
+
 2006-05-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/27388
index fc0dff5..38f020f 100644 (file)
@@ -3290,16 +3290,19 @@ realify_fake_stores (void)
          /* Mark the temp variable as referenced */
          add_referenced_tmp_var (SSA_NAME_VAR (TREE_OPERAND (stmt, 0)));
 
-         /* Put the new statement in GC memory, fix up the annotation
-            and SSA_NAME_DEF_STMT on it, and then put it in place of
-            the old statement in the IR stream.  */
-         newstmt = unshare_expr (stmt);
+         /* Put the new statement in GC memory, fix up the 
+            SSA_NAME_DEF_STMT on it, and then put it in place of
+            the old statement before the store in the IR stream
+            as a plain ssa name copy.  */
+         bsi = bsi_for_stmt (stmt);
+         bsi_prev (&bsi);
+         newstmt = build2 (MODIFY_EXPR, void_type_node,
+                           TREE_OPERAND (stmt, 0),
+                           TREE_OPERAND (bsi_stmt (bsi), 1));
          SSA_NAME_DEF_STMT (TREE_OPERAND (newstmt, 0)) = newstmt;
-
-         newstmt->common.ann = stmt->common.ann;
-
+         bsi_insert_before (&bsi, newstmt, BSI_SAME_STMT);
          bsi = bsi_for_stmt (stmt);
-         bsi_replace (&bsi, newstmt, true);
+         bsi_remove (&bsi, true);
        }
       else
        release_defs (stmt);