Make more use of subreg_size_lowpart_offset
authorRichard Sandiford <richard.sandiford@linaro.org>
Sun, 22 Oct 2017 21:07:50 +0000 (21:07 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 22 Oct 2017 21:07:50 +0000 (21:07 +0000)
This patch uses subreg_size_lowpart_offset in places that open-coded
the calculation.  The reload use (and the LRA one that was based on it)
seemed to ignore the BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN case; it's not
obvious whether that was deliberate or an oversight.

2017-10-22  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* lra-spills.c (assign_mem_slot): Use subreg_size_lowpart_offset.
* regcprop.c (maybe_mode_change): Likewise.
* reload1.c (alter_reg): Likewise.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r253989

gcc/ChangeLog
gcc/lra-spills.c
gcc/regcprop.c
gcc/reload1.c

index 47f93c49f4b923f982656734bfa23b8315876cc9..d27728d544872fe4ff7f9a1e5211c3b2283d3547 100644 (file)
@@ -1,3 +1,11 @@
+2017-10-22  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * lra-spills.c (assign_mem_slot): Use subreg_size_lowpart_offset.
+       * regcprop.c (maybe_mode_change): Likewise.
+       * reload1.c (alter_reg): Likewise.
+
 2017-10-22  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * inchash.h (inchash::hash::add_wide_int): New function.
index ab33dd4241229e34d1621e6510755fd756511866..5997b1e48f591098abc46f5a0338d83e8f6ded70 100644 (file)
@@ -153,9 +153,7 @@ assign_mem_slot (int i)
 
   /* On a big endian machine, the "address" of the slot is the address
      of the low part that fits its inherent mode.  */
-  if (BYTES_BIG_ENDIAN && inherent_size < total_size)
-    adjust += (total_size - inherent_size);
-
+  adjust += subreg_size_lowpart_offset (inherent_size, total_size);
   x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust);
 
   /* Set all of the memory attributes as appropriate for a spill.  */
index 5db5b5d9fdffae14c1ea7bd48cb1e0a7f4937947..b80019b5be0d8761a59234a940f8e54f7a9136e2 100644 (file)
@@ -407,13 +407,9 @@ maybe_mode_change (machine_mode orig_mode, machine_mode copy_mode,
       int use_nregs = hard_regno_nregs (copy_regno, new_mode);
       int copy_offset
        = GET_MODE_SIZE (copy_mode) / copy_nregs * (copy_nregs - use_nregs);
-      int offset
-       = GET_MODE_SIZE (orig_mode) - GET_MODE_SIZE (new_mode) - copy_offset;
-      int byteoffset = offset % UNITS_PER_WORD;
-      int wordoffset = offset - byteoffset;
-
-      offset = ((WORDS_BIG_ENDIAN ? wordoffset : 0)
-               + (BYTES_BIG_ENDIAN ? byteoffset : 0));
+      unsigned int offset
+       = subreg_size_lowpart_offset (GET_MODE_SIZE (new_mode) + copy_offset,
+                                     GET_MODE_SIZE (orig_mode));
       regno += subreg_regno_offset (regno, orig_mode, offset, new_mode);
       if (targetm.hard_regno_mode_ok (regno, new_mode))
        return gen_raw_REG (new_mode, regno);
index 5e200b94ebb238abe0927533c5bbe59320f043d3..27f37166b0354ca225468369f7199ebdb2e5ab92 100644 (file)
@@ -2251,8 +2251,7 @@ alter_reg (int i, int from_reg, bool dont_share_p)
 
       /* On a big endian machine, the "address" of the slot
         is the address of the low part that fits its inherent mode.  */
-      if (BYTES_BIG_ENDIAN && inherent_size < total_size)
-       adjust += (total_size - inherent_size);
+      adjust += subreg_size_lowpart_offset (inherent_size, total_size);
 
       /* If we have any adjustment to make, or if the stack slot is the
         wrong mode, make a new stack slot.  */