Prevent hoisting code from generating uninitialized accesses.
authorBernd Schmidt <bernds@redhat.com>
Fri, 30 Mar 2001 17:18:14 +0000 (17:18 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Fri, 30 Mar 2001 17:18:14 +0000 (17:18 +0000)
From-SVN: r40971

gcc/ChangeLog
gcc/loop.c

index 533b520f763432d73e551a30939c5b11d66357cc..7f0266b425fa55df602bccc4248ba43875ea7fbc 100644 (file)
@@ -1,3 +1,8 @@
+2001-03-30  Bernd Schmidt  <bernds@redhat.com>
+
+       * loop.c (load_mems): When generating a load from a pseudo, update
+       REGNO_LAST_UID.
+
 Fri Mar 30 17:36:43 CEST 2001  Jan Hubicka  <jh@suse.cz>
 
        * i386.c (ix86_split_long_move): Use change address to compensate
index f2d44cba7cc96eea07d7d17101a1820a08285486..085b7c8b54a32633003ae10cf0da0bfeb411fb70 100644 (file)
@@ -8811,7 +8811,7 @@ load_mems (loop)
   struct loop_regs *regs = LOOP_REGS (loop);
   int maybe_never = 0;
   int i;
-  rtx p;
+  rtx p, prev_ebb_head;
   rtx label = NULL_RTX;
   rtx end_label;
   /* Nonzero if the next instruction may never be executed.  */
@@ -8873,6 +8873,7 @@ load_mems (loop)
        PREV_INSN (p) && GET_CODE (p) != CODE_LABEL;
        p = PREV_INSN (p))
     ;
+  prev_ebb_head = p;
 
   cselib_init ();
 
@@ -8963,7 +8964,7 @@ load_mems (loop)
       loop_info->mems[i].reg = reg;
 
       /* Now, replace all references to the MEM with the
-        corresponding pesudos.  */
+        corresponding pseudos.  */
       maybe_never = 0;
       for (p = next_insn_in_loop (loop, loop->scan_start);
           p != NULL_RTX;
@@ -9034,7 +9035,7 @@ load_mems (loop)
                  if (CONSTANT_P (equiv->loc))
                    const_equiv = equiv;
                  else if (GET_CODE (equiv->loc) == REG
-                          /* Extending hard register lifetimes cuases crash
+                          /* Extending hard register lifetimes causes crash
                              on SRC targets.  Doing so on non-SRC is
                              probably also not good idea, since we most
                              probably have pseudoregister equivalence as
@@ -9060,8 +9061,19 @@ load_mems (loop)
              if (best_equiv)
                best = copy_rtx (best_equiv->loc);
            }
+
          set = gen_move_insn (reg, best);
          set = loop_insn_hoist (loop, set);
+         if (REG_P (best))
+           {
+             for (p = prev_ebb_head; p != loop->start; p = NEXT_INSN (p))
+               if (REGNO_LAST_UID (REGNO (best)) == INSN_UID (p))
+                 {
+                   REGNO_LAST_UID (REGNO (best)) = INSN_UID (set);
+                   break;
+                 }
+           }
+
          if (const_equiv)
            REG_NOTES (set) = gen_rtx_EXPR_LIST (REG_EQUAL,
                                                 copy_rtx (const_equiv->loc),