On Thu, 25 Oct 2012, Jan Hubicka wrote:

> > > +/* For operands of load/stores estimate cost of the address computations
> > > +   involved.  */
> > > +
> > > +static int
> > > +estimate_operand_cost (tree op)
> > > +{
> > > +  int cost = 0;
> > > +  while (handled_component_p (op))
> > > +    {
> > > +      cost += estimate_ref_cost (op);
> > > +      op = TREE_OPERAND (op, 0);
> > > +    }
> > > +  /* account (TARGET_)MEM_REF.  */
> > > +  return cost + estimate_ref_cost (op);
> > 
> > ICK ...
> > 
> > Why not sth as simple as
> > 
> >      return num_ssa_operands (stmt, SSA_OP_USE);
> > 
> > ?  a[1][2] and b[2] really have the same cost, variable length
> > objects have extra SSA operands in ARRAY_REF/COMPONENT_REF for
> > the size.  Thus, stmt cost somehow should reflect the number
> > of dependent stmts.
> > 
> > So in estimate_num_insns I'd try
> > 
> > int
> > estimate_num_insns (gimple stmt, eni_weights *weights)
> > {
> >   unsigned cost, i;
> >   enum gimple_code code = gimple_code (stmt);
> >   tree lhs;
> >   tree rhs;
> > 
> >   switch (code)
> >   {
> >    case GIMPLE_ASSIGN:
> >     /* Initialize with the number of SSA uses, one is free.  */
> >     cost = num_ssa_operands (stmt, SSA_OP_USE);
> >     if (cost > 1)
> >       --cost;
> > 
> >   ...
> 
> Hmm, also in ASM/call/return?
We have lots of special casing in the call / return / asm case already,
so to ...

>  It will definitely make quite a fuzz into the cost metric

... not do this too much I'd even restrict it to memory loads / stores
(for your address cost).  Maybe also for calls (they can have memory
loads as arguments and store location), or asms.

> by making a=b+c to have cost of 3 instead of 1 as it have now.  I am not 100% 
> sure if
> a+b should be more expensive than a+1.

Yeah, that's why I made it num_ssa_operands - 1 ;)  Also because
of SSA name = SSA name considered to having cost 0.

> I can give that a try and we will see after re-tunning how well it works.  
> Diagonal walk
> of multi-dimensional array, i.e. a[b][b][b] will be mis-accounted, too, right?

Well, it has 3 SSA operands but also three multiplications.

I'd say try it for loads / stores in GIMPLE_ASSIGNs only for now.
Or slightly advanced, count the number of SSA names in each memory
operand (you can't use num_ssa_operands then but have to resort to
tree walks like your patch does, just less "special"-casing)

Richard.

Reply via email to