> But in theory this pessimizes code as aggregate_value_p returned true > for this? That is, isn't the bug that we rewrite a possible > return-slot-decl into SSA? (do we do that here?)
Yes, aggregate_value_p returns true for this because the ABI says that this type is returned in memory. And, no, I don't think that this will further pessimize, given that it's already "pessimized" in gimplify_modify_expr_rhs: case CALL_EXPR: /* For calls that return in memory, give *to_p as the CALL_EXPR's return slot so that we don't generate a temporary. */ if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p) && aggregate_value_p (*from_p, *from_p)) { bool use_target; if (!(rhs_predicate_for (*to_p))(*from_p)) /* If we need a temporary, *to_p isn't accurate. */ use_target = false; /* It's OK to use the return slot directly unless it's an NRV. */ else if (TREE_CODE (*to_p) == RESULT_DECL && DECL_NAME (*to_p) == NULL_TREE && needs_to_live_in_memory (*to_p)) use_target = true; else if (is_gimple_reg_type (TREE_TYPE (*to_p)) || (DECL_P (*to_p) && DECL_REGISTER (*to_p))) /* Don't force regs into memory. */ use_target = false; -- Eric Botcazou