aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-remat.c
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2021-02-18 17:49:26 -0500
committerVladimir N. Makarov <vmakarov@redhat.com>2021-02-18 17:51:03 -0500
commitd1efec57e279f5b0cd62073696cd351fce369bb7 (patch)
tree20415240b05c75ebf3b546f0e2c0b9c942a5431a /gcc/lra-remat.c
parent6347f4a0904fce17eedf5c071be6f3c118680290 (diff)
downloadgcc-d1efec57e279f5b0cd62073696cd351fce369bb7.zip
gcc-d1efec57e279f5b0cd62073696cd351fce369bb7.tar.gz
gcc-d1efec57e279f5b0cd62073696cd351fce369bb7.tar.bz2
[PR96264] LRA: Check output insn hard regs when updating available rematerialization after the insn
Insn for rematerialization can contain a clobbered hard register. We can not move such insn through another insn setting up the same hard register. The patch adds such check. gcc/ChangeLog: PR rtl-optimization/96264 * lra-remat.c (reg_overlap_for_remat_p): Check also output insn hard regs. gcc/testsuite/ChangeLog: PR rtl-optimization/96264 * gcc.target/powerpc/pr96264.c: New.
Diffstat (limited to 'gcc/lra-remat.c')
-rw-r--r--gcc/lra-remat.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c
index 8bd9ffa..d983731 100644
--- a/gcc/lra-remat.c
+++ b/gcc/lra-remat.c
@@ -651,7 +651,11 @@ calculate_local_reg_remat_bb_data (void)
-/* Return true if REG overlaps an input operand of INSN. */
+/* Return true if REG overlaps an input operand or non-input hard register of
+ INSN. Basically the function returns false if we can move rematerialization
+ candidate INSN through another insn with output REG or dead input REG (we
+ consider it to avoid extending reg live range) with possible output pseudo
+ renaming in INSN. */
static bool
reg_overlap_for_remat_p (lra_insn_reg *reg, rtx_insn *insn)
{
@@ -675,10 +679,11 @@ reg_overlap_for_remat_p (lra_insn_reg *reg, rtx_insn *insn)
reg2 != NULL;
reg2 = reg2->next)
{
- if (reg2->type != OP_IN)
- continue;
- unsigned regno2 = reg2->regno;
int nregs2;
+ unsigned regno2 = reg2->regno;
+
+ if (reg2->type != OP_IN && regno2 >= FIRST_PSEUDO_REGISTER)
+ continue;
if (regno2 >= FIRST_PSEUDO_REGISTER && reg_renumber[regno2] >= 0)
regno2 = reg_renumber[regno2];