[Mlir-commits] [mlir] c47042c - [mlir][SPRIV][NFC] Avoid rollback in `TypeCastingOpPattern` (#136284)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sat Apr 19 01:01:53 PDT 2025
Author: Matthias Springer
Date: 2025-04-19T10:01:50+02:00
New Revision: c47042c5b3f5e87761715a9277712721512cd48d
URL: https://github.com/llvm/llvm-project/commit/c47042c5b3f5e87761715a9277712721512cd48d
DIFF: https://github.com/llvm/llvm-project/commit/c47042c5b3f5e87761715a9277712721512cd48d.diff
LOG: [mlir][SPRIV][NFC] Avoid rollback in `TypeCastingOpPattern` (#136284)
This pattern used to create an op and then attached the converted
rounding mode attribute. When the latter failed, the pattern aborted and
a rollback was triggered.
This commit inverses the logic: the converted rounding mode is computed
first, so that no changes have to be rolled back.
Note: This is in preparation of the One-Shot Dialect Conversion
refactoring.
Added:
Modified:
mlir/lib/Conversion/ArithToSPIRV/ArithToSPIRV.cpp
Removed:
################################################################################
diff --git a/mlir/lib/Conversion/ArithToSPIRV/ArithToSPIRV.cpp b/mlir/lib/Conversion/ArithToSPIRV/ArithToSPIRV.cpp
index 9c4dfa27b1447..434d7df853a5e 100644
--- a/mlir/lib/Conversion/ArithToSPIRV/ArithToSPIRV.cpp
+++ b/mlir/lib/Conversion/ArithToSPIRV/ArithToSPIRV.cpp
@@ -847,24 +847,28 @@ struct TypeCastingOpPattern final : public OpConversionPattern<Op> {
// Then we can just erase this operation by forwarding its operand.
rewriter.replaceOp(op, adaptor.getOperands().front());
} else {
- auto newOp = rewriter.template replaceOpWithNewOp<SPIRVOp>(
- op, dstType, adaptor.getOperands());
+ // Compute new rounding mode (if any).
+ std::optional<spirv::FPRoundingMode> rm = std::nullopt;
if (auto roundingModeOp =
dyn_cast<arith::ArithRoundingModeInterface>(*op)) {
if (arith::RoundingModeAttr roundingMode =
roundingModeOp.getRoundingModeAttr()) {
- if (auto rm =
- convertArithRoundingModeToSPIRV(roundingMode.getValue())) {
- newOp->setAttr(
- getDecorationString(spirv::Decoration::FPRoundingMode),
- spirv::FPRoundingModeAttr::get(rewriter.getContext(), *rm));
- } else {
+ if (!(rm =
+ convertArithRoundingModeToSPIRV(roundingMode.getValue()))) {
return rewriter.notifyMatchFailure(
op->getLoc(),
llvm::formatv("unsupported rounding mode '{0}'", roundingMode));
}
}
}
+ // Create replacement op and attach rounding mode attribute (if any).
+ auto newOp = rewriter.template replaceOpWithNewOp<SPIRVOp>(
+ op, dstType, adaptor.getOperands());
+ if (rm) {
+ newOp->setAttr(
+ getDecorationString(spirv::Decoration::FPRoundingMode),
+ spirv::FPRoundingModeAttr::get(rewriter.getContext(), *rm));
+ }
}
return success();
}
More information about the Mlir-commits
mailing list