From ae9edbcea2451a1b0456db14fbfb996916de783f Mon Sep 17 00:00:00 2001 From: River Riddle Date: Mon, 6 Apr 2020 11:04:22 -0700 Subject: [PATCH] [mlir][AsmPrinter] Change value numbering for local scope to be the next isolated operation. Summary: This revision updates the value numbering when printing to number from the next parent operation that is isolated from above. This is the highest level to number from that still ensures thread-safety. This revision also changes the behavior of Operator::operator<< to use local scope to avoid thread races when numbering operations. Differential Revision: https://reviews.llvm.org/D77525 --- mlir/include/mlir/IR/Operation.h | 2 +- mlir/lib/IR/AsmPrinter.cpp | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mlir/include/mlir/IR/Operation.h b/mlir/include/mlir/IR/Operation.h index 41838451329b..d896c435744f 100644 --- a/mlir/include/mlir/IR/Operation.h +++ b/mlir/include/mlir/IR/Operation.h @@ -605,7 +605,7 @@ private: }; inline raw_ostream &operator<<(raw_ostream &os, Operation &op) { - op.print(os); + op.print(os, OpPrintingFlags().useLocalScope()); return os; } diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp index f66d26140f84..498c23a8a3e5 100644 --- a/mlir/lib/IR/AsmPrinter.cpp +++ b/mlir/lib/IR/AsmPrinter.cpp @@ -2344,23 +2344,23 @@ void Value::printAsOperand(raw_ostream &os, AsmState &state) { } void Operation::print(raw_ostream &os, OpPrintingFlags flags) { - // Handle top-level operations or local printing. - if (!getParent() || flags.shouldUseLocalScope()) { - AsmState state(this); - OperationPrinter(os, flags, state.getImpl()).print(this); - return; - } + // Find the operation to number from based upon the provided flags. + Operation *printedOp = this; + bool shouldUseLocalScope = flags.shouldUseLocalScope(); + do { + // If we are printing local scope, stop at the first operation that is + // isolated from above. + if (shouldUseLocalScope && printedOp->isKnownIsolatedFromAbove()) + break; - Operation *parentOp = getParentOp(); - if (!parentOp) { - os << "<>\n"; - return; - } - // Get the top-level op. - while (auto *nextOp = parentOp->getParentOp()) - parentOp = nextOp; + // Otherwise, traverse up to the next parent. + Operation *parentOp = printedOp->getParentOp(); + if (!parentOp) + break; + printedOp = parentOp; + } while (true); - AsmState state(parentOp); + AsmState state(printedOp); print(os, state, flags); } void Operation::print(raw_ostream &os, AsmState &state, OpPrintingFlags flags) {