sparc: Preserve ORIGINAL_REGNO in epilogue_renumber [PR105257]
The following testcase ICEs, because the pic register is (reg:DI 24 %i0 [109]) and is used in the delay slot of a return. We invoke epilogue_renumber and that changes it to (reg:DI 8 %o0) which no longer satisfies sparc_pic_register_p predicate, so we don't recognize the insn anymore. The following patch fixes that by preserving ORIGINAL_REGNO if specified, so we get (reg:DI 8 %o0 [109]) instead. 2022-04-19 Jakub Jelinek <jakub@redhat.com> PR target/105257 * config/sparc/sparc.cc (epilogue_renumber): If ORIGINAL_REGNO, use gen_raw_REG instead of gen_rtx_REG and copy over also ORIGINAL_REGNO. Use return 0; instead of /* fallthrough */. * gcc.dg/pr105257.c: New test.
This commit is contained in:
parent
eb03e42459
commit
eeca2b8bd0
2 changed files with 30 additions and 2 deletions
|
@ -8884,8 +8884,20 @@ epilogue_renumber (rtx *where, int test)
|
|||
if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
|
||||
return 1;
|
||||
if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
|
||||
*where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
|
||||
/* fallthrough */
|
||||
{
|
||||
if (ORIGINAL_REGNO (*where))
|
||||
{
|
||||
rtx n = gen_raw_REG (GET_MODE (*where),
|
||||
OUTGOING_REGNO (REGNO (*where)));
|
||||
ORIGINAL_REGNO (n) = ORIGINAL_REGNO (*where);
|
||||
*where = n;
|
||||
}
|
||||
else
|
||||
*where = gen_rtx_REG (GET_MODE (*where),
|
||||
OUTGOING_REGNO (REGNO (*where)));
|
||||
}
|
||||
return 0;
|
||||
|
||||
case SCRATCH:
|
||||
case PC:
|
||||
case CONST_INT:
|
||||
|
|
16
gcc/testsuite/gcc.dg/pr105257.c
Normal file
16
gcc/testsuite/gcc.dg/pr105257.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* PR target/105257 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2" } */
|
||||
/* { dg-additional-options "-fpic" { target fpic } } */
|
||||
|
||||
extern int sigsetjmp (void **, int);
|
||||
void *buf[32];
|
||||
void (*fn) (void);
|
||||
|
||||
const char *
|
||||
bar (void)
|
||||
{
|
||||
sigsetjmp (buf, 0);
|
||||
fn ();
|
||||
return "";
|
||||
}
|
Loading…
Add table
Reference in a new issue