Skip to content

[mlir][IR] Fix overload resolution on MSVC build #84589

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions mlir/include/mlir/IR/PatternMatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,10 @@ class RewriterBase : public OpBuilder {
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);
}

Expand All @@ -642,19 +645,22 @@ class RewriterBase : public OpBuilder {
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);
}

/// Find uses of `from` within `block` and replace them with `to`. Also notify
/// 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());
Expand Down
4 changes: 2 additions & 2 deletions mlir/lib/Dialect/Linalg/Transforms/DecomposeLinalgOps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down
4 changes: 2 additions & 2 deletions mlir/lib/IR/PatternMatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion mlir/lib/Transforms/Utils/RegionUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down