From: Hans-Peter Nilsson Date: Sun, 13 Aug 2023 01:14:11 +0000 (+0200) Subject: MMIX: Handle LRA FP-to-SP-elimination oddity X-Git-Tag: basepoints/gcc-15~6951 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9568ff597e8190b219564b912a4f608c9b95cf13;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/config/mmix/predicates.md b/gcc/config/mmix/predicates.md index 4a9b0177a786..64e77fa92d00 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")))))))