[LRA] PR70904, relax the restriction on subreg reload for wide mode
authorJiong Wang <jiong.wang@arm.com>
Thu, 12 May 2016 17:00:52 +0000 (17:00 +0000)
committerJiong Wang <jiwang@gcc.gnu.org>
Thu, 12 May 2016 17:00:52 +0000 (17:00 +0000)
2016-05-12  Jiong Wang  <jiong.wang@arm.com>

gcc/
  PR rtl-optimization/70904
  * lra-constraint.c (process_addr_reg): Relax the restriction on
  subreg reload for wide mode.

From-SVN: r236181

gcc/ChangeLog
gcc/lra-constraints.c

index de20f4ba3ff2a7bbcb25a395c766928c5f775618..b9a18e8dd60a8d745bf890f70135cbe426d2037d 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-12  Jiong Wang  <jiong.wang@arm.com>
+
+       PR rtl-optimization/70904
+       * lra-constraint.c (process_addr_reg): Relax the restriction on subreg
+       reload for wide mode.
+
 2016-05-12  Marek Polacek  <polacek@redhat.com>
 
        PR c/70756
index 14d5f1dc538896d01748bbbd78bb4850f110602a..56ab5b45c17cdfebe0593834111cc9e4f7f69a0c 100644 (file)
@@ -1307,7 +1307,21 @@ process_addr_reg (rtx *loc, bool check_only_p, rtx_insn **before, rtx_insn **aft
 
   subreg_p = GET_CODE (*loc) == SUBREG;
   if (subreg_p)
-    loc = &SUBREG_REG (*loc);
+    {
+      reg = SUBREG_REG (*loc);
+      mode = GET_MODE (reg);
+
+      /* For mode with size bigger than ptr_mode, there unlikely to be "mov"
+        between two registers with different classes, but there normally will
+        be "mov" which transfers element of vector register into the general
+        register, and this normally will be a subreg which should be reloaded
+        as a whole.  This is particularly likely to be triggered when
+        -fno-split-wide-types specified.  */
+      if (in_class_p (reg, cl, &new_class)
+         || GET_MODE_SIZE (mode) <= GET_MODE_SIZE (ptr_mode))
+       loc = &SUBREG_REG (*loc);
+    }
+
   reg = *loc;
   mode = GET_MODE (reg);
   if (! REG_P (reg))