On Mon, Oct 29, 2012 at 1:03 AM, Jan Hubicka <[email protected]> wrote:
> Hi,
> this patch makes optimizer to predict &this->field to be optimized out.
> The main motivation for this is to make destructors that only calls destructor
> of inner type to be inlined, even in the cold regions.
>
> Bootstrapped/regtested x86_64-linux. Comitted.
>
> 2012-10-28 Jan Hubicka <[email protected]>
>
> * ipa-inline-analysis.c (eliminated_by_inlining_prob): Handle
> &this->field expressions.
>
> Index: ipa-inline-analysis.c
> ===================================================================
> --- ipa-inline-analysis.c (revision 192898)
> +++ ipa-inline-analysis.c (working copy)
> @@ -1567,6 +1567,7 @@ eliminated_by_inlining_prob (gimple stmt
> if (gimple_assign_rhs_code (stmt) == CONVERT_EXPR
> || gimple_assign_rhs_code (stmt) == NOP_EXPR
> || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
> + || gimple_assign_rhs_code (stmt) == ADDR_EXPR
> || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
Please cache gimple_assign_rhs_code somewhere ...
> {
> tree rhs = gimple_assign_rhs1 (stmt);
> @@ -1584,6 +1585,20 @@ eliminated_by_inlining_prob (gimple stmt
> /* Reads of parameter are expected to be free. */
> if (unmodified_parm (stmt, inner_rhs))
> rhs_free = true;
> + /* Match expressions of form &this->field. Those will most likely
> + combine with something upstream after inlining. */
> + else if (TREE_CODE (inner_rhs) == ADDR_EXPR)
> + {
> + tree op = get_base_address (TREE_OPERAND (inner_rhs, 0));
> + if (TREE_CODE (op) == PARM_DECL)
> + rhs_free = true;
> + else if (TREE_CODE (op) == MEM_REF)
> + {
> + op = get_base_address (TREE_OPERAND (op, 0));
Not necessary, just check
TREE_CODE (op) == SSA_NAME
&& unmodif ...
> + if (unmodified_parm (stmt, op))
> + rhs_free = true;
> + }
> + }
>
> /* When parameter is not SSA register because its address is taken
> and it is just copied into one, the statement will be
> completely