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]

Re: Deletion of dead stores


On Wed, May 31, 2000 at 07:58:12AM -0400, Richard Kenner wrote:
> +   /* If this block has no successors, any stores to the frame that aren't
> +      used later in the block are dead.  So make a pass over the block
> +      recording any such that are made and show them dead at the end.  We do
> +      a very conservative and simple job here.  */

A good idea.  I've moved the code to the proper place, and
fixed the conditions under which we collect this information.


r~

        * flow.c (propagate_block): Move initialization of mem_set_list ...
        (init_propagate_block_info): ... here.  Also track blocks with 
        no successors; don't scan insns if ! PROP_SCAN_DEAD_CODE.

Index: flow.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/flow.c,v
retrieving revision 1.296
diff -c -p -d -r1.296 flow.c
*** flow.c	2000/05/31 11:58:35	1.296
--- flow.c	2000/05/31 22:27:38
*************** init_propagate_block_info (bb, live, loc
*** 3639,3645 ****
    /* If this block ends in a conditional branch, for each register live
       from one side of the branch and not the other, record the register
       as conditionally dead.  */
!   if (GET_CODE (bb->end) == JUMP_INSN
        && any_condjump_p (bb->end))
      {
        regset_head diff_head;
--- 3639,3646 ----
    /* If this block ends in a conditional branch, for each register live
       from one side of the branch and not the other, record the register
       as conditionally dead.  */
!   if ((flags & (PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE))
!       && GET_CODE (bb->end) == JUMP_INSN
        && any_condjump_p (bb->end))
      {
        regset_head diff_head;
*************** init_propagate_block_info (bb, live, loc
*** 3717,3722 ****
--- 3718,3748 ----
      }
  #endif
  
+   /* If this block has no successors, any stores to the frame that aren't
+      used later in the block are dead.  So make a pass over the block
+      recording any such that are made and show them dead at the end.  We do
+      a very conservative and simple job here.  */
+   if ((flags & PROP_SCAN_DEAD_CODE)
+       && (bb->succ == NULL
+           || (bb->succ->succ_next == NULL
+ 	      && bb->succ->dest == EXIT_BLOCK_PTR)))
+     {
+       rtx insn;
+       for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
+ 	if (GET_CODE (insn) == INSN
+ 	    && GET_CODE (PATTERN (insn)) == SET
+ 	    && GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
+ 	  {
+ 	    rtx mem = SET_DEST (PATTERN (insn));
+ 
+ 	    if (XEXP (mem, 0) == frame_pointer_rtx
+ 		|| (GET_CODE (XEXP (mem, 0)) == PLUS
+ 		    && XEXP (XEXP (mem, 0), 0) == frame_pointer_rtx
+ 		    && GET_CODE (XEXP (XEXP (mem, 0), 1)) == CONST_INT))
+ 	      pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
+ 	  }
+     }
+ 
    return pbi;
  }
  
*************** propagate_block (bb, live, local_set, fl
*** 3771,3796 ****
        EXECUTE_IF_SET_IN_REG_SET (live, 0, i,
  				 { REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
      }
- 
-   /* If this block has no successors, any stores to the frame that aren't
-      used later in the block are dead.  So make a pass over the block
-      recording any such that are made and show them dead at the end.  We do
-      a very conservative and simple job here.  */
-   if (bb->succ != 0 && bb->succ->succ_next == 0
-       && bb->succ->dest == EXIT_BLOCK_PTR)
-     for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
-       if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET
- 	  && GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
- 	{
- 	  rtx mem = SET_DEST (PATTERN (insn));
- 
- 	  if ((GET_CODE (XEXP (mem, 0)) == REG
- 	       && REGNO (XEXP (mem, 0)) == FRAME_POINTER_REGNUM)
- 	      || (GET_CODE (XEXP (mem, 0)) == PLUS
- 		  && GET_CODE (XEXP (XEXP (mem, 0), 0)) == REG
- 		  && REGNO (XEXP (XEXP (mem, 0), 0)) == FRAME_POINTER_REGNUM))
- 	    pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
- 	}
  
    /* Scan the block an insn at a time from end to beginning.  */
  
--- 3797,3802 ----

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