https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83758
--- Comment #28 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- (In reply to acsawdey from comment #27) > So, I think the problem is that the rtx given by > crtl->args.internal_arg_pointer is not canonical as expected. So near the > beginning of vt_add_function_parameter where it is using == to compare parts > of the incoming arg rtx to this, it fails but rtx_equal_p does not. This > small patch resolves the go bootstrap issues: > > Index: gcc/var-tracking.c > =================================================================== > --- gcc/var-tracking.c (revision 257159) > +++ gcc/var-tracking.c (working copy) > @@ -9668,10 +9668,10 @@ > into MEMs based on the argument pointer, so that incoming doesn't > depend on a pseudo. */ > if (MEM_P (incoming) > - && (XEXP (incoming, 0) == crtl->args.internal_arg_pointer > + && (rtx_equal_p (XEXP (incoming, 0), crtl->args.internal_arg_pointer) > || (GET_CODE (XEXP (incoming, 0)) == PLUS > - && XEXP (XEXP (incoming, 0), 0) > - == crtl->args.internal_arg_pointer > + && rtx_equal_p (XEXP (XEXP (incoming, 0), 0), > + crtl->args.internal_arg_pointer) > && CONST_INT_P (XEXP (XEXP (incoming, 0), 1))))) > { > HOST_WIDE_INT off = -FIRST_PARM_OFFSET (current_function_decl); Is this because we're using the pseudo-based split-stack code in rs6000_internal_arg_pointer? I'm not sure this test is meaningful in that case: if the hook returns (plus (reg X) (const_int Y)) then presumably any offset applied to the pointer would be (plus (reg X) (const_int Y')), which the code doesn't handle. Or does the hook return a plain pseudo register in this case, without any offset? In that case I'd still have expected the incoming_arg_pointer to be the pseudo rtx, so == ought to work. It would be interesting to know why it doesn't.