aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-eliminations.c
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2021-01-20 11:40:14 -0500
committerVladimir N. Makarov <vmakarov@redhat.com>2021-01-20 11:44:04 -0500
commit4334b524274203125193a08a8485250c41c2daa9 (patch)
tree871af61bf1eacb30f9613f4d5261edfc9701fdbd /gcc/lra-eliminations.c
parent261cdd23195bc921737fd7a44e34a93aaaaccc44 (diff)
downloadgcc-4334b524274203125193a08a8485250c41c2daa9.zip
gcc-4334b524274203125193a08a8485250c41c2daa9.tar.gz
gcc-4334b524274203125193a08a8485250c41c2daa9.tar.bz2
[PR98722] LRA: Check that target has no 3-op add insn to transform 2 plus expression.
Patch cf2ac1c30af0fa783c8d72e527904dda5d8cc330 for solving PR97969 was assumed for targets with absent 3-op add insn. But the original patch did not check this. This patch adds the check. gcc/ChangeLog: PR rtl-optimization/98722 * lra-eliminations.c (eliminate_regs_in_insn): Check that target has no 3-op add insn to transform insns containing two pluses. gcc/testsuite/ChangeLog: PR rtl-optimization/98722 * g++.target/s390/pr98722.C: New.
Diffstat (limited to 'gcc/lra-eliminations.c')
-rw-r--r--gcc/lra-eliminations.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c
index ebcadd1..5b97175 100644
--- a/gcc/lra-eliminations.c
+++ b/gcc/lra-eliminations.c
@@ -1057,7 +1057,10 @@ eliminate_regs_in_insn (rtx_insn *insn, bool replace_p, bool first_p,
reg2 = SUBREG_REG (reg2);
if (REG_P (reg1) && REG_P (reg2)
&& REGNO (reg1) < FIRST_PSEUDO_REGISTER
- && REGNO (reg2) >= FIRST_PSEUDO_REGISTER)
+ && REGNO (reg2) >= FIRST_PSEUDO_REGISTER
+ && GET_MODE (reg1) == Pmode
+ && !have_addptr3_insn (gen_reg_rtx (Pmode), reg1,
+ XEXP (XEXP (SET_SRC (set), 0), 1)))
{
XEXP (XEXP (SET_SRC (set), 0), 0) = op2;
XEXP (SET_SRC (set), 1) = op1;