regrename.c (find_oldest_value_reg): Ignore the value chain if the original register...
authorRichard Henderson <rth@gcc.gnu.org>
Tue, 8 Jan 2002 06:13:34 +0000 (22:13 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 8 Jan 2002 06:13:34 +0000 (22:13 -0800)
        * regrename.c (find_oldest_value_reg): Ignore the value chain if
        the original register was copied in a mode with a fewer number of
        hard registers than the desired mode.
        (copyprop_hardreg_forward_1): Likewise.
        (debug_value_data): Fix loop test.
        * toplev.c (parse_options_and_default_flags): Reenable
        -fcprop-registers at -O1.

From-SVN: r48624

gcc/ChangeLog
gcc/regrename.c
gcc/toplev.c

index 44113da7e9c48b94b9fe52487539bbbaf043d770..cfff16965f0b0a8354f175678bfd02d88b23629e 100644 (file)
@@ -1,4 +1,14 @@
-002-01-07  Aldy Hernandez  <aldyh@redhat.com>
+2002-01-07  Richard Henderson  <rth@redhat.com>
+
+       * regrename.c (find_oldest_value_reg): Ignore the value chain if
+       the original register was copied in a mode with a fewer number of
+       hard registers than the desired mode.
+       (copyprop_hardreg_forward_1): Likewise.
+       (debug_value_data): Fix loop test.
+       * toplev.c (parse_options_and_default_flags): Reenable
+       -fcprop-registers at -O1.
+
+2002-01-07  Aldy Hernandez  <aldyh@redhat.com>
 
         * config/rs6000/rs6000.c (bdesc_2arg): Add altivec predicates.
         (altivec_init_builtins): New node v4si_ftype_v16qi_v16qi.
index 720e0cf46c9b705451603b0524183a372a494eaf..45f5b8552ef692143d13c95af52667f1c3254f2c 100644 (file)
@@ -1282,6 +1282,20 @@ find_oldest_value_reg (class, reg, vd)
   enum machine_mode mode = GET_MODE (reg);
   unsigned int i;
 
+  /* If we are accessing REG in some mode other that what we set it in,
+     make sure that the replacement is valid.  In particular, consider
+       (set (reg:DI r11) (...))
+       (set (reg:SI r9) (reg:SI r11))
+       (set (reg:SI r10) (...))
+       (set (...) (reg:DI r9))
+     Replacing r9 with r11 is invalid.  */
+  if (mode != vd->e[regno].mode)
+    {
+      if (HARD_REGNO_NREGS (regno, mode)
+         > HARD_REGNO_NREGS (regno, vd->e[regno].mode))
+       return NULL_RTX;
+    }
+
   for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)
     if (TEST_HARD_REG_BIT (reg_class_contents[class], i)
        && (vd->e[i].mode == mode
@@ -1544,6 +1558,15 @@ copyprop_hardreg_forward_1 (bb, vd)
          unsigned int i;
          rtx new;
 
+         /* If we are accessing SRC in some mode other that what we
+            set it in, make sure that the replacement is valid.  */
+         if (mode != vd->e[regno].mode)
+           {
+             if (HARD_REGNO_NREGS (regno, mode)
+                 > HARD_REGNO_NREGS (regno, vd->e[regno].mode))
+               goto no_move_special_case;
+           }
+
          /* If the destination is also a register, try to find a source
             register in the same class.  */
          if (REG_P (SET_DEST (set)))
@@ -1578,6 +1601,7 @@ copyprop_hardreg_forward_1 (bb, vd)
                  }
              }
        }
+      no_move_special_case:
 
       /* For each input operand, replace a hard register with the
         eldest live copy that's in an appropriate register class.  */
@@ -1735,7 +1759,7 @@ debug_value_data (vd)
             j != INVALID_REGNUM;
             j = vd->e[j].next_regno)
          {
-           if (TEST_HARD_REG_BIT (set, vd->e[j].next_regno))
+           if (TEST_HARD_REG_BIT (set, j))
              {
                fprintf (stderr, "[%u] Loop in regno chain\n", j);
                return;
index 61054262b39c05dede006451cae96db32692cce0..da508a763f23c5e56e5fd1ba13314b1cf606dcd8 100644 (file)
@@ -4663,7 +4663,7 @@ parse_options_and_default_flags (argc, argv)
       flag_omit_frame_pointer = 1;
 #endif
       flag_guess_branch_prob = 1;
-      /* flag_cprop_registers = 1; */
+      flag_cprop_registers = 1;
     }
 
   if (optimize >= 2)