diff --git a/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp b/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp --- a/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp +++ b/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp @@ -607,18 +607,9 @@ continue; } - // No conflict if the op interface says so. - if (auto bufferizableOp = options.dynCastBufferizableOp(readingOp)) - if (bufferizableOp.isNotConflicting(uRead, uConflictingWrite, state)) - continue; - - if (conflictingWritingOp != readingOp) - if (auto bufferizableOp = - options.dynCastBufferizableOp(conflictingWritingOp)) - if (bufferizableOp.isNotConflicting(uRead, uConflictingWrite, state)) - continue; - // Check all possible last writes. + bool foundConflict = false; + Value conflictLastWrite; for (Value lastWrite : lastWrites) { // No conflict if the conflicting write happens before the last // write. @@ -645,13 +636,32 @@ if (aliasingOpResult.size() == 1 && aliasingOpResult[0] == lastWrite) continue; - // All requirements are met. Conflict found! + // All requirements are met. Conflict found! But the op interface can + // still override this decision. + foundConflict = true; + conflictLastWrite = lastWrite; + break; + } - if (options.printConflicts) - annotateConflict(uRead, uConflictingWrite, lastWrite); + if (!foundConflict) + // Continue if no conflict found. + continue; - return true; - } + // No conflict if the op interface says so. + if (auto bufferizableOp = options.dynCastBufferizableOp(readingOp)) + if (bufferizableOp.isNotConflicting(uRead, uConflictingWrite, state)) + continue; + + if (conflictingWritingOp != readingOp) + if (auto bufferizableOp = + options.dynCastBufferizableOp(conflictingWritingOp)) + if (bufferizableOp.isNotConflicting(uRead, uConflictingWrite, state)) + continue; + + // Report the conflict. + if (options.printConflicts) + annotateConflict(uRead, uConflictingWrite, conflictLastWrite); + return true; } }