diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2015-07-21 19:54:23 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2015-07-21 19:54:23 +0000 |
commit | 6998b929fa954dc791b77011ce7d3252d6f107fe (patch) | |
tree | 1ce16f28ab5396c2dcefab8ca2acdf55f9f9146b /gcc/lra-remat.c | |
parent | f9ffade09c3cc13eb1a199a24517b9b1909c6e80 (diff) | |
download | gcc-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.c | 10 |
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) |