Re: [PATCH] xtensa: fix MAX_ISTACK for loopgtz L32R widening
Max Filippov <[email protected]>
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <CAMo8BfLXaVQsS7E5VBO7fMzHuMiq71L9-NCU+h4q=hRGp78AbQ@mail.gmail.com> |
Hi Alexey, On Tue, Aug 11, 2026 at 3:40 AM Alexey Lapshin <[email protected]> wrote: > > Commit 403b0b61f6d4 ("gas: use literals/const16 for xtensa loop > relaxation") replaced loop widening with an L32R-based sequence. > The loopgtz variant of that sequence needs 13 istack entries, but > MAX_ISTACK remained 12, so relaxation of an out-of-range loopgtz > overflowed the instruction stack. Increase MAX_ISTACK and report > overflow with as_fatal that names MAX_ISTACK. Add a test. > > gas/ > * config/xtensa-istack.h (MAX_ISTACK): Increase to 16. Document > requirement. > * config/tc-xtensa.c (istack_push, istack_push_space): Report > stack overflow with as_fatal. > * testsuite/gas/xtensa/loopgtz-relax.d: New test. > * testsuite/gas/xtensa/loopgtz-relax.s: New test source. > --- > gas/config/tc-xtensa.c | 8 ++++++-- > gas/config/xtensa-istack.h | 5 ++++- > gas/testsuite/gas/xtensa/loopgtz-relax.d | 16 ++++++++++++++++ > gas/testsuite/gas/xtensa/loopgtz-relax.s | 10 ++++++++++ > 4 files changed, 36 insertions(+), 3 deletions(-) > create mode 100644 gas/testsuite/gas/xtensa/loopgtz-relax.d > create mode 100644 gas/testsuite/gas/xtensa/loopgtz-relax.s Please resend it in a plain text form against the binutils master. > diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c > index deecbb143d0..0a360223c68 100644 > --- a/gas/config/tc-xtensa.c > +++ b/gas/config/tc-xtensa.c > @@ -12517,7 +12517,9 @@ void > istack_push (IStack *stack, TInsn *insn) > { > int rec = stack->ninsn; > - gas_assert (!istack_full (stack)); > + if (istack_full (stack)) > + as_fatal (_("internal error: instruction stack overflow; " > + "increase MAX_ISTACK")); > stack->insn[rec] = *insn; > stack->ninsn++; > } > @@ -12531,7 +12533,9 @@ istack_push_space (IStack *stack) > { > int rec = stack->ninsn; > TInsn *insn; > - gas_assert (!istack_full (stack)); > + if (istack_full (stack)) > + as_fatal (_("internal error: instruction stack overflow; " > + "increase MAX_ISTACK")); > insn = &stack->insn[rec]; > tinsn_init (insn); > stack->ninsn++; > diff --git a/gas/config/xtensa-istack.h b/gas/config/xtensa-istack.h > index 524f7fa774f..cdea1700842 100644 > --- a/gas/config/xtensa-istack.h > +++ b/gas/config/xtensa-istack.h > @@ -23,7 +23,10 @@ > > #include "xtensa-isa.h" > > -#define MAX_ISTACK 12 > +/* Must hold the largest multi-instruction widening expansion from > + widen_spec_list in xtensa-relax.c. Currently that is the loopgtz > + + L32R sequence (13 entries including LITERAL and LABEL). */ > +#define MAX_ISTACK 16 > #define MAX_INSN_ARGS 64 > > enum itype_enum > diff --git a/gas/testsuite/gas/xtensa/loopgtz-relax.d b/gas/testsuite/gas/xtensa/loopgtz-relax.d > new file mode 100644 > index 00000000000..1374186c6d6 > --- /dev/null > +++ b/gas/testsuite/gas/xtensa/loopgtz-relax.d > @@ -0,0 +1,16 @@ > +#as: > +#objdump: -d > + > +#... > +.*beqz.*a9,.* > +.*bltz.*a9,.* > +.*loopgtz.*a9,.* > +.*rsr.lend.*a9 > +.*wsr.lbeg.*a9 > +.*l32r.*a9,.* > +.*nop > +.*wsr.lend.*a9 > +.*isync > +.*rsr.lcount.*a9 > +.*addi.*a9, a9, 1 > +#... > diff --git a/gas/testsuite/gas/xtensa/loopgtz-relax.s b/gas/testsuite/gas/xtensa/loopgtz-relax.s > new file mode 100644 > index 00000000000..a03528f306c > --- /dev/null > +++ b/gas/testsuite/gas/xtensa/loopgtz-relax.s > @@ -0,0 +1,10 @@ > + .text > + .globl main > + .align 4 > +main: > + loopgtz a9, .Lloop_end > + .rep 200 > + nop > + .endr > +.Lloop_end: > + nop > -- > 2.43.0 > -- Thanks. -- Max