OSDN Git Service

* regrename.c (copy_value): Fix comment.
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
index 2f0b787..0f8a49a 100644 (file)
@@ -16,8 +16,8 @@ for more details.
 
 You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA.  */
 
 /* This module is essentially the "combiner" phase of the U. of Arizona
    Portable Optimizer, but redone to work on our list-structured
@@ -985,7 +985,8 @@ set_nonzero_bits_and_sign_copies (rtx x, rtx set,
       && REGNO (x) >= FIRST_PSEUDO_REGISTER
       /* If this register is undefined at the start of the file, we can't
         say what its contents were.  */
-      && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, REGNO (x))
+      && ! REGNO_REG_SET_P
+         (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start, REGNO (x))
       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
     {
       if (set == 0 || GET_CODE (set) == CLOBBER)
@@ -5273,6 +5274,11 @@ simplify_set (rtx x)
          SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
          src = SET_SRC (x);
        }
+      else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
+       {
+         SUBST(SET_SRC (x), op0);
+         src = SET_SRC (x);
+        }
       else
        {
          /* Otherwise, update the COMPARE if needed.  */
@@ -6731,41 +6737,33 @@ make_compound_operation (rtx x, enum rtx_code in_code)
         what it originally did, do this SUBREG as a force_to_mode.  */
 
       tem = make_compound_operation (SUBREG_REG (x), in_code);
-      if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
-         && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
-         && subreg_lowpart_p (x))
-       {
-         rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
-                                    NULL_RTX, 0);
 
-         /* If we have something other than a SUBREG, we might have
-            done an expansion, so rerun ourselves.  */
-         if (GET_CODE (newer) != SUBREG)
-           newer = make_compound_operation (newer, in_code);
+      {
+       rtx simplified;
+       simplified = simplify_subreg (GET_MODE (x), tem, GET_MODE (tem),
+                                     SUBREG_BYTE (x));
 
-         return newer;
-       }
+       if (simplified)
+         tem = simplified;
 
-      /* If this is a paradoxical subreg, and the new code is a sign or
-        zero extension, omit the subreg and widen the extension.  If it
-        is a regular subreg, we can still get rid of the subreg by not
-        widening so much, or in fact removing the extension entirely.  */
-      if ((GET_CODE (tem) == SIGN_EXTEND
-          || GET_CODE (tem) == ZERO_EXTEND)
-         && subreg_lowpart_p (x))
-       {
-         if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
-             || (GET_MODE_SIZE (mode) >
-                 GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
-           {
-             if (! SCALAR_INT_MODE_P (mode))
-               break;
-             tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
-           }
-         else
-           tem = gen_lowpart (mode, XEXP (tem, 0));
+       if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
+           && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
+           && subreg_lowpart_p (x))
+         {
+           rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
+                                      NULL_RTX, 0);
+           
+           /* If we have something other than a SUBREG, we might have
+              done an expansion, so rerun ourselves.  */
+           if (GET_CODE (newer) != SUBREG)
+             newer = make_compound_operation (newer, in_code);
+           
+           return newer;
+         }
+
+       if (simplified)
          return tem;
-       }
+      }
       break;
 
     default:
@@ -8278,8 +8276,9 @@ reg_nonzero_bits_for_combine (rtx x, enum machine_mode mode,
       && (reg_stat[REGNO (x)].last_set_label == label_tick
          || (REGNO (x) >= FIRST_PSEUDO_REGISTER
              && REG_N_SETS (REGNO (x)) == 1
-             && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
-                                   REGNO (x))))
+             && ! REGNO_REG_SET_P
+                (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
+                 REGNO (x))))
       && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
     {
       *nonzero &= reg_stat[REGNO (x)].last_set_nonzero_bits;
@@ -8345,8 +8344,9 @@ reg_num_sign_bit_copies_for_combine (rtx x, enum machine_mode mode,
       && (reg_stat[REGNO (x)].last_set_label == label_tick
           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
              && REG_N_SETS (REGNO (x)) == 1
-             && ! REGNO_REG_SET_P (ENTRY_BLOCK_PTR->next_bb->global_live_at_start,
-                                   REGNO (x))))
+             && ! REGNO_REG_SET_P
+                (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
+                 REGNO (x))))
       && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
     {
       *result = reg_stat[REGNO (x)].last_set_sign_bit_copies;
@@ -11180,7 +11180,8 @@ get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
            || (! (regno >= FIRST_PSEUDO_REGISTER
                   && REG_N_SETS (regno) == 1
                   && (! REGNO_REG_SET_P
-                      (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))
+                      (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
+                       regno)))
                && reg_stat[j].last_set_label > tick))
          {
            if (replace)
@@ -11290,7 +11291,8 @@ get_last_value (rtx x)
          && (regno < FIRST_PSEUDO_REGISTER
              || REG_N_SETS (regno) != 1
              || (REGNO_REG_SET_P
-                 (ENTRY_BLOCK_PTR->next_bb->global_live_at_start, regno)))))
+                 (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
+                  regno)))))
     return 0;
 
   /* If the value was set in a later insn than the ones we are processing,
@@ -11451,7 +11453,7 @@ reg_dead_at_p (rtx reg, rtx insn)
     }
 
   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
-    if (REGNO_REG_SET_P (block->global_live_at_start, i))
+    if (REGNO_REG_SET_P (block->il.rtl->global_live_at_start, i))
       return 0;
 
   return 1;
@@ -12218,7 +12220,7 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2)
                 was dead, there's nothing left to do.  Otherwise, we'll
                 need to do a global life update after combine.  */
              if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
-                 && REGNO_REG_SET_P (bb->global_live_at_start,
+                 && REGNO_REG_SET_P (bb->il.rtl->global_live_at_start,
                                      REGNO (XEXP (note, 0))))
                SET_BIT (refresh_blocks, this_basic_block->index);
            }