diff options
author | Matthias Springer <me@m-sp.org> | 2024-03-11 17:36:18 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-11 17:36:18 +0900 |
commit | f1aa7837884c745ede497e365cc75d5581ecc714 (patch) | |
tree | 24f0fde1cb4d3968788201fe04e4336d6463b461 | |
parent | d4569d42b5cb8ba076f0115d3d21d89f68e6ce9d (diff) | |
download | llvm-f1aa7837884c745ede497e365cc75d5581ecc714.zip llvm-f1aa7837884c745ede497e365cc75d5581ecc714.tar.gz llvm-f1aa7837884c745ede497e365cc75d5581ecc714.tar.bz2 |
[mlir][IR] Fix overload resolution on MSVC build (#84589)
#82629 added additional overloads to `replaceAllUsesWith` and
`replaceUsesWithIf`. This caused a build breakage with MSVC when called
with ops that can implicitly convert to `Value`.
```
external/llvm-project/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp(881): error C2666: 'mlir::RewriterBase::replaceAllUsesWith': 2 overloads have similar conversions
external/llvm-project/mlir/include\mlir/IR/PatternMatch.h(631): note: could be 'void mlir::RewriterBase::replaceAllUsesWith(mlir::Operation *,mlir::ValueRange)'
external/llvm-project/mlir/include\mlir/IR/PatternMatch.h(626): note: or 'void mlir::RewriterBase::replaceAllUsesWith(mlir::ValueRange,mlir::ValueRange)'
external/llvm-project/mlir/include\mlir/IR/PatternMatch.h(616): note: or 'void mlir::RewriterBase::replaceAllUsesWith(mlir::Value,mlir::Value)'
external/llvm-project/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp(882): note: while trying to match the argument list '(mlir::tensor::ExtractSliceOp, T)'
with
[
T=mlir::Value
]
```
Note: The LLVM build bots (Linux and Windows) did not break, this seems
to be an issue with `Tools\MSVC\14.29.30133\bin\HostX64\x64\cl.exe`.
This change renames the newly added overloads to `replaceAllOpUsesWith`
and `replaceOpUsesWithIf`.
-rw-r--r-- | mlir/include/mlir/IR/PatternMatch.h | 20 | ||||
-rw-r--r-- | mlir/lib/Dialect/Linalg/Transforms/DecomposeLinalgOps.cpp | 4 | ||||
-rw-r--r-- | mlir/lib/IR/PatternMatch.cpp | 4 | ||||
-rw-r--r-- | mlir/lib/Transforms/Utils/RegionUtils.cpp | 2 |
4 files changed, 18 insertions, 12 deletions
diff --git a/mlir/include/mlir/IR/PatternMatch.h b/mlir/include/mlir/IR/PatternMatch.h index 49544c4..ef53a0b 100644 --- a/mlir/include/mlir/IR/PatternMatch.h +++ b/mlir/include/mlir/IR/PatternMatch.h @@ -648,7 +648,10 @@ public: for (auto it : llvm::zip(from, to)) replaceAllUsesWith(std::get<0>(it), std::get<1>(it)); } - void replaceAllUsesWith(Operation *from, ValueRange to) { + // Note: This function cannot be called `replaceAllUsesWith` because the + // overload resolution, when called with an op that can be implicitly + // converted to a Value, would be ambiguous. + void replaceAllOpUsesWith(Operation *from, ValueRange to) { replaceAllUsesWith(from->getResults(), to); } @@ -662,9 +665,12 @@ public: void replaceUsesWithIf(ValueRange from, ValueRange to, function_ref<bool(OpOperand &)> functor, bool *allUsesReplaced = nullptr); - void replaceUsesWithIf(Operation *from, ValueRange to, - function_ref<bool(OpOperand &)> functor, - bool *allUsesReplaced = nullptr) { + // Note: This function cannot be called `replaceOpUsesWithIf` because the + // overload resolution, when called with an op that can be implicitly + // converted to a Value, would be ambiguous. + void replaceOpUsesWithIf(Operation *from, ValueRange to, + function_ref<bool(OpOperand &)> functor, + bool *allUsesReplaced = nullptr) { replaceUsesWithIf(from->getResults(), to, functor, allUsesReplaced); } @@ -672,9 +678,9 @@ public: /// the listener about every in-place op modification (for every use that was /// replaced). The optional `allUsesReplaced` flag is set to "true" if all /// uses were replaced. - void replaceUsesWithinBlock(Operation *op, ValueRange newValues, Block *block, - bool *allUsesReplaced = nullptr) { - replaceUsesWithIf( + void replaceOpUsesWithinBlock(Operation *op, ValueRange newValues, + Block *block, bool *allUsesReplaced = nullptr) { + replaceOpUsesWithIf( op, newValues, [block](OpOperand &use) { return block->getParentOp()->isProperAncestor(use.getOwner()); diff --git a/mlir/lib/Dialect/Linalg/Transforms/DecomposeLinalgOps.cpp b/mlir/lib/Dialect/Linalg/Transforms/DecomposeLinalgOps.cpp index 1658ea6..999359c 100644 --- a/mlir/lib/Dialect/Linalg/Transforms/DecomposeLinalgOps.cpp +++ b/mlir/lib/Dialect/Linalg/Transforms/DecomposeLinalgOps.cpp @@ -370,8 +370,8 @@ DecomposeLinalgOp::matchAndRewrite(GenericOp genericOp, scalarReplacements.push_back( residualGenericOpBody->getArgument(num + origNumInputs)); bool allUsesReplaced = false; - rewriter.replaceUsesWithinBlock(peeledScalarOperation, scalarReplacements, - residualGenericOpBody, &allUsesReplaced); + rewriter.replaceOpUsesWithinBlock(peeledScalarOperation, scalarReplacements, + residualGenericOpBody, &allUsesReplaced); assert(!allUsesReplaced && "peeled scalar operation is erased when it wasnt expected to be"); } diff --git a/mlir/lib/IR/PatternMatch.cpp b/mlir/lib/IR/PatternMatch.cpp index 0a88e40..4079ccc 100644 --- a/mlir/lib/IR/PatternMatch.cpp +++ b/mlir/lib/IR/PatternMatch.cpp @@ -122,7 +122,7 @@ void RewriterBase::replaceOp(Operation *op, ValueRange newValues) { rewriteListener->notifyOperationReplaced(op, newValues); // Replace all result uses. Also notifies the listener of modifications. - replaceAllUsesWith(op, newValues); + replaceAllOpUsesWith(op, newValues); // Erase op and notify listener. eraseOp(op); @@ -141,7 +141,7 @@ void RewriterBase::replaceOp(Operation *op, Operation *newOp) { rewriteListener->notifyOperationReplaced(op, newOp); // Replace all result uses. Also notifies the listener of modifications. - replaceAllUsesWith(op, newOp->getResults()); + replaceAllOpUsesWith(op, newOp->getResults()); // Erase op and notify listener. eraseOp(op); diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp index eff8acd..e25867b 100644 --- a/mlir/lib/Transforms/Utils/RegionUtils.cpp +++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp @@ -161,7 +161,7 @@ SmallVector<Value> mlir::makeRegionIsolatedFromAbove( rewriter.setInsertionPointToStart(newEntryBlock); for (auto *clonedOp : clonedOperations) { Operation *newOp = rewriter.clone(*clonedOp, map); - rewriter.replaceUsesWithIf(clonedOp, newOp->getResults(), replaceIfFn); + rewriter.replaceOpUsesWithIf(clonedOp, newOp->getResults(), replaceIfFn); } rewriter.mergeBlocks( entryBlock, newEntryBlock, |