------- Comment #7 from amacleod at redhat dot com  2006-07-27 16:35 -------
There is always the danger of losing track of exceptions.

Another option is to create an inline routine in tree-flow-inline.h which does
what you lay out, and then change set_bb_for_stmt to call it, looking something
like:

Index: tree-cfg.c
===================================================================
*** tree-cfg.c  (revision 114853)
--- tree-cfg.c  (working copy)
*************** set_bb_for_stmt (tree t, basic_block bb)
*** 2741,2749 ****
      }
    else
      {
-       stmt_ann_t ann = get_stmt_ann (t);
-       ann->bb = bb;
-
        /* If the statement is a label, add the label to block-to-labels map
          so that we can speed up edge creation for GOTO_EXPRs.  */
        if (TREE_CODE (t) == LABEL_EXPR)
--- 2741,2746 ----
*************** set_bb_for_stmt (tree t, basic_block bb)
*** 2773,2780 ****
                removed it from the old block.  */
            gcc_assert (!bb
                        || !VEC_index (basic_block, label_to_block_map, uid));
-         VEC_replace (basic_block, label_to_block_map, uid, bb);
        }
      }
  }

--- 2770,2777 ----
                removed it from the old block.  */
            gcc_assert (!bb
                        || !VEC_index (basic_block, label_to_block_map, uid));
        }
+       set_bb_for_tree_stmt_raw (t, bb);
      }
  }


>From a quick glance it doesnt appear that changing the order like that is
significant, and then everything is still done in one place.

It'd probably be worthwhile to add gcc_assert()'s with ENABLE_CHECKING that the
tree passed to the new inline routine isn't a STMT_LIST or a PHI_NODE, and
maybe if it is a LABEL_EXPR, that the uid isn't -1... just to confirm 
everything is kosher :-)


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28480

Reply via email to