]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/67145 (associativity from pseudo-reg ordering)
authorRichard Henderson <rth@redhat.com>
Wed, 2 Mar 2016 21:09:54 +0000 (13:09 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 2 Mar 2016 21:09:54 +0000 (13:09 -0800)
PR rtl-opt/67145

  * simplify-rtx.c (simplify_plus_minus): Allow reassoc without
  simplification when all args are positive non-fixed registers.

From-SVN: r233916

gcc/ChangeLog
gcc/simplify-rtx.c

index a37ecbd97f8d2a732796c6e61a3556c057bd603e..2adcc5f0ce67b1a23d1f481c0daa1b9de01d845f 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-02  Richard Henderson  <rth@redhat.com>
+
+       PR rtl-opt/67145
+       * simplify-rtx.c (simplify_plus_minus): Allow reassoc without
+       simplification when all args are positive non-fixed registers.
+
 2016-03-02  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
        * target.def (lra_p): Specify that new ports should use LRA.
index 450fa8b032048fc908557f112b325af3e65472b4..e1a0319c26f1145f916422e0ad2c1941202212c3 100644 (file)
@@ -4421,9 +4421,26 @@ simplify_plus_minus (enum rtx_code code, machine_mode mode, rtx op0,
       n_ops = i;
     }
 
-  /* If nothing changed, fail.  */
+  /* If nothing changed, check that rematerialization of rtl instructions
+     is still required.  */
   if (!canonicalized)
-    return NULL_RTX;
+    {
+      /* Perform rematerialization if only all operands are registers and
+        all operations are PLUS.  */
+      /* ??? Also disallow (non-global, non-frame) fixed registers to work
+        around rs6000 and how it uses the CA register.  See PR67145.  */
+      for (i = 0; i < n_ops; i++)
+       if (ops[i].neg
+           || !REG_P (ops[i].op)
+           || (REGNO (ops[i].op) < FIRST_PSEUDO_REGISTER
+               && fixed_regs[REGNO (ops[i].op)]
+               && !global_regs[REGNO (ops[i].op)]
+               && ops[i].op != frame_pointer_rtx
+               && ops[i].op != arg_pointer_rtx
+               && ops[i].op != stack_pointer_rtx))
+         return NULL_RTX;
+      goto gen_result;
+    }
 
   /* Create (minus -C X) instead of (neg (const (plus X C))).  */
   if (n_ops == 2
@@ -4465,6 +4482,7 @@ simplify_plus_minus (enum rtx_code code, machine_mode mode, rtx op0,
     }
 
   /* Now make the result by performing the requested operations.  */
+ gen_result:
   result = ops[0].op;
   for (i = 1; i < n_ops; i++)
     result = gen_rtx_fmt_ee (ops[i].neg ? MINUS : PLUS,