re PR middle-end/39625 (Revision 145338 breaks ability to build Ada)
authorRichard Guenther <rguenther@suse.de>
Thu, 16 Apr 2009 10:45:18 +0000 (10:45 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 16 Apr 2009 10:45:18 +0000 (10:45 +0000)
2009-04-16  Richard Guenther  <rguenther@suse.de>

PR middle-end/39625
* tree-cfg.c (make_blocks): Split statements with to-be
abnormal SSA names on the lhs.

From-SVN: r146168

gcc/ChangeLog
gcc/tree-cfg.c

index 66374e5..f04bbcf 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-16  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/39625
+       * tree-cfg.c (make_blocks): Split statements with to-be
+       abnormal SSA names on the lhs.
+
 2009-04-16  Paolo Bonzini  <bonzini@gnu.org>
 
        * c-common.c (vector_targets_convertible_p, vector_types_convertible_p):
index 6c5eb87..447e6cf 100644 (file)
@@ -375,7 +375,29 @@ make_blocks (gimple_seq seq)
       /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
         next iteration.  */
       if (stmt_ends_bb_p (stmt))
-       start_new_block = true;
+       {
+         /* If the stmt can make abnormal goto use a new temporary
+            for the assignment to the LHS.  This makes sure the old value
+            of the LHS is available on the abnormal edge.  Otherwise
+            we will end up with overlapping life-ranges for abnormal
+            SSA names.  */
+         if (gimple_has_lhs (stmt)
+             && stmt_can_make_abnormal_goto (stmt)
+             && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
+           {
+             tree lhs = gimple_get_lhs (stmt);
+             tree tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
+             gimple s = gimple_build_assign (lhs, tmp);
+             gimple_set_location (s, gimple_location (stmt));
+             gimple_set_block (s, gimple_block (stmt));
+             gimple_set_lhs (stmt, tmp);
+             if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+                 || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+               DECL_GIMPLE_REG_P (tmp) = 1;
+             gsi_insert_after (&i, s, GSI_SAME_STMT);
+           }
+         start_new_block = true;
+       }
 
       gsi_next (&i);
       first_stmt_of_seq = false;