Message ID | 20121029000349.GD25006@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
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
> > { > > 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
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