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.

Reply via email to