aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2023-08-13 03:14:11 +0200
committerHans-Peter Nilsson <hp@bitrange.com>2023-08-14 04:05:16 +0200
commit9568ff597e8190b219564b912a4f608c9b95cf13 (patch)
treecf1021d6afe3e0af8fead2de9a8de04b0fc9b3a0
parenta99f3d0c8f5d4a2d43e1dc26e591f7ea838b5110 (diff)
downloadgcc-9568ff597e8190b219564b912a4f608c9b95cf13.zip
gcc-9568ff597e8190b219564b912a4f608c9b95cf13.tar.gz
gcc-9568ff597e8190b219564b912a4f608c9b95cf13.tar.bz2
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.
-rw-r--r--gcc/config/mmix/predicates.md12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/config/mmix/predicates.md b/gcc/config/mmix/predicates.md
index 4a9b017..64e77fa 100644
--- a/gcc/config/mmix/predicates.md
+++ b/gcc/config/mmix/predicates.md
@@ -171,4 +171,14 @@
(match_code "plus")
(match_code "reg" "0")
(match_code "const_int" "1")
- (match_test "XEXP (op, 0) == stack_pointer_rtx"))))
+ (ior
+ (match_test "XEXP (op, 0) == stack_pointer_rtx")
+ ;; We can temporarily have a FP+offset here, where we (for FP)
+ ;; accept only FP and the equivalent elimination of SP+offset.
+ ;; See lra_eliminate_regs_1 in lra-eliminations.cc c:a line 370:
+ ;; "rtx to = subst_p ? ep->to_rtx : ep->from_rtx;"
+ (and
+ (match_test "lra_in_progress")
+ (ior
+ (match_test "XEXP (op, 0) == hard_frame_pointer_rtx")
+ (match_test "XEXP (op, 0) == frame_pointer_rtx")))))))