(loop) passes disabled by default

Just wanted to share an observation of something I realised last week. We have quite a few passes that are disable by default. Just looking at the loop passes, then all of these are off by default:

LoopDistribute
LoopFlatten
LoopInterchange
LoopReroll
LoopUnrollAndJam
LoopVersioningLICM
SimpleLoopUnswitch

Some are probably more specific for a use-case and it’s just good to have certain transformations in our toolbox, but I guess what I want to say is that it looks like there are opportunities to get more of these on by default, although I appreciate of course that will involve a bit of work. For example, LoopFlatten (mea culpa) needs a correctness fix, but other than that perhaps not difficult to get enabled. Not sure if LoopReroll is just a benchmark special, but from a quick look that also needs a correctness fix. Interchange and UnrollAndJam would for example be really interesting to get on by default, but not sure if tricky cost modelling business prevents that at the moment. LoopDistribute seems to be getting some TLC (D99596), and don’t know much about the others.

(Apologies if this has been discussed in the Loop Opt WG, I couldn’t find anything after a quick look)

Thanks for surfacing this again. Â

My take here is that this is due to the vast difference in difficulty between implementing something which works on some examples, and something which works on all examples. :) You mention the heuristic problem - which several of these passes have in spades - but there’s also a large number of latent correctness bugs in the various off-by-default passes. The work to get these enabled isn’t infinite, but it’s also not small. To make substantial progress, you’d need to find someone willing to put substantial (months+) of effort into stabilization.Â

As an aside, SimpleLoopUnswitch is enabled by default in the new pass manager. InductiveRangeCheckElimination (e.g. iteration set splitting), also deserves to be on this list.

Philip