[RA]: Fixing LRA cycling for multi-reg variable containing a fixed reg
PR111971 test case uses a multi-reg variable containing a fixed reg. LRA rejects such multi-reg because of this when matching the constraint for an asm insn. The rejection results in LRA cycling. The patch fixes this issue. gcc/ChangeLog: PR rtl-optimization/111971 * lra-constraints.cc: (process_alt_operands): Don't check start hard regs for regs originated from register variables. gcc/testsuite/ChangeLog: PR rtl-optimization/111971 * gcc.target/powerpc/pr111971.c: New test.
This commit is contained in:
parent
3e888f9462
commit
9119b008b4
2 changed files with 16 additions and 3 deletions
|
@ -2609,12 +2609,15 @@ process_alt_operands (int only_alternative)
|
|||
winreg = true;
|
||||
if (REG_P (op))
|
||||
{
|
||||
tree decl;
|
||||
if (hard_regno[nop] >= 0
|
||||
&& in_hard_reg_set_p (this_alternative_set,
|
||||
mode, hard_regno[nop])
|
||||
&& !TEST_HARD_REG_BIT
|
||||
(this_alternative_exclude_start_hard_regs,
|
||||
hard_regno[nop]))
|
||||
&& ((REG_ATTRS (op) && (decl = REG_EXPR (op)) != NULL
|
||||
&& VAR_P (decl) && DECL_HARD_REGISTER (decl))
|
||||
|| !(TEST_HARD_REG_BIT
|
||||
(this_alternative_exclude_start_hard_regs,
|
||||
hard_regno[nop]))))
|
||||
win = true;
|
||||
else if (hard_regno[nop] < 0
|
||||
&& in_class_p (op, this_alternative, NULL))
|
||||
|
|
10
gcc/testsuite/gcc.target/powerpc/pr111971.c
Normal file
10
gcc/testsuite/gcc.target/powerpc/pr111971.c
Normal file
|
@ -0,0 +1,10 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2" } */
|
||||
void
|
||||
foo (unsigned long long *a)
|
||||
{
|
||||
register long long d asm ("r0") = 0x24;
|
||||
long long n;
|
||||
asm ("mr %0, %1" : "=r"(n) : "r"(d));
|
||||
*a++ = n;
|
||||
}
|
Loading…
Add table
Reference in a new issue