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