On Fri, Mar 1, 2013 at 3:56 PM, Eric Botcazou <ebotca...@adacore.com> wrote: >> 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;
Ah, ok. Patch is ok then. Thanks, Richard. > -- > Eric Botcazou