https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70760
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Where _1(D) is
# PT =
struct __single_object & _1(D) = <retval>;
This is in a function deemed local (a ISRA specialization) and thus it looks
like we think there are no callers.
There are indeed callers but to different ISRA specializations. I suppose
(again) it is IPA ICF that merges them.
There seems to be a disconnect between what versioning does to DECL_RESULT
(and DECL_BY_REFERENCE) and what IPA PTA does vs. non-IPA PTA with regard
to such results. non-IPA just looks at gimple_call_return_slot_opt_p
while IPA only looks at DECL_BY_REFERENCE.
Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c (revision 235404)
+++ gcc/tree-ssa-structalias.c (working copy)
@@ -4658,9 +4658,11 @@ find_func_aliases_for_call (struct funct
/* If we pass the result decl by reference, honor that. */
if (lhsop
- && fndecl
- && DECL_RESULT (fndecl)
- && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
+ && ((fndecl
+ && DECL_RESULT (fndecl)
+ && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
+ || (gimple_call_return_slot_opt_p (t)
+ && TREE_ADDRESSABLE (TREE_TYPE (lhsop)))))
{
struct constraint_expr lhs;
struct constraint_expr *rhsp;
fixes that but the following should also work (but is obviously less safe).
Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c (revision 235404)
+++ gcc/tree-ssa-structalias.c (working copy)
@@ -4658,9 +4658,8 @@ find_func_aliases_for_call (struct funct
/* If we pass the result decl by reference, honor that. */
if (lhsop
- && fndecl
- && DECL_RESULT (fndecl)
- && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
+ && gimple_call_return_slot_opt_p (t)
+ && TREE_ADDRESSABLE (TREE_TYPE (lhsop)))
{
struct constraint_expr lhs;
struct constraint_expr *rhsp;
so can you test the latter on your app? I'm giving it IPA PTA + LTO bootstrap
testing.