Why is the pass for loop dominant in SCF/transform?

I’m a newbie for MLIR and curious about scf.for / while loop transform pass.
When I tried to understood the scf.for / while transform pass, I saw the some facts.
Most of the transform passes are for loops, and there is no transform for while loops. (only have a oneToNTypeConversion). Just, there was a pass to convert scf for loop into while loop. Here, my question is as follows.

  1. Why do most of the transformations for loops exist?
  2. Is for loop better than while loop? Other compilers have a while loop related canonization pass, but it does not seem to be in the scf of mlir.
  3. Is there any clear distinction between optimization (Transform, analysis) that can only be applied to While and optimization that can only be applied to For?
  4. If anyone knows about other compilers, I would appreciate it if you could answer me. Mainly, what kind of case is the dominant use of optimization pass for one type of loop (for or while)?

Just speculating, but the reason why you are seeing more scf.for op related transforms than scf.while op related transforms may be:

  • In many cases, scf.for loops are sufficient (e.g., tiling). I did not run into a situation where I really needed an scf.while loop so far.
  • scf.while loops are more complex than scf.for loops: they have two regions. It is easier to make mistakes. When I write scf.for transforms (e.g., the bufferization implementation), I often get it right the first time. When I write scf.while transforms, I rarely get it right the first time. So users may be reluctant to use the op.
1 Like

Thanks for your comment! I have a more question about scf-for-to-while.

  • Is there any problem to apply scf-for-to-while pass after all applicable for loop optmization? In other words, can scf-for-to-while cover any form of for loop?
  • Current “scf.for” loop canonicalization and specialization, When I ran the example of these passes, It seemed to be executed by including “affine.ops”. (ex. affine.min / max). for loop that do not include affine, it seems that they cannot be converted to a Canonical form, but in this case, should I implement it myself?