Patchwork Make inliner to predict &this->field to be optimized out

login
register
mail settings
Submitter Jan Hubicka
Date Oct. 29, 2012, 12:03 a.m.
Message ID <20121029000349.GD25006@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/194763/
State New
Headers show

Comments

Jan Hubicka - Oct. 29, 2012, 12:03 a.m.
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  <jh@suse.cz>

	* ipa-inline-analysis.c (eliminated_by_inlining_prob): Handle
	&this->field expressions.
Richard Guenther - Oct. 29, 2012, 1:52 p.m.
On Mon, Oct 29, 2012 at 1:03 AM, Jan Hubicka <hubicka@ucw.cz> 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  <jh@suse.cz>
>
>         * 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
Jan Hubicka - Oct. 29, 2012, 3:03 p.m.
> >           {
> >             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 ...

Hmm, right, I can't have non-SSA there.  Will fix that,
thanks!
Honza

Patch

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)
 	  {
 	    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));
+		    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