iree icon indicating copy to clipboard operation
iree copied to clipboard

Robustify upstream LICM for zero-trip count loops and other loop kinds

Open qedawkins opened this issue 4 months ago • 1 comments

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:

  1. 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.
  2. 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 }.

qedawkins avatar Oct 11 '24 17:10 qedawkins