OSDN Git Service

* flow.c (propagate_block): Move initialization of mem_set_list ...
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 May 2000 22:29:38 +0000 (22:29 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 May 2000 22:29:38 +0000 (22:29 +0000)
        (init_propagate_block_info): ... here.  Also track blocks with
        no successors; don't scan insns if ! PROP_SCAN_DEAD_CODE.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34310 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/flow.c

index 59870df..aea8ddb 100644 (file)
@@ -1,5 +1,11 @@
 2000-05-31  Richard Henderson  <rth@cygnus.com>
 
+       * 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.
+
+2000-05-31  Richard Henderson  <rth@cygnus.com>
+
        * jump.c (jump_optimize_1): Revert 05-18 change.
 
 2000-05-31  Mark Mitchell  <mark@codesourcery.com>
index 5526c9f..dcdf969 100644 (file)
@@ -3639,7 +3639,8 @@ init_propagate_block_info (bb, live, local_set, flags)
   /* 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
+  if ((flags & (PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE))
+      && GET_CODE (bb->end) == JUMP_INSN
       && any_condjump_p (bb->end))
     {
       regset_head diff_head;
@@ -3717,6 +3718,31 @@ init_propagate_block_info (bb, live, local_set, flags)
     }
 #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;
 }
 
@@ -3772,26 +3798,6 @@ propagate_block (bb, live, local_set, flags)
                                 { 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.  */
 
   for (insn = bb->end; ; insn = prev)