On Thu, 2019-12-12 at 15:13 +0000, Richard Sandiford wrote:
> pass_return_slot::execute has:
> 
>             /* Ignore internal functions without direct optabs,
>                those are expanded specially and aggregate_value_p
>                on their result might result in undesirable warnings
>                with some backends.  */
>             && (!gimple_call_internal_p (stmt)
>                 || direct_internal_fn_p (gimple_call_internal_fn (stmt)))
>             && aggregate_value_p (TREE_TYPE (gimple_call_lhs (stmt)),
>                                   gimple_call_fndecl (stmt)))
> 
> But what the comment says applies to directly-mapped internal functions
> too, since they're only used if the target supports them without a
> libcall.
> 
> This was triggering an ICE on the attached testcase.  The svld3 call
> is folded to an IFN_LOAD_LANES, which returns an array of vectors with
> VNx48QImode.  Since no such return type can exist in C, the target hook
> was complaining about an unexpected use of SVE modes.  (And we want to
> keep asserting for that, so that we don't accidentally define an ABI for
> an unexpected corner case.)
> 
> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
> 
> Richard
> 
> 
> 2019-12-12  Richard Sandiford  <richard.sandif...@arm.com>
> 
> gcc/
>       * tree-nrv.c (pass_return_slot::execute): Handle all internal
>       functions the same way, rather than singling out those that
>       aren't mapped directly to optabs.
> 
> gcc/testsuite/
>       * gcc.target/aarch64/sve/acle/general/nrv_1.c: New test.
OK
jeff


Reply via email to