On Mon, Oct 29, 2012 at 1:03 AM, Jan Hubicka <hubi...@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 <j...@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