diff options
| -rw-r--r-- | gcc/ChangeLog | 9 | ||||
| -rw-r--r-- | gcc/basic-block.h | 3 | ||||
| -rw-r--r-- | gcc/cfg.c | 4 | ||||
| -rw-r--r-- | gcc/function.c | 3 | ||||
| -rw-r--r-- | gcc/tree-cfg.c | 36 | ||||
| -rw-r--r-- | gcc/tree-flow.h | 1 | 
6 files changed, 37 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb42b5759fd..f88fbf4c74c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-05-13  Jan Hubicka  <jh@suse.cz> + +	* basic-block.h (FOR_ALL_BB_FN): New macro. +	(init_flow): Initialize cfg structure. +	* function.c (allocate_struct_function): Do not initialize cfg structure. +	* tree-cfg.c (init_empty_tree_cfg): Break out from ... +	(build_tree_cfg): ... here. +	* tree-flow.h (init_empty_tree_cfg): Declare. +  2005-05-12  Steven Bosscher <stevenb@suse.de>  	Fix PR tree-optimization/21520 diff --git a/gcc/basic-block.h b/gcc/basic-block.h index baca9d7e9e8..4a71d2515b6 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -444,6 +444,9 @@ extern bool rediscover_loops_after_threading;  #define FOR_ALL_BB(BB) \    for (BB = ENTRY_BLOCK_PTR; BB; BB = BB->next_bb) +#define FOR_ALL_BB_FN(BB, FN) \ +  for (BB = ENTRY_BLOCK_PTR_FOR_FUNCTION (FN); BB; BB = BB->next_bb) +  /* Special labels found during CFG build.  */  extern GTY(()) rtx label_value_list; diff --git a/gcc/cfg.c b/gcc/cfg.c index a0f326a5db7..c1cf389e69f 100644 --- a/gcc/cfg.c +++ b/gcc/cfg.c @@ -78,7 +78,9 @@ static void free_edge (edge);  void  init_flow (void)  { - +  if (!cfun->cfg) +    cfun->cfg = ggc_alloc_cleared (sizeof (struct control_flow_graph)); +  n_edges = 0;    ENTRY_BLOCK_PTR = ggc_alloc_cleared (sizeof (struct basic_block_def));    ENTRY_BLOCK_PTR->index = ENTRY_BLOCK;    EXIT_BLOCK_PTR = ggc_alloc_cleared (sizeof (struct basic_block_def)); diff --git a/gcc/function.c b/gcc/function.c index 6bc33442d7b..059886f89e1 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -3741,9 +3741,6 @@ allocate_struct_function (tree fndecl)    tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE;    cfun = ggc_alloc_cleared (sizeof (struct function)); -  cfun->cfg = ggc_alloc_cleared (sizeof (struct control_flow_graph)); - -  n_edges = 0;    cfun->stack_alignment_needed = STACK_BOUNDARY;    cfun->preferred_stack_boundary = STACK_BOUNDARY; diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 9860a29da00..9f0d1e5bac4 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -132,6 +132,26 @@ static tree find_case_label_for_value (tree, tree);  static bool phi_alternatives_equal (basic_block, edge, edge);  static bool cleanup_forwarder_blocks (void); +void +init_empty_tree_cfg (void) +{ +  /* Initialize the basic block array.  */ +  init_flow (); +  profile_status = PROFILE_ABSENT; +  n_basic_blocks = 0; +  last_basic_block = 0; +  VARRAY_BB_INIT (basic_block_info, initial_cfg_capacity, "basic_block_info"); + +  /* Build a mapping of labels to their associated blocks.  */ +  VARRAY_BB_INIT (label_to_block_map, initial_cfg_capacity, +		  "label to block map"); + +  ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR; +  EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR; + +  create_block_annotation (ENTRY_BLOCK_PTR); +  create_block_annotation (EXIT_BLOCK_PTR); +}  /*---------------------------------------------------------------------------  			      Create basic blocks @@ -146,20 +166,9 @@ build_tree_cfg (tree *tp)    /* Register specific tree functions.  */    tree_register_cfg_hooks (); -  /* Initialize the basic block array.  */ -  init_flow (); -  profile_status = PROFILE_ABSENT; -  n_basic_blocks = 0; -  last_basic_block = 0; -  VARRAY_BB_INIT (basic_block_info, initial_cfg_capacity, "basic_block_info");    memset ((void *) &cfg_stats, 0, sizeof (cfg_stats)); -  /* Build a mapping of labels to their associated blocks.  */ -  VARRAY_BB_INIT (label_to_block_map, initial_cfg_capacity, -		  "label to block map"); - -  ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR; -  EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR; +  init_empty_tree_cfg ();    found_computed_goto = 0;    make_blocks (*tp); @@ -176,9 +185,6 @@ build_tree_cfg (tree *tp)    if (n_basic_blocks == 0)      create_empty_bb (ENTRY_BLOCK_PTR); -  create_block_annotation (ENTRY_BLOCK_PTR); -  create_block_annotation (EXIT_BLOCK_PTR); -      /* Adjust the size of the array.  */    VARRAY_GROW (basic_block_info, n_basic_blocks); diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index f3e3334e342..2835c221f01 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -541,6 +541,7 @@ extern tree gimplify_build2 (block_stmt_iterator *, enum tree_code,  			     tree, tree, tree);  extern tree gimplify_build3 (block_stmt_iterator *, enum tree_code,  			     tree, tree, tree, tree); +extern void init_empty_tree_cfg (void);  /* In tree-pretty-print.c.  */  extern void dump_generic_bb (FILE *, basic_block, int, int);  | 

