re PR rtl-optimization/67145 (associativity from pseudo-reg ordering)

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
This commit is contained in:
Richard Henderson 2016-03-02 13:09:54 -08:00 committed by Richard Henderson
parent 82ee0cf2f7
commit 08c1904dcc
2 changed files with 26 additions and 2 deletions

View 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.

View 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,