Re: [PATCH 2/2] alpha: keep the exception receiver's gpdisp pair together [PR124495]

Jeffrey Law <[email protected]> Wed, 5 Aug 2026 21:01:57 -0600
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>

On 8/5/2026 9:59 AM, Matt Turner wrote:
> exception_receiver and builtin_setjmp_receiver split into an ldah/lda
> pair that shares a !gpdisp relocation sequence number, so the two insns
> have to stay in 1-1 correspondence.  The first half is an unspec_volatile
> (*ldgp_er_1), but the second half was a plain unspec (*ldgp_er_2), which
> makes the halves unequally deletable: once the landing pad turns out not
> to use $29, the DCE run at the start of the peephole2 pass removes the
> lda and leaves the ldah behind.  The assembler then rejects the result:
>
>    Error: No lda !gpdisp!1188 was found
>
> Compiling C++ with -fassume-sane-operators-new-delete, which is the
> default, makes this much easier to hit, since it lets more of the cleanup
> code in a landing pad be optimized away.
>
> Add an unspec_volatile variant of *ldgp_er_2 and use it for both
> receivers.  The gpdisp pair emitted after a call needs no such treatment:
> there the ldah is part of the call insn and both halves are plain
> unspecs, so they are deleted together.
>
> gcc/ChangeLog:
>
> 	PR target/124495
> 	* config/alpha/alpha.md (UNSPECV_LDGP2): New unspec_volatile.
> 	(*ldgp_er_2_v): New insn.
> 	(*builtin_setjmp_receiver_1): Split the second half of the gpdisp
> 	pair to it instead of *ldgp_er_2.
> 	(*exception_receiver_1): Ditto.
>
> gcc/testsuite/ChangeLog:
>
> 	PR target/124495
> 	* g++.target/alpha/pr124495.C: New test.
Oh the irony given I'm looking at a RISC-V patch that at first glance 
seems to have some of the same kinds of problems that this patch is 
trying to fix on the Alpha :-)  At least i this case it's limited in scope.

I'll push this momentarily.  THanks.

jeff