[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
This commit is contained in:
River Riddle 2020-04-06 11:04:22 -07:00
parent 0731132888
commit ae9edbcea2
2 changed files with 16 additions and 16 deletions

View File

@ -605,7 +605,7 @@ private:
};
inline raw_ostream &operator<<(raw_ostream &os, Operation &op) {
op.print(os);
op.print(os, OpPrintingFlags().useLocalScope());
return os;
}

View File

@ -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 << "<<UNLINKED OPERATION>>\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) {