https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105554

--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #7)
> (In reply to Martin Liška from comment #6)
> > We fail in the param assignment:
> > 
> > (gdb) pp x
> > (reg:V4DI 82)
> > (gdb) pp y
> > (mem/c:BLK (reg/f:DI 76 virtual-incoming-args) [1 x+0 S32 A256])
> > 
> > So we will likely need something similar to what we have in tree-inline.cc:
> > 
> >   5928    /* For vector typed decls make sure to update DECL_MODE according
> >   5929       to the new function context.  */
> >   5930    if (VECTOR_TYPE_P (TREE_TYPE (copy)))
> >   5931      SET_DECL_MODE (copy, TYPE_MODE (TREE_TYPE (copy)));
> > 
> > @Richi: Do you have a clue where to adjust it?
> 
> I think it goes wrong in use_register_for_decl (called from
> assign_parm_setup_block).
> 
> diff --git a/gcc/function.cc b/gcc/function.cc
> index d975b001ec9..b54f9b33c6a 100644
> --- a/gcc/function.cc
> +++ b/gcc/function.cc
> @@ -2229,7 +2229,9 @@ use_register_for_decl (const_tree decl)
>      }
>  
>    /* Only register-like things go in registers.  */
> -  if (DECL_MODE (decl) == BLKmode)
> +  if (DECL_MODE (decl) == BLKmode
> +      || (VECTOR_TYPE_P (TREE_TYPE (decl))
> +         && TYPE_MODE (TREE_TYPE (decl)) == BLKmode))
>      return false;
>  
>    /* If -ffloat-store specified, don't put explicit float variables
> 
> fixes the ICE, not sure if we should adjust the PARM_DECLs mode somewhere
> in target cloning instead though?

Like in copy_arguments_nochange?

Reply via email to