iree
iree copied to clipboard
Robustify upstream LICM for zero-trip count loops and other loop kinds
Currently the upstream pass for loop invariant code motion performs hoisting on all loops independent of loop type or loop bounds. This has two issues:
- This allows hoisting out of
scf.forall
ops which are distributed loops. Whether this operation ends up as a loop depends on the processor ID mapping attached to the op which is resolved later in compilation, so hoisting is not possible until then. Additionally, hoisting out of distributed loops complicates determining memory spaces for bufferization because it becomes harder to determine where a write conflict is occurring. - Hoisting any operation out of a zero-trip count loop causes the hoisted operation to potentially do work that wasn't needed. Hoisting needs to either have a guarantee that the loop has at least one trip or wrap the loop in a
scf.if (loop_will_happen) { hoisted_code; loop }
.