> 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

Reply via email to