This bug appears to revolve around whether there is a canonical rtx for internal_arg_pointer in var-tracking. In vt_add_function_parameter() we currently have:
static void vt_add_function_parameter (tree parm) { rtx decl_rtl = DECL_RTL_IF_SET (parm); rtx incoming = DECL_INCOMING_RTL (parm); tree decl; machine_mode mode; poly_int64 offset; dataflow_set *out; decl_or_value dv; if (TREE_CODE (parm) != PARM_DECL) return; if (!decl_rtl || !incoming) return; if (GET_MODE (decl_rtl) == BLKmode || GET_MODE (incoming) == BLKmode) return; /* If there is a DRAP register or a pseudo in internal_arg_pointer, rewrite the incoming location of parameters passed on the stack 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 || (GET_CODE (XEXP (incoming, 0)) == PLUS && 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); if (GET_CODE (XEXP (incoming, 0)) == PLUS) off += INTVAL (XEXP (XEXP (incoming, 0), 1)); incoming = replace_equiv_address_nv (incoming, plus_constant (Pmode, arg_pointer_rtx, off)); } This is looking for crtl->args.internal_arg_pointer within rtx incoming. The problem I am seeing is that the same rtx is there, just not as a pointer to the identical rtx objects, so is not found by the == comparison in the current code. So hence my patch below to switch from == to rtx_equal_p(). If the expression is not rewritten, then the pseudo created for the stack pointer is not preserved and later we run into the assert near the beginning of vt_expand_var_loc_chain(). Bootstrap now passes for languages=c,c++,go on ppc64le. If bootstrap/regtest is ok on ppc64le and x86_64, ok for trunk? 2018-01-29 Aaron Sawdey <acsaw...@linux.vnet.ibm.com> * var-tracking.c (vt_add_function_parameter): Fix comparison of rtx. 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); -- Aaron Sawdey, Ph.D. acsaw...@linux.vnet.ibm.com 050-2/C113 (507) 253-7520 home: 507/263-0782 IBM Linux Technology Center - PPC Toolchain