MMIX: Handle LRA FP-to-SP-elimination oddity
commit9568ff597e8190b219564b912a4f608c9b95cf13
authorHans-Peter Nilsson <hp@axis.com>
Sun, 13 Aug 2023 01:14:11 +0000 (13 03:14 +0200)
committerHans-Peter Nilsson <hp@bitrange.com>
Mon, 14 Aug 2023 02:05:16 +0000 (14 04:05 +0200)
treecf1021d6afe3e0af8fead2de9a8de04b0fc9b3a0
parenta99f3d0c8f5d4a2d43e1dc26e591f7ea838b5110
MMIX: Handle LRA FP-to-SP-elimination oddity

When LRA is in progress, it can try and validate insns
half-way through frame-pointer (FP) to stack-pointer (SP)
elimination.  Operands have then been substituted where the
offset is from the SP elimination but the register is the
(hard) frame-pointer:

lra-eliminations.cc:lra_eliminate_regs_1:370:
 rtx to = subst_p ? ep->to_rtx : ep->from_rtx;

In this regard reload played nicely.  Unfortunately, the
frame_pointer_operand predicate in mmix/predicates.md barfs
on such an address.  This broke the use of the MMIX
frame_pointer_operand predicate (and the Yf constraint),
used only in the nonlocal_goto_receiver expansion (which is
used in e.g. code generated for C++ "catch").

Force MMIX frame_pointer_operand to accept an FP+offset for
the duration of lra_in_progress.

* config/mmix/predicates.md (frame_pointer_operand): Handle FP+offset
when lra_in_progress.
gcc/config/mmix/predicates.md