OSDN Git Service

* flow.c (update_life_info): Allocate reg_deaths when called from
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 2004 19:29:56 +0000 (19:29 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 2004 19:29:56 +0000 (19:29 +0000)
scheudler.
(attempt_auto_inc):  Update life ranges accordingly.

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

gcc/ChangeLog
gcc/flow.c

index ebedd17..45ef069 100644 (file)
@@ -1,3 +1,9 @@
+2004-02-06  Jan Hubicka  <jh@suse.cz>
+
+       * flow.c (update_life_info): Allocate reg_deaths when called from
+       scheudler.
+       (attempt_auto_inc):  Update life ranges accordingly.
+
 2004-02-06  Ulrich Weigand  <uweigand@de.ibm.com>
 
        PR debug/11816
index 049a587..a12f0ed 100644 (file)
@@ -627,6 +627,9 @@ update_life_info (sbitmap blocks, enum update_life_extent extent, int prop_flags
   tmp = INITIALIZE_REG_SET (tmp_head);
   ndead = 0;
 
+  if ((prop_flags & PROP_REG_INFO) && !reg_deaths)
+    reg_deaths = xcalloc (sizeof (*reg_deaths), max_regno);
+
   timevar_push ((extent == UPDATE_LIFE_LOCAL || blocks)
                ? TV_LIFE_UPDATE : TV_LIFE);
 
@@ -3376,16 +3379,16 @@ attempt_auto_inc (struct propagate_block_info *pbi, rtx inc, rtx insn,
       incr_reg = q;
       regno = REGNO (q);
 
+      if ((pbi->flags & PROP_REG_INFO)
+         && !REGNO_REG_SET_P (pbi->reg_live, regno))
+       reg_deaths[regno] = pbi->insn_num;
+
       /* REGNO is now used in INCR which is below INSN, but
         it previously wasn't live here.  If we don't mark
         it as live, we'll put a REG_DEAD note for it
         on this insn, which is incorrect.  */
       SET_REGNO_REG_SET (pbi->reg_live, regno);
 
-      /* We shall not do the autoinc during final pass.  */
-      if (flags & PROP_REG_INFO)
-       abort ();
-
       /* If there are any calls between INSN and INCR, show
         that REGNO now crosses them.  */
       for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
@@ -3417,14 +3420,21 @@ attempt_auto_inc (struct propagate_block_info *pbi, rtx inc, rtx insn,
       /* If the original source was dead, it's dead now.  */
       rtx note;
 
-      /* We shall not do the autoinc during final pass.  */
-      if (flags & PROP_REG_INFO)
-       abort ();
       while ((note = find_reg_note (incr, REG_DEAD, NULL_RTX)) != NULL_RTX)
        {
          remove_note (incr, note);
          if (XEXP (note, 0) != incr_reg)
-           CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
+           {
+             unsigned int regno = REGNO (XEXP (note, 0));
+
+             if ((pbi->flags & PROP_REG_INFO)
+                 && REGNO_REG_SET_P (pbi->reg_live, regno))
+               {
+                 REG_LIVE_LENGTH (regno) += pbi->insn_num - reg_deaths[regno];
+                 reg_deaths[regno] = 0;
+               }
+             CLEAR_REGNO_REG_SET (pbi->reg_live, REGNO (XEXP (note, 0)));
+           }
        }
 
       PUT_CODE (incr, NOTE);