https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108348
--- Comment #2 from Kewen Lin <linkw at gcc dot gnu.org> --- This is a 32 bit specific issue, the function rs6000_pass_by_reference has: /* Allow -maltivec -mabi=no-altivec without warning. Altivec vector modes only exist for GCC vector types if -maltivec. */ if (TARGET_32BIT && !TARGET_ALTIVEC_ABI && ALTIVEC_VECTOR_MODE (arg.mode)) { if (TARGET_DEBUG_ARG) fprintf (stderr, "function_arg_pass_by_reference: AltiVec\n"); return 1; } It assumes that the altivec is on when we see those altivec vector modes, but it doesn't hold with the option combination for this case. It returns true for rs6000_pass_by_reference, then the following logic of generic code tries to make a copy of the object and pass the address to the function being called, it invokes store_expr for storing to the copy, then triggers ICE. And targetm.calls.function_arg is too late to raise the errors.