[RFC] third liveness pass

Jan Hubicka jh@suse.cz
Mon May 27 00:33:00 GMT 2002


> 
> How can we, when the local property is dependent on which
> insns are deleted as dead code?

Andreas just benchmarked the attached patch to disable dead store
removal when not explicitly asked for (and we do that twice now).
It looks like the dead store removal is by far the most expensive part
of flow, so the attached patch cuts bootstrap time by about 1%.

Honza

Mon May 27 08:57:35 CEST 2002  Jan Hubicka  <jh@suse.cz>
	* basic-block.h (PEOP_SCAN_DEAD_STORES): New.
	(PROP_FINAL): Include.
	* flow.c (life_analysis, update_life_info,
	init_propagate_block_info, mark_set_1, mark_used_rgs):
	Support SCAN_DEAD_STORE.
Index: basic-block.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/basic-block.h,v
retrieving revision 1.145
diff -c -3 -p -r1.145 basic-block.h
*** basic-block.h	23 May 2002 15:22:04 -0000	1.145
--- basic-block.h	26 May 2002 19:01:18 -0000
*************** enum update_life_extent
*** 582,588 ****
  					   by dead code removal.  */
  #define PROP_AUTOINC		64	/* Create autoinc mem references.  */
  #define PROP_EQUAL_NOTES	128	/* Take into account REG_EQUAL notes.  */
! #define PROP_FINAL		127	/* All of the above.  */
  
  #define CLEANUP_EXPENSIVE	1	/* Do relativly expensive optimizations
  					   except for edge forwarding */
--- 582,593 ----
  					   by dead code removal.  */
  #define PROP_AUTOINC		64	/* Create autoinc mem references.  */
  #define PROP_EQUAL_NOTES	128	/* Take into account REG_EQUAL notes.  */
! #define PROP_SCAN_DEAD_STORES	256	/* Scan for dead code.  */
! #define PROP_FINAL		(PROP_DEATH_NOTES | PROP_LOG_LINKS  \
! 				 | PROP_REG_INFO | PROP_KILL_DEAD_CODE  \
! 				 | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
! 				 | PROP_ALLOW_CFG_CHANGES \
! 				 | PROP_SCAN_DEAD_STORES)
  
  #define CLEANUP_EXPENSIVE	1	/* Do relativly expensive optimizations
  					   except for edge forwarding */

Index: flow.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/flow.c,v
retrieving revision 1.524
diff -c -3 -p -r1.524 flow.c
*** flow.c	23 May 2002 19:23:40 -0000	1.524
--- flow.c	26 May 2002 19:05:08 -0000
*************** life_analysis (f, file, flags)
*** 447,453 ****
      flags &= ~(PROP_REG_INFO | PROP_AUTOINC);
  
    /* We want alias analysis information for local dead store elimination.  */
!   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
      init_alias_analysis ();
  
    /* Always remove no-op moves.  Do this before other processing so
--- 447,453 ----
      flags &= ~(PROP_REG_INFO | PROP_AUTOINC);
  
    /* We want alias analysis information for local dead store elimination.  */
!   if (optimize && (flags & PROP_SCAN_DEAD_STORES))
      init_alias_analysis ();
  
    /* Always remove no-op moves.  Do this before other processing so
*************** life_analysis (f, file, flags)
*** 477,483 ****
    update_life_info (NULL, UPDATE_LIFE_GLOBAL, flags);
  
    /* Clean up.  */
!   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
      end_alias_analysis ();
  
    if (file)
--- 477,483 ----
    update_life_info (NULL, UPDATE_LIFE_GLOBAL, flags);
  
    /* Clean up.  */
!   if (optimize && (flags & PROP_SCAN_DEAD_STORES))
      end_alias_analysis ();
  
    if (file)
*************** update_life_info (blocks, extent, prop_f
*** 646,651 ****
--- 646,652 ----
  
  	  calculate_global_regs_live (blocks, blocks,
  				prop_flags & (PROP_SCAN_DEAD_CODE
+ 					      | PROP_SCAN_DEAD_STORES
  					      | PROP_ALLOW_CFG_CHANGES));
  
  	  if ((prop_flags & (PROP_KILL_DEAD_CODE | PROP_ALLOW_CFG_CHANGES))
*************** update_life_info (blocks, extent, prop_f
*** 659,664 ****
--- 660,666 ----
  	      COPY_REG_SET (tmp, bb->global_live_at_end);
  	      changed |= propagate_block (bb, tmp, NULL, NULL,
  				prop_flags & (PROP_SCAN_DEAD_CODE
+ 					      | PROP_SCAN_DEAD_STORES
  					      | PROP_KILL_DEAD_CODE));
  	    }
  
*************** update_life_info (blocks, extent, prop_f
*** 667,673 ****
  	     removing dead code can affect global register liveness, which
  	     is supposed to be finalized for this call after this loop.  */
  	  stabilized_prop_flags
! 	    &= ~(PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE);
  
  	  if (! changed)
  	    break;
--- 669,676 ----
  	     removing dead code can affect global register liveness, which
  	     is supposed to be finalized for this call after this loop.  */
  	  stabilized_prop_flags
! 	    &= ~(PROP_SCAN_DEAD_CODE | PROP_SCAN_DEAD_STORES
! 		 | PROP_KILL_DEAD_CODE);
  
  	  if (! changed)
  	    break;
*************** init_propagate_block_info (bb, live, loc
*** 1922,1928 ****
        && ! (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
  	    && (TYPE_RETURNS_STACK_DEPRESSED
  		(TREE_TYPE (current_function_decl))))
!       && (flags & PROP_SCAN_DEAD_CODE)
        && (bb->succ == NULL
  	  || (bb->succ->succ_next == NULL
  	      && bb->succ->dest == EXIT_BLOCK_PTR
--- 1925,1931 ----
        && ! (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
  	    && (TYPE_RETURNS_STACK_DEPRESSED
  		(TREE_TYPE (current_function_decl))))
!       && (flags & PROP_SCAN_DEAD_STORES)
        && (bb->succ == NULL
  	  || (bb->succ->succ_next == NULL
  	      && bb->succ->dest == EXIT_BLOCK_PTR
*************** mark_set_1 (pbi, code, reg, cond, insn, 
*** 2609,2615 ****
  
    /* If this set is a MEM, then it kills any aliased writes.
       If this set is a REG, then it kills any MEMs which use the reg.  */
!   if (optimize && (flags & PROP_SCAN_DEAD_CODE))
      {
        if (GET_CODE (reg) == REG)
  	invalidate_mems_from_set (pbi, reg);
--- 2612,2618 ----
  
    /* If this set is a MEM, then it kills any aliased writes.
       If this set is a REG, then it kills any MEMs which use the reg.  */
!   if (optimize && (flags & PROP_SCAN_DEAD_STORES))
      {
        if (GET_CODE (reg) == REG)
  	invalidate_mems_from_set (pbi, reg);
*************** mark_used_regs (pbi, x, cond, insn)
*** 3712,3718 ****
      case MEM:
        /* Don't bother watching stores to mems if this is not the
  	 final pass.  We'll not be deleting dead stores this round.  */
!       if (optimize && (flags & PROP_SCAN_DEAD_CODE))
  	{
  	  /* Invalidate the data for the last MEM stored, but only if MEM is
  	     something that can be stored into.  */
--- 3715,3721 ----
      case MEM:
        /* Don't bother watching stores to mems if this is not the
  	 final pass.  We'll not be deleting dead stores this round.  */
!       if (optimize && (flags & PROP_SCAN_DEAD_STORES))
  	{
  	  /* Invalidate the data for the last MEM stored, but only if MEM is
  	     something that can be stored into.  */



More information about the Gcc-patches mailing list