On Fri, Sep 11, 2015 at 10:04:12AM +0100, Ramana Radhakrishnan wrote: > On Fri, Sep 11, 2015 at 10:53:13AM +0200, Bernd Schmidt wrote: > > On 09/10/2015 11:11 PM, Jeff Law wrote: > > >I think that's probably what James is most interested in getting some > > >ideas around -- the cost model. > > > > > >I think the fundamental problem is BRANCH_COST isn't actually relative > > >to anything other than the default value of "1". It doesn't directly > > >correspond to COSTS_N_INSNS or anything else. So while using > > >COSTS_N_INSNS (BRANCH_COST)) would seem to make sense, it actually > > >doesn't. It's not even clear how a value of 10 relates to a value of 1 > > >other than it's more expensive. > > > > > >ifcvt (and others) comparing to magic #s is more than a bit lame. But > > >with BRANCH_COST having no meaning relative to anything else I can see > > >why Richard did things that way. > > > > > >In an ideal world we'd find some mapping from BRANCH_COST that relates > > >to CONST_N_INSNS. I suspect a simple mapping doesn't necessarily exist > > >and we'll likely regress targets with any simplistic mapping. But maybe > > >now is the time to address that fundamental problem and deal with the > > >fallout. > > > > I think the right approach if we want to fix this is a new > > branch_cost_ninsns target hook (maybe with arguments > > taken_percentage, predictability), and gradually move everything to > > use that instead of BRANCH_COST. > > Perhaps providing backends with the entire if-then-else block along > with the above mentioned information being if converted may be another > approach, it allows the backends to analyse what cases are good to > if-convert as per the ISA or micro-architecture and what aren't.
I'm not sure how much of this is likely to be target-dependent and how much can just be abstracted to common ifcvt code resuing rtx_costs. I've been sketching out a rough idea of a more applicable cost model for RTL ifcvt, taking in to consideration what David mentioned regarding the talks at cauldron. The question we want to ask is: Which is preferable between: Before: (COSTS_N_INSNS cost of the compare+branch insns at the tail of the if BB. ??? (possibly) some factor related to BRANCH_COST) + weighted cost of then BB. + (if needed) weighted cost of else BB. After: seq_cost the candidate new sequence. The weighted cost of the two BBs should mix in some idea as to the relative probability that we execute them. The tough part is figuring out how to (reasonably) factor in branch cost. The reason that is tough is that BRANCH_COST is used inconsistently. Normally it is not measured relative to anything, but is compared against magic numbers for optimizations (each of which are really their own question to be posed as above). I don't have a good answer to that, nor a good answer as to what BRANCH_COST should represent in future. The use in the compiler is sort-of consistent with a measurement against instruction counts (i.e. a branch cost of 3 means a branch is equivalent to 3 cheap instructions), but is sometimes just used as a measure of expensive (a branch cost of >= 2 means that abs should be expanded using a sequence of bit operations). I'll look in to how the code in ifcvt starts to look with a modified cost model and get back to you... James