OSDN Git Service

PR middle-end/30509
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 25 Feb 2007 18:11:20 +0000 (18:11 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 25 Feb 2007 18:11:20 +0000 (18:11 +0000)
* tree-inline.c (copy_bb): Produce exact copy of EH info when copying for inlining.

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

gcc/ChangeLog
gcc/tree-inline.c

index 6aa21b5..cc9e79e 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-24  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/30509
+       * tree-inline.c (copy_bb): Produce exact copy of EH info when copying for inlining.
+
 2007-02-24  Uros Bizjak  <ubizjak@gmail.com>
            Jan Hubicka  <jh@suse.cz>
 
 2007-02-24  Uros Bizjak  <ubizjak@gmail.com>
            Jan Hubicka  <jh@suse.cz>
 
index 27d985e..349d109 100644 (file)
@@ -873,7 +873,20 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scal
              gcc_assert (lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt)
                          != 0);
 
              gcc_assert (lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt)
                          != 0);
 
-             if (tree_could_throw_p (stmt))
+             if (tree_could_throw_p (stmt)
+                 /* When we are cloning for inlining, we are supposed to
+                    construct a clone that calls precisely the same functions
+                    as original.  However IPA optimizers might've proved
+                    earlier some function calls as non-trapping that might
+                    render some basic blocks dead that might become
+                    unreachable.
+
+                    We can't update SSA with unreachable blocks in CFG and thus
+                    we prevent the scenario by preserving even the "dead" eh
+                    edges until the point they are later removed by
+                    fixup_cfg pass.  */
+                 || (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES
+                     && lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt) > 0))
                {
                  int region = lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt);
                  /* Add an entry for the copied tree in the EH hashtable.
                {
                  int region = lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt);
                  /* Add an entry for the copied tree in the EH hashtable.