[Mlir-commits] [mlir] [MLIR][SCF] Add checks to verify that the pipeliner schedule is correct. (PR #77083)
Rik Huijzer
llvmlistbot at llvm.org
Mon Jan 8 13:41:55 PST 2024
================
@@ -330,6 +339,39 @@ LoopPipelinerInternal::getDefiningOpAndDistance(Value value) {
return {def, distance};
}
+/// Compute unrolled cycles of each op and verify that each op is scheduled
+/// after its operands (modulo the distance between producer and consumer).
+bool LoopPipelinerInternal::verifySchedule() {
+ int64_t numCylesPerIter = opOrder.size();
+ // Pre-compute the unrolled cycle of each op.
+ DenseMap<Operation *, int64_t> unrolledCyles;
+ for (int64_t cycle = 0; cycle < numCylesPerIter; cycle++) {
+ Operation *def = opOrder[cycle];
+ auto it = stages.find(def);
+ assert(it != stages.end());
+ int64_t stage = it->second;
+ unrolledCyles[def] = cycle + stage * numCylesPerIter;
+ }
+ for (Operation *consumer : opOrder) {
+ int64_t consumerCycle = unrolledCyles[consumer];
+ for (Value operand : consumer->getOperands()) {
+ auto [producer, distance] = getDefiningOpAndDistance(operand);
+ if (!producer)
+ continue;
+ auto it = unrolledCyles.find(producer);
+ // Skip producer coming from outside the loop.
+ if (it == unrolledCyles.end())
+ continue;
+ int64_t producerCycle = it->second;
+ if (consumerCycle < producerCycle - numCylesPerIter * distance) {
+ consumer->emitError("operation scheduled before its operands.");
----------------
rikhuijzer wrote:
```suggestion
consumer->emitError("operation (consumer) scheduled before its operands (producer)");
```
nit: The consumer and producer mention makes the error more clear.
For the dot, I see basically no `emitError` messages in MLIR that end with a dot so probably best to remove that one.
https://github.com/llvm/llvm-project/pull/77083
More information about the Mlir-commits
mailing list