[Mlir-commits] [mlir] [MLIR][SCF] Add checks to verify that the pipeliner schedule is correct. (PR #77083)
Thomas Raoux
llvmlistbot at llvm.org
Tue Jan 9 06:16:29 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.");
----------------
ThomasRaoux wrote:
operation and operands are more commonly used across MLIR so I would prefer not mixing it with producer and consumer. Good point about the dot, removed it.
https://github.com/llvm/llvm-project/pull/77083
More information about the Mlir-commits
mailing list