tree-cfg.c (tree_find_edge_insert_loc): Allow inserting before return_stmt.
authorJan Hubicka <jh@suse.cz>
Wed, 2 Jun 2004 21:13:55 +0000 (23:13 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 2 Jun 2004 21:13:55 +0000 (21:13 +0000)
* tree-cfg.c (tree_find_edge_insert_loc):  Allow inserting before
return_stmt.

From-SVN: r82586

gcc/ChangeLog
gcc/tree-cfg.c

index bd63a97189c7f766e0464ef5eb0e78046cd8bbcc..b851e51b2663b118f239eebd00dd2b4a60376b01 100644 (file)
@@ -1,3 +1,8 @@
+2004-06-02  Jan Hubicka  <jh@suse.cz>
+
+       * tree-cfg.c (tree_find_edge_insert_loc):  Allow inserting before
+       return_stmt.
+
 2004-06-02  Jason Merrill  <jason@redhat.com>
 
        * Makefile.in (TAGS): Don't mess with c-parse.[ch].
index e53d71c2aafa94b3cf6855c25d95b536f875b9f6..21277d86bf2920b9e7fc8179938c2ef92d4556c5 100644 (file)
@@ -2931,6 +2931,22 @@ tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi)
       tmp = bsi_stmt (*bsi);
       if (!stmt_ends_bb_p (tmp))
        return true;
+
+      /* Insert code just before returning the value.  We may need to decompose
+         the return in the case it contains non-trivial operand.  */
+      if (TREE_CODE (tmp) == RETURN_EXPR)
+        {
+         tree op = TREE_OPERAND (tmp, 0);
+         if (!is_gimple_val (op))
+           {
+             if (TREE_CODE (op) != MODIFY_EXPR)
+               abort ();
+             bsi_insert_before (bsi, op, BSI_NEW_STMT);
+             TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0);
+           }
+         bsi_prev (bsi);
+         return true;
+        }
     }
 
   /* Otherwise, create a new basic block, and split this edge.  */