[Bug middle-end/90501] [10 regression] ICE: address taken, but ADDRESSABLE bit not set
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu May 16 10:14:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90501
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we are already considering _some_ LHS of return-slot-opt calls as having
their address taken:
if (visit_addr
&& gimple_call_return_slot_opt_p (call_stmt)
&& gimple_call_lhs (call_stmt) != NULL_TREE
&& TREE_ADDRESSABLE (TREE_TYPE (gimple_call_lhs (call_stmt))))
ret |= visit_addr (stmt, gimple_call_lhs (call_stmt),
gimple_call_lhs (call_stmt), data);
but only those with TREE_ADDRESSABLE type (non-copyable ones). So not sure
if the error lies with the D frontend here, I don't remember much around
the design of the return-slot opt.
So we can either try to fixup during inlining (we already do for the
!DECL_BY_REFERENCE case) or we can avoid removing TREE_ADDRESSABLE by
adjusting the above.
IIRC at some point build_fold_addr_expr marked the base addressable,
that might explain the lack of doing this during inlining.
Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c (revision 271282)
+++ gcc/tree-inline.c (working copy)
@@ -3540,6 +3540,7 @@ declare_return_variable (copy_body_data
taken by alias analysis. */
gcc_assert (TREE_CODE (return_slot) != SSA_NAME);
var = return_slot_addr;
+ mark_addressable (return_slot);
}
else
{
fixes the testcase.
More information about the Gcc-bugs
mailing list