This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[tree-profiling] Pre-inline optimizations


Hi,
this patch makes it possible to execute optimizations early (ie before IPA is
performed).  At the moment we do that by going into SSA and leaving back, but
in longer run it would be nice to stay in SSA form assuming that memory
consumption issues are addressed somehow.

At the moment the passes are enabled at -O2 that is bit too expensive (the
compilation time cost is about 10% that is surprisingly lot), but I would like
to give it a testing.  For SPEC I was able to measure over 1% speedup on -O3
-fwhole-program compilation, most of speedup comming from gzip, it also speeds
up tramp3d by roughtly 20% and is neutral to Gerald's application.  I plan to
investigate the performance of this patch in more detail once we resolve the
inliner heuristics issues being discussed with Richard and I hope significance
of this patch to grow up in near future with more strong IPA so it will become
worthwhile for -O3 at least.

Bootstrapped/regtested i686-pc-gnu-linux and installed to tree-profiling branch.

Honza

2005-03-03  Jan Hubicka  <jh@suse.cz>
	* cgraphunit.c (cgraph_analyze_function): Initialize bitmap obstack.
	* tree-ssa-dce.c (eliminate_unnecessary_stmts): Return true when
	something is elliminated.
	(perform_tree_ssa_dce): Delete unreachable blocks for cddce.
	* common.opt (fearly-optimizations): New flag.
	* opts.c (decode_options): Enable at -O2.
	* passes.c (pass_rest_of_compilation): Kill CFG.
	* sched-rgn.c (compute_trg_info): Silence uninitialized warning.
	* tree-flow-inline.h (mark_call_clobbered): New sanity check.
	* tree-optimize.c (gate_early_optimizations): New function.
	(pass_all_early_optimizations): New pass.
	(execute_free_cfg_annotations): Break out from ...
	(execute_free_datastructures): here; do not mess up with stmts list;
	free
	dominance info.
	(pass_cfg_annotations): New pass.
	(init_tree_optimization_passes): Add new passes.
	(tree_early_local_passes): Temporarily disable TER.
	(tree_rest_of_compilation): Do not allocate vars_to_rename.
	* tree-ssa-operands.c (free_ssa_operands): Export.
	* tree-ssa-operands.h (free_ssa_operands): Declare.
	* tree-ssa.c (delete_tree_ssa): Kill the operands and phi nodes too; do
	not kill
	* tree-ssanames.c (release_defs): Kill addreses_taken and ssa operands.
	annotations.
Index: cgraphunit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cgraphunit.c,v
retrieving revision 1.1.4.35.2.43
diff -c -3 -p -r1.1.4.35.2.43 cgraphunit.c
*** cgraphunit.c	1 Mar 2005 23:07:34 -0000	1.1.4.35.2.43
--- cgraphunit.c	1 Mar 2005 23:58:41 -0000
*************** cgraph_analyze_function (struct cgraph_n
*** 803,814 ****
--- 803,816 ----
  
    node->count = ENTRY_BLOCK_PTR->count;
  
+   bitmap_obstack_initialize (NULL);
    if (optimize)
      flow_loops_find (&loops, LOOP_TREE);
    cgraph_create_edges (node, decl);
    if (optimize)
      flow_loops_free (&loops);
    free_dominance_info (CDI_DOMINATORS);
+   bitmap_obstack_release (NULL);
  
    /* Only optimization we do in non-unit-at-a-time mode is inlining.  We don't
       use the passmanager then and instead call it directly.  Since we probably
Index: tree-ssa-dce.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-dce.c,v
retrieving revision 1.1.2.78.2.15
diff -c -3 -p -r1.1.2.78.2.15 tree-ssa-dce.c
*** tree-ssa-dce.c	16 Dec 2004 01:20:27 -0000	1.1.2.78.2.15
--- tree-ssa-dce.c	2 Feb 2005 08:38:53 -0000
*************** static void find_obviously_necessary_stm
*** 122,128 ****
  static void mark_control_dependent_edges_necessary (basic_block, struct edge_list *);
  static void propagate_necessity (struct edge_list *);
  
! static void eliminate_unnecessary_stmts (void);
  static void remove_dead_phis (basic_block);
  static void remove_dead_stmt (block_stmt_iterator *, basic_block);
  
--- 122,128 ----
  static void mark_control_dependent_edges_necessary (basic_block, struct edge_list *);
  static void propagate_necessity (struct edge_list *);
  
! static bool eliminate_unnecessary_stmts (void);
  static void remove_dead_phis (basic_block);
  static void remove_dead_stmt (block_stmt_iterator *, basic_block);
  
*************** mark_really_necessary_kill_operand_phis 
*** 694,704 ****
  /* Eliminate unnecessary statements. Any instruction not marked as necessary
     contributes nothing to the program, and can be deleted.  */
  
! static void
  eliminate_unnecessary_stmts (void)
  {
    basic_block bb;
    block_stmt_iterator i;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
      fprintf (dump_file, "\nEliminating unnecessary statements:\n");
--- 694,705 ----
  /* Eliminate unnecessary statements. Any instruction not marked as necessary
     contributes nothing to the program, and can be deleted.  */
  
! static bool
  eliminate_unnecessary_stmts (void)
  {
    basic_block bb;
    block_stmt_iterator i;
+   bool modified = false;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
      fprintf (dump_file, "\nEliminating unnecessary statements:\n");
*************** eliminate_unnecessary_stmts (void)
*** 718,724 ****
  
           /* If `i' is not necessary then remove it.  */
           if (! NECESSARY (t))
!            remove_dead_stmt (&i, bb);
           else
             {
               tree call = get_call_expr_in (t);
--- 719,728 ----
  
           /* If `i' is not necessary then remove it.  */
           if (! NECESSARY (t))
! 	   {
!              modified = true;
! 	     remove_dead_stmt (&i, bb);
! 	   }
           else
             {
               tree call = get_call_expr_in (t);
*************** eliminate_unnecessary_stmts (void)
*** 727,734 ****
               bsi_next (&i);
             }
  	}
      }
!  }
  
  /* Remove dead PHI nodes from block BB.  */
  
--- 731,742 ----
               bsi_next (&i);
             }
  	}
+       bb->flags &= ~BB_VISITED;
      }
!   ENTRY_BLOCK_PTR->flags &= ~BB_VISITED;
!   EXIT_BLOCK_PTR->flags &= ~BB_VISITED;
!   return modified;
! }
  
  /* Remove dead PHI nodes from block BB.  */
  
*************** static void
*** 928,933 ****
--- 936,942 ----
  perform_tree_ssa_dce (bool aggressive)
  {
    struct edge_list *el = NULL;
+   bool modified;
  
    tree_dce_init (aggressive);
  
*************** perform_tree_ssa_dce (bool aggressive)
*** 948,954 ****
    propagate_necessity (el);
  
    mark_really_necessary_kill_operand_phis ();
!   eliminate_unnecessary_stmts ();
  
    if (aggressive)
      free_dominance_info (CDI_POST_DOMINATORS);
--- 957,963 ----
    propagate_necessity (el);
  
    mark_really_necessary_kill_operand_phis ();
!   modified = eliminate_unnecessary_stmts ();
  
    if (aggressive)
      free_dominance_info (CDI_POST_DOMINATORS);
*************** perform_tree_ssa_dce (bool aggressive)
*** 959,964 ****
--- 968,978 ----
  
    tree_dce_done (aggressive);
  
+   /* Fixing def-def chains needs to build dominance tree that requires
+      all basic blocks reachable.  */
+   if (aggressive && modified)
+     delete_unreachable_blocks ();
+ 
    free_edge_list (el);
  }
  
Index: common.opt
===================================================================
RCS file: /cvs/gcc/gcc/gcc/common.opt,v
retrieving revision 1.14.2.20.2.20
diff -c -3 -p -r1.14.2.20.2.20 common.opt
*** common.opt	1 Mar 2005 23:07:38 -0000	1.14.2.20.2.20
--- common.opt	1 Mar 2005 23:58:41 -0000
*************** fdump-unnumbered
*** 344,349 ****
--- 344,353 ----
  Common Report Var(flag_dump_unnumbered) VarExists
  Suppress output of instruction numbers and line number notes in debugging dumps
  
+ fearly-optimizations
+ Common Report Var(flag_early_optimizations)
+ Perform early optimizations
+ 
  feliminate-dwarf2-dups
  Common Report Var(flag_eliminate_dwarf2_dups)
  Perform DWARF2 duplicate elimination
Index: opts.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/opts.c,v
retrieving revision 1.31.2.28.2.22
diff -c -3 -p -r1.31.2.28.2.22 opts.c
*** opts.c	1 Mar 2005 23:08:05 -0000	1.31.2.28.2.22
--- opts.c	1 Mar 2005 23:58:41 -0000
*************** decode_options (unsigned int argc, const
*** 524,529 ****
--- 524,530 ----
        flag_strength_reduce = 1;
        flag_rerun_cse_after_loop = 1;
        flag_rerun_loop_opt = 1;
+       flag_early_optimizations = 1;
        flag_caller_saves = 1;
        flag_force_mem = 1;
        flag_peephole2 = 1;
Index: passes.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/passes.c,v
retrieving revision 2.2.4.24
diff -c -3 -p -r2.2.4.24 passes.c
*** passes.c	1 Mar 2005 23:08:05 -0000	2.2.4.24
--- passes.c	1 Mar 2005 23:58:41 -0000
*************** struct tree_opt_pass pass_rest_of_compil
*** 1781,1787 ****
    TV_REST_OF_COMPILATION,               /* tv_id */
    PROP_rtl,		                /* properties_required */
    0,                                    /* properties_provided */
!   PROP_rtl,                             /* properties_destroyed */
    0,                                    /* todo_flags_start */
    TODO_ggc_collect,			/* todo_flags_finish */
    0					/* letter */
--- 1781,1787 ----
    TV_REST_OF_COMPILATION,               /* tv_id */
    PROP_rtl,		                /* properties_required */
    0,                                    /* properties_provided */
!   PROP_rtl | PROP_cfg,                  /* properties_destroyed */
    0,                                    /* todo_flags_start */
    TODO_ggc_collect,			/* todo_flags_finish */
    0					/* letter */
Index: sched-rgn.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/sched-rgn.c,v
retrieving revision 1.46.2.17.2.11
diff -c -3 -p -r1.46.2.17.2.11 sched-rgn.c
*** sched-rgn.c	12 Feb 2005 14:33:15 -0000	1.46.2.17.2.11
--- sched-rgn.c	1 Mar 2005 23:58:41 -0000
*************** compute_trg_info (int trg)
*** 994,999 ****
--- 994,1002 ----
    edge_iterator ei;
    edge e;
  
+   el.nr_members = 0;
+   el.first_member = 0;
+ 
    /* Define some of the fields for the target bb as well.  */
    sp = candidate_table + trg;
    sp->is_valid = 1;
Index: tree-flow-inline.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-flow-inline.h,v
retrieving revision 1.1.2.66.2.11
diff -c -3 -p -r1.1.2.66.2.11 tree-flow-inline.h
*** tree-flow-inline.h	12 Feb 2005 14:33:25 -0000	1.1.2.66.2.11
--- tree-flow-inline.h	1 Mar 2005 23:58:42 -0000
*************** static inline void
*** 614,619 ****
--- 614,623 ----
  mark_call_clobbered (tree var)
  {
    var_ann_t ann = var_ann (var);
+ 
+ #ifdef ENABLE_CHECKING
+   gcc_assert (!is_gimple_reg (var));
+ #endif
    /* If VAR is a memory tag, then we need to consider it a global
       variable.  This is because the pointer that VAR represents has
       been found to point to either an arbitrary location or to a known
Index: tree-optimize.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-optimize.c,v
retrieving revision 1.1.4.122.2.38
diff -c -3 -p -r1.1.4.122.2.38 tree-optimize.c
*** tree-optimize.c	1 Mar 2005 23:08:11 -0000	1.1.4.122.2.38
--- tree-optimize.c	1 Mar 2005 23:58:42 -0000
*************** static struct tree_opt_pass pass_all_opt
*** 138,143 ****
--- 138,172 ----
    0					/* letter */
  };
  
+ /* Gate: execute, or not, all of the early optimizations.  */
+ 
+ static bool
+ gate_early_optimizations (void)
+ {
+   return (flag_early_optimizations
+ 	  /* Don't bother doing anything if the program has errors.  */
+ 	  && !(errorcount || sorrycount));
+ }
+ 
+ static struct tree_opt_pass pass_all_early_optimizations =
+ {
+   NULL,					/* name */
+   gate_early_optimizations,		/* gate */
+   NULL, NULL,				/* IPA analysis */
+   NULL,					/* execute */
+   NULL, NULL,				/* IPA modification */
+   NULL,					/* sub */
+   NULL,					/* next */
+   0,					/* static_pass_number */
+   0,					/* tv_id */
+   0,					/* properties_required */
+   0,					/* properties_provided */
+   0,					/* properties_destroyed */
+   0,					/* todo_flags_start */
+   0,					/* todo_flags_finish */
+   0					/* letter */
+ };
+ 
  /* Pass: cleanup the CFG just before expanding trees to RTL.
     This is just a round of label cleanups and case node grouping
     because after the tree optimizers have run such cleanups may
*************** static struct tree_opt_pass pass_cleanup
*** 176,194 ****
  static void
  execute_free_datastructures (void)
  {
-   tree *chain;
- 
    /* ??? This isn't the right place for this.  Worse, it got computed
       more or less at random in various passes.  */
    free_dominance_info (CDI_DOMINATORS);
! 
!   /* Emit gotos for implicit jumps.  */
!   disband_implicit_edges ();
  
    /* Remove the ssa structures.  Do it here since this includes statement
       annotations that need to be intact during disband_implicit_edges.  */
    delete_tree_ssa ();
  
    /* Re-chain the statements from the blocks.  */
    chain = &DECL_SAVED_TREE (current_function_decl);
    *chain = alloc_stmt_list ();
--- 205,263 ----
  static void
  execute_free_datastructures (void)
  {
    /* ??? This isn't the right place for this.  Worse, it got computed
       more or less at random in various passes.  */
    free_dominance_info (CDI_DOMINATORS);
!   free_dominance_info (CDI_POST_DOMINATORS);
  
    /* Remove the ssa structures.  Do it here since this includes statement
       annotations that need to be intact during disband_implicit_edges.  */
    delete_tree_ssa ();
  
+   BITMAP_FREE (vars_to_rename);
+   vars_to_rename = NULL;
+ }
+ 
+ static struct tree_opt_pass pass_free_datastructures =
+ {
+   NULL,					/* name */
+   NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
+   execute_free_datastructures,			/* execute */
+   NULL, NULL,				/* IPA modification */
+   NULL,					/* sub */
+   NULL,					/* next */
+   0,					/* static_pass_number */
+   0,					/* tv_id */
+   PROP_cfg,				/* properties_required */
+   0,					/* properties_provided */
+   0,					/* properties_destroyed */
+   0,					/* todo_flags_start */
+   0,					/* todo_flags_finish */
+   0					/* letter */
+ };
+ 
+ /* Pass: free cfg annotations.  */
+ 
+ static void
+ execute_free_cfg_annotations (void)
+ {
+   tree *chain;
+   basic_block bb;
+   block_stmt_iterator bsi;
+ 
+   /* Emit gotos for implicit jumps.  */
+   disband_implicit_edges ();
+ 
+   /* Remove annotations from every tree in the function.  */
+   FOR_EACH_BB (bb)
+     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+       {
+ 	tree stmt = bsi_stmt (bsi);
+ 	ggc_free (stmt->common.ann);
+ 	stmt->common.ann = NULL;
+       }
+ 
    /* Re-chain the statements from the blocks.  */
    chain = &DECL_SAVED_TREE (current_function_decl);
    *chain = alloc_stmt_list ();
*************** execute_free_datastructures (void)
*** 197,208 ****
    delete_tree_cfg_annotations ();
  }
  
! static struct tree_opt_pass pass_free_datastructures =
  {
    NULL,					/* name */
    NULL,					/* gate */
    NULL, NULL,				/* IPA analysis */
!   execute_free_datastructures,			/* execute */
    NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
--- 266,277 ----
    delete_tree_cfg_annotations ();
  }
  
! static struct tree_opt_pass pass_free_cfg_annotations =
  {
    NULL,					/* name */
    NULL,					/* gate */
    NULL, NULL,				/* IPA analysis */
!   execute_free_cfg_annotations,		/* execute */
    NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
*************** execute_init_datastructures (void)
*** 225,230 ****
--- 294,300 ----
  {
    /* Allocate hash tables, arrays and other structures.  */
    init_tree_ssa ();
+   vars_to_rename = BITMAP_ALLOC (NULL);
  }
  
  static struct tree_opt_pass pass_init_datastructures =
*************** init_tree_optimization_passes (void)
*** 388,397 ****
    NEXT_PASS (pass_pre_expand);
    *p = NULL;
  
!   /* Optimizations passes run before the intraprocedural passes are done.  */
    p = &all_early_local_passes;
    NEXT_PASS (pass_tree_profile); 
    NEXT_PASS (pass_cleanup_cfg);
    *p = NULL;
  
    /* Intraprocedural optimization passes.  */
--- 458,487 ----
    NEXT_PASS (pass_pre_expand);
    *p = NULL;
  
!   /* Optimizations passes run before the intraprocedural passes are done.
!      We simply do subset of local passes done later (those likely helping IPA
!      a most all gated by the flag_early_optimizations).  We do cleanup_cfg
!      unconditionally as it always reduce memory footprint and save compilation
!      time.  */
    p = &all_early_local_passes;
    NEXT_PASS (pass_tree_profile); 
    NEXT_PASS (pass_cleanup_cfg);
+   NEXT_PASS (pass_all_early_optimizations);
+   *p = NULL;
+ 
+   p = &pass_all_early_optimizations.sub;
+   NEXT_PASS (pass_init_datastructures);
+   NEXT_PASS (pass_referenced_vars);
+   NEXT_PASS (pass_lower_memref);
+   NEXT_PASS (pass_build_ssa);
+   NEXT_PASS (pass_may_alias);
+   NEXT_PASS (pass_dce);
+   NEXT_PASS (pass_dominator);
+   NEXT_PASS (pass_redundant_phi);
+   NEXT_PASS (pass_tail_recursion);
+   NEXT_PASS (pass_del_ssa);
+   NEXT_PASS (pass_cleanup_cfg);
+   NEXT_PASS (pass_free_datastructures);
    *p = NULL;
  
    /* Intraprocedural optimization passes.  */
*************** init_tree_optimization_passes (void)
*** 410,415 ****
--- 504,510 ----
    NEXT_PASS (pass_lower_memref);
    NEXT_PASS (pass_mudflap_2);
    NEXT_PASS (pass_free_datastructures);
+   NEXT_PASS (pass_free_cfg_annotations);
    NEXT_PASS (pass_expand);
    NEXT_PASS (pass_rest_of_compilation);
    *p = NULL;
*************** void
*** 721,738 ****
--- 823,848 ----
  tree_early_local_passes (tree fn)
  {
    tree saved_current_function_decl = current_function_decl;
+   int saved_flag_tree_ter = flag_tree_ter;
  
+   /* Leaving GIMPLE in out-of-ssa pass does no good.  */
+   flag_tree_ter = 0;
    current_function_decl = fn;
    push_cfun (DECL_STRUCT_FUNCTION (fn));
    bitmap_obstack_initialize (NULL);
    tree_register_cfg_hooks ();
    execute_pass_list (all_early_local_passes, EXECUTE_HOOK, NULL, NULL);
+ #ifndef ENABLE_CHECKING
+   verify_stmts ();
+   verify_flow_info ();
+ #endif
    free_dominance_info (CDI_DOMINATORS);
    free_dominance_info (CDI_POST_DOMINATORS);
    compact_blocks ();
    current_function_decl = saved_current_function_decl;
    bitmap_obstack_release (NULL);
    pop_cfun ();
+   flag_tree_ter = saved_flag_tree_ter;
  }
  
  void
*************** tree_rest_of_compilation (tree fndecl)
*** 831,838 ****
    bitmap_obstack_initialize (NULL);
    bitmap_obstack_initialize (&reg_obstack); /* FIXME, only at RTL generation*/
    
-   vars_to_rename = BITMAP_ALLOC (NULL);
-   
    /* Perform all tree transforms and optimizations.  */
    ipa_modify_function (cgraph_node (fndecl));
    execute_pass_list (all_passes, EXECUTE_HOOK, NULL, NULL);
--- 941,946 ----
Index: tree-ssa-operands.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-operands.c,v
retrieving revision 1.1.2.9.2.21
diff -c -3 -p -r1.1.2.9.2.21 tree-ssa-operands.c
*** tree-ssa-operands.c	1 Mar 2005 23:08:14 -0000	1.1.2.9.2.21
--- tree-ssa-operands.c	1 Mar 2005 23:58:42 -0000
*************** build_ssa_operands (tree stmt, stmt_ann_
*** 977,983 ****
  
  /* Free any operands vectors in OPS.  */
  
! static void 
  free_ssa_operands (stmt_operands_p ops)
  {
    if (ops->def_ops)
--- 977,983 ----
  
  /* Free any operands vectors in OPS.  */
  
! void 
  free_ssa_operands (stmt_operands_p ops)
  {
    if (ops->def_ops)
Index: tree-ssa-operands.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-operands.h,v
retrieving revision 1.1.2.2.4.5
diff -c -3 -p -r1.1.2.2.4.5 tree-ssa-operands.h
*** tree-ssa-operands.h	12 Feb 2005 14:33:35 -0000	1.1.2.2.4.5
--- tree-ssa-operands.h	1 Mar 2005 23:58:42 -0000
*************** typedef stmt_operands_t *stmt_operands_p
*** 182,187 ****
--- 182,188 ----
  
  extern void init_ssa_operands (void);
  extern void fini_ssa_operands (void);
+ extern void free_ssa_operands (stmt_operands_p);
  extern void get_stmt_operands (tree);
  extern void copy_virtual_operands (tree, tree);
  extern void create_ssa_artficial_load_stmt (stmt_operands_p, tree);
Index: tree-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa.c,v
retrieving revision 1.1.4.199.2.19
diff -c -3 -p -r1.1.4.199.2.19 tree-ssa.c
*** tree-ssa.c	1 Mar 2005 23:08:15 -0000	1.1.4.199.2.19
--- tree-ssa.c	1 Mar 2005 23:58:42 -0000
*************** delete_tree_ssa (void)
*** 736,750 ****
    basic_block bb;
    block_stmt_iterator bsi;
  
-   /* Remove annotations from every tree in the function.  */
    FOR_EACH_BB (bb)
!     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
!       {
! 	tree stmt = bsi_stmt (bsi);
!         release_defs (stmt);
! 	ggc_free (stmt->common.ann);
! 	stmt->common.ann = NULL;
!       }
  
    /* Remove annotations from every referenced variable.  */
    if (referenced_vars)
--- 736,747 ----
    basic_block bb;
    block_stmt_iterator bsi;
  
    FOR_EACH_BB (bb)
!     {
!       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
! 	release_defs (bsi_stmt (bsi));
!       set_phi_nodes (bb, NULL);
!     }
  
    /* Remove annotations from every referenced variable.  */
    if (referenced_vars)
Index: tree-ssanames.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssanames.c,v
retrieving revision 1.1.2.6.4.7
diff -c -3 -p -r1.1.2.6.4.7 tree-ssanames.c
*** tree-ssanames.c	1 Mar 2005 23:08:15 -0000	1.1.2.6.4.7
--- tree-ssanames.c	1 Mar 2005 23:58:42 -0000
*************** release_defs (tree stmt)
*** 309,314 ****
--- 309,317 ----
    FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
      if (TREE_CODE (def) == SSA_NAME)
        release_ssa_name (def);
+   stmt_ann(stmt)->addresses_taken = NULL;
+   free_ssa_operands (&stmt_ann (stmt)->operands);
+   modify_stmt (stmt);
  }
  
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]