aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-remat.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2015-07-21 19:54:23 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2015-07-21 19:54:23 +0000
commit6998b929fa954dc791b77011ce7d3252d6f107fe (patch)
tree1ce16f28ab5396c2dcefab8ca2acdf55f9f9146b /gcc/lra-remat.c
parentf9ffade09c3cc13eb1a199a24517b9b1909c6e80 (diff)
downloadgcc-6998b929fa954dc791b77011ce7d3252d6f107fe.zip
gcc-6998b929fa954dc791b77011ce7d3252d6f107fe.tar.gz
gcc-6998b929fa954dc791b77011ce7d3252d6f107fe.tar.bz2
re PR ipa/66424 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 32-bit mode)
2015-07-21 Vladimir Makarov <vmakarov@redhat.com> PR ipa/66424. * lra-remat.c (operand_to_remat): Prevent using insns with input subregs processed separately by IRA. 2015-07-21 Vladimir Makarov <vmakarov@redhat.com> PR ipa/66424. * gcc.target/i386/pr66424.c: New. From-SVN: r226053
Diffstat (limited to 'gcc/lra-remat.c')
-rw-r--r--gcc/lra-remat.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c
index 1c259a3..66532b8 100644
--- a/gcc/lra-remat.c
+++ b/gcc/lra-remat.c
@@ -417,6 +417,16 @@ operand_to_remat (rtx_insn *insn)
return -1;
found_reg = reg;
}
+ /* IRA calculates conflicts separately for subregs of two words
+ pseudo. Even if the pseudo lives, e.g. one its subreg can be
+ used lately, another subreg hard register can be already used
+ for something else. In such case, it is not safe to
+ rematerialize the insn. */
+ else if (reg->type == OP_IN && reg->subreg_p
+ && reg->regno >= FIRST_PSEUDO_REGISTER
+ && (GET_MODE_SIZE (PSEUDO_REGNO_MODE (reg->regno))
+ == 2 * UNITS_PER_WORD))
+ return -1;
if (found_reg == NULL)
return -1;
if (found_reg->regno < FIRST_PSEUDO_REGISTER)