Add narrower_subreg_mode helper function
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 1 Nov 2017 12:52:50 +0000 (12:52 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 1 Nov 2017 12:52:50 +0000 (12:52 +0000)
This patch adds a narrowing equivalent of wider_subreg_mode.  At present
there is only one user.

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

gcc/
* rtl.h (narrower_subreg_mode): New function.
* ira-color.c (update_costs_from_allocno): Use it.

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

gcc/ChangeLog
gcc/ira-color.c
gcc/rtl.h

index 3843db847a8f41ca7cf557ae5d83ff685a7af65a..bdd6b73ae4f31e2bd39151dc0707a09f31b1532c 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-01  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * rtl.h (narrower_subreg_mode): New function.
+       * ira-color.c (update_costs_from_allocno): Use it.
+
 2017-11-01  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 240eb48d3f0be14865ecc1ce7b823392028b1272..0148058aeee732790d11d1352a2606af8a98f67d 100644 (file)
@@ -1367,15 +1367,14 @@ update_costs_from_allocno (ira_allocno_t allocno, int hard_regno,
              || ALLOCNO_ASSIGNED_P (another_allocno))
            continue;
 
-         if (GET_MODE_SIZE (ALLOCNO_MODE (cp->second)) < GET_MODE_SIZE (mode))
-           /* If we have different modes use the smallest one.  It is
-              a sub-register move.  It is hard to predict what LRA
-              will reload (the pseudo or its sub-register) but LRA
-              will try to minimize the data movement.  Also for some
-              register classes bigger modes might be invalid,
-              e.g. DImode for AREG on x86.  For such cases the
-              register move cost will be maximal. */
-           mode = ALLOCNO_MODE (cp->second);
+         /* If we have different modes use the smallest one.  It is
+            a sub-register move.  It is hard to predict what LRA
+            will reload (the pseudo or its sub-register) but LRA
+            will try to minimize the data movement.  Also for some
+            register classes bigger modes might be invalid,
+            e.g. DImode for AREG on x86.  For such cases the
+            register move cost will be maximal.  */
+         mode = narrower_subreg_mode (mode, ALLOCNO_MODE (cp->second));
          
          cost = (cp->second == allocno
                  ? ira_register_move_cost[mode][rclass][aclass]
index 53635a2d4b09bfa2d00d238765a05368c9a4c555..8de5a1cada5a9d65f4f8b11bb826d441ba7e6298 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2954,6 +2954,16 @@ subreg_lowpart_offset (machine_mode outermode, machine_mode innermode)
                                     GET_MODE_SIZE (innermode));
 }
 
+/* Given that a subreg has outer mode OUTERMODE and inner mode INNERMODE,
+   return the smaller of the two modes if they are different sizes,
+   otherwise return the outer mode.  */
+
+inline machine_mode
+narrower_subreg_mode (machine_mode outermode, machine_mode innermode)
+{
+  return paradoxical_subreg_p (outermode, innermode) ? innermode : outermode;
+}
+
 /* Given that a subreg has outer mode OUTERMODE and inner mode INNERMODE,
    return the mode that is big enough to hold both the outer and inner
    values.  Prefer the outer mode in the event of a tie.  */