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]

Deletion of dead stores


This does the optimization described in its comment below.

Wed May 31 08:07:52 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>

	* flow.c (propagate_block): If block has no successors, stores to
	frame are dead if not used.

*** flow.c	2000/05/29 22:37:37	1.295
--- flow.c	2000/05/31 11:38:33
*************** propagate_block (bb, live, local_set, fl
*** 3773,3776 ****
--- 3773,3796 ----
      }
  
+   /* 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.  */
  

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