Michael Matz <m...@suse.de> writes: > On Wed, 6 Jul 2011, Richard Sandiford wrote: >> But what I mean is: even with your starting loop, I'm comparing the >> transformation that this code does with the alternative, but rejected, >> transformation of simply treating both addresses as separate ivs. I.e.: >> >> i=0; i < end; i+=1 >> p + i * step; >> q + i * step; >> --> >> n=p; n < p+end; n+=step >> n; >> (q-p) + n; >> >> vs. >> >> i=0; i < end; i+=1 >> p + i * step; >> q + i * step; >> --> >> n=p; n < p+end; n+=step, m+=step >> n; >> m; >> >> It seems like, with this extra code, we're going out of our way to do >> the first, "clever", transformation, instead of doing the second, even >> though both seem to have the same cost in terms of loop operations and >> live registers. So what I'm not sure of is when the first >> transformation is a win over the second. > > It's only a strict win on targets where the addition in "(q-p) + n" can be > hidden in either address generation, or combined with other arithmetic, or > on all targets if (q-p) is a constant.
Agreed on the constant thing. But is it really valid to account for address validity in the !address_p case? I.e. > Otherwise it merely has the same number of adds and live variables. But > if it weren't for deficiencies in downstream optimizers (not hoisting the > subtraction) the first variant is at least not worse than the second on > targets without autoinc. On targets with autoinc obviously the second > variant is better (if the autoinc really comes for free). > > So, sometimes the first is better, sometimes just the same, sometimes > worse :-) Probably the cost function in ivopts could use some > improvements taking at least autoinc into account. The valid address > forms (i.e. if reg+reg is as cheap as reg) should be taken into account > already. ...we currently only check for things like reg+reg in the address_p case, which as discussed, is also the case in which we currently don't apply this transformation for other reasons. The address_p case is also the one in which we take auto-increment into account. That goes back to the question in the original message about whether these uses should be treated as addresses. I suppose the answer's probably "yes", since only a cast is getting in the way. But there's still the separate point that, when not considering addresses, this transformation doesn't seem to be a win, except in the constant case. I suppose what I'm saying is that the: if (use->iv->base_object && cand->iv->base_object && !operand_equal_p (use->iv->base_object, cand->iv->base_object, 0)) return infinite_cost; condition seems to make sense in the !address_p case too. It shouldn't make things worse, and may make things better. Richard