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.