Hello.

This patch change code 'REGNO (subreg) + subreg_regno_offset (...)' with subreg_regno (subreg).

Bootstrapped and reg-tested on x86_64-unknown-linux-gnu.

OK for trunk?

2015-10-27  Anatoly Sokolov  <ae...@post.ru>

        * caller-save.c (add_stored_regs): Use subreg_regno instead of
        subreg_regno_offset.
        * df-scan.c (df_ref_record): Ditto.
        * reg-stack.c (get_true_reg): Ditto.
        * reload.c (operands_match_p, find_reloads_address_1,
        reg_overlap_mentioned_for_reload_p): Ditto.

Index: gcc/caller-save.c
===================================================================
--- gcc/caller-save.c   (revision 229083)
+++ gcc/caller-save.c   (working copy)
@@ -991,31 +991,25 @@
 add_stored_regs (rtx reg, const_rtx setter, void *data)
 {
   int regno, endregno, i;
-  machine_mode mode = GET_MODE (reg);
-  int offset = 0;

   if (GET_CODE (setter) == CLOBBER)
     return;

-  if (GET_CODE (reg) == SUBREG
+  if (SUBREG_P (reg)
       && REG_P (SUBREG_REG (reg))
-      && REGNO (SUBREG_REG (reg)) < FIRST_PSEUDO_REGISTER)
+      && HARD_REGISTER_P (SUBREG_REG (reg)))
     {
-      offset = subreg_regno_offset (REGNO (SUBREG_REG (reg)),
-                                   GET_MODE (SUBREG_REG (reg)),
-                                   SUBREG_BYTE (reg),
-                                   GET_MODE (reg));
-      regno = REGNO (SUBREG_REG (reg)) + offset;
+      regno = subreg_regno (reg);
       endregno = regno + subreg_nregs (reg);
     }
-  else
+  else if (REG_P (reg)
+          && HARD_REGISTER_P (reg))
     {
-      if (!REG_P (reg) || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
-       return;
-
-      regno = REGNO (reg) + offset;
-      endregno = end_hard_regno (mode, regno);
+      regno = REGNO (reg);
+      endregno = end_hard_regno (GET_MODE (reg), regno);
     }
+  else
+    return;

   for (i = regno; i < endregno; i++)
     SET_REGNO_REG_SET ((regset) data, i);
Index: gcc/df-scan.c
===================================================================
--- gcc/df-scan.c       (revision 229083)
+++ gcc/df-scan.c       (working copy)
@@ -2588,8 +2588,7 @@

       if (GET_CODE (reg) == SUBREG)
        {
-         regno += subreg_regno_offset (regno, GET_MODE (SUBREG_REG (reg)),
-                                       SUBREG_BYTE (reg), GET_MODE (reg));
+         regno = subreg_regno (reg);
          endregno = regno + subreg_nregs (reg);
        }
       else
Index: gcc/reg-stack.c
===================================================================
--- gcc/reg-stack.c     (revision 229083)
+++ gcc/reg-stack.c     (working copy)
@@ -416,11 +416,7 @@
          rtx subreg;
          if (STACK_REG_P (subreg = SUBREG_REG (*pat)))
            {
-             int regno_off = subreg_regno_offset (REGNO (subreg),
-                                                  GET_MODE (subreg),
-                                                  SUBREG_BYTE (*pat),
-                                                  GET_MODE (*pat));
-             *pat = FP_MODE_REG (REGNO (subreg) + regno_off,
+             *pat = FP_MODE_REG (subreg_regno (subreg),
                                  GET_MODE (subreg));
              return pat;
            }
Index: gcc/reload.c
===================================================================
--- gcc/reload.c        (revision 229083)
+++ gcc/reload.c        (working copy)
@@ -2256,10 +2256,7 @@
          i = REGNO (SUBREG_REG (x));
          if (i >= FIRST_PSEUDO_REGISTER)
            goto slow;
-         i += subreg_regno_offset (REGNO (SUBREG_REG (x)),
-                                   GET_MODE (SUBREG_REG (x)),
-                                   SUBREG_BYTE (x),
-                                   GET_MODE (x));
+         i = subreg_regno (x);
        }
       else
        i = REGNO (x);
@@ -2269,10 +2266,7 @@
          j = REGNO (SUBREG_REG (y));
          if (j >= FIRST_PSEUDO_REGISTER)
            goto slow;
-         j += subreg_regno_offset (REGNO (SUBREG_REG (y)),
-                                   GET_MODE (SUBREG_REG (y)),
-                                   SUBREG_BYTE (y),
-                                   GET_MODE (y));
+         j = subreg_regno (y);
        }
       else
        j = REGNO (y);
@@ -5522,12 +5516,7 @@
            op0 = SUBREG_REG (op0);
            code0 = GET_CODE (op0);
            if (code0 == REG && REGNO (op0) < FIRST_PSEUDO_REGISTER)
-             op0 = gen_rtx_REG (word_mode,
-                                (REGNO (op0) +
-                                 subreg_regno_offset (REGNO (SUBREG_REG 
(orig_op0)),
-                                                      GET_MODE (SUBREG_REG 
(orig_op0)),
-                                                      SUBREG_BYTE (orig_op0),
-                                                      GET_MODE (orig_op0))));
+             op0 = gen_rtx_REG (word_mode, subreg_regno (op0));
          }

        if (GET_CODE (op1) == SUBREG)
@@ -5537,12 +5526,7 @@
            if (code1 == REG && REGNO (op1) < FIRST_PSEUDO_REGISTER)
              /* ??? Why is this given op1's mode and above for
                 ??? op0 SUBREGs we use word_mode?  */
-             op1 = gen_rtx_REG (GET_MODE (op1),
-                                (REGNO (op1) +
-                                 subreg_regno_offset (REGNO (SUBREG_REG 
(orig_op1)),
-                                                      GET_MODE (SUBREG_REG 
(orig_op1)),
-                                                      SUBREG_BYTE (orig_op1),
-                                                      GET_MODE (orig_op1))));
+             op1 = gen_rtx_REG (GET_MODE (op1), subreg_regno (op1));
          }
        /* Plus in the index register may be created only as a result of
           register rematerialization for expression like &localvar*4.  Reload 
it.
@@ -6547,14 +6531,16 @@
     return refers_to_mem_for_reload_p (in);
   else if (GET_CODE (x) == SUBREG)
     {
-      regno = REGNO (SUBREG_REG (x));
-      if (regno < FIRST_PSEUDO_REGISTER)
-       regno += subreg_regno_offset (REGNO (SUBREG_REG (x)),
-                                     GET_MODE (SUBREG_REG (x)),
-                                     SUBREG_BYTE (x),
-                                     GET_MODE (x));
-      endregno = regno + (regno < FIRST_PSEUDO_REGISTER
-                         ? subreg_nregs (x) : 1);
+      if (HARD_REGISTER_P (SUBREG_REG (x)))
+       {
+         regno = subreg_regno (x);
+         endregno = regno + subreg_nregs (x);
+       }
+      else
+       {
+         regno = REGNO (SUBREG_REG (x));
+         endregno = regno + 1;
+       }

       return refers_to_regno_for_reload_p (regno, endregno, in, (rtx*) 0);
     }


Anatoliy.

Reply via email to