[Mlir-commits] [mlir] cc0efa4 - [mlir][SPIR-V] Add folder for spirv.SMulExtended(x, 1) (#214137)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Sep 16 06:17:31 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-09-16T15:17:26+02:00
New Revision: cc0efa4e820e7b54ac97f00021d0cf39cc6915e4
URL: https://github.com/llvm/llvm-project/commit/cc0efa4e820e7b54ac97f00021d0cf39cc6915e4
DIFF: https://github.com/llvm/llvm-project/commit/cc0efa4e820e7b54ac97f00021d0cf39cc6915e4.diff
LOG: [mlir][SPIR-V] Add folder for spirv.SMulExtended(x, 1) (#214137)
Added:
Modified:
mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
index 5d31aef40088b..c344f3ad7f788 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
@@ -250,23 +250,18 @@ struct MulExtendedFold final : OpRewritePattern<MulOp> {
}
};
-using SMulExtendedOpFold = MulExtendedFold<spirv::SMulExtendedOp, true>;
-void spirv::SMulExtendedOp::getCanonicalizationPatterns(
- RewritePatternSet &patterns, MLIRContext *context) {
- patterns.add<SMulExtendedOpFold>(context);
-}
-
-struct UMulExtendedOpXOne final : OpRewritePattern<spirv::UMulExtendedOp> {
- using Base::Base;
+template <typename MulOp>
+struct MulExtendedOpXOne final : OpRewritePattern<MulOp> {
+ using OpRewritePattern<MulOp>::OpRewritePattern;
- LogicalResult matchAndRewrite(spirv::UMulExtendedOp op,
+ LogicalResult matchAndRewrite(MulOp op,
PatternRewriter &rewriter) const override {
Location loc = op.getLoc();
Value lhs = op.getOperand1();
Value rhs = op.getOperand2();
Type constituentType = lhs.getType();
- // umulextended (x, 1) = <x, 0>
+ // [su]mulextended (x, 1) = <x, 0>
if (matchPattern(rhs, m_One())) {
Value zero = spirv::ConstantOp::getZero(constituentType, loc, rewriter);
Value constituents[2] = {lhs, zero};
@@ -279,7 +274,15 @@ struct UMulExtendedOpXOne final : OpRewritePattern<spirv::UMulExtendedOp> {
}
};
+using SMulExtendedOpFold = MulExtendedFold<spirv::SMulExtendedOp, true>;
+using SMulExtendedOpXOne = MulExtendedOpXOne<spirv::SMulExtendedOp>;
+void spirv::SMulExtendedOp::getCanonicalizationPatterns(
+ RewritePatternSet &patterns, MLIRContext *context) {
+ patterns.add<SMulExtendedOpFold, SMulExtendedOpXOne>(context);
+}
+
using UMulExtendedOpFold = MulExtendedFold<spirv::UMulExtendedOp, false>;
+using UMulExtendedOpXOne = MulExtendedOpXOne<spirv::UMulExtendedOp>;
void spirv::UMulExtendedOp::getCanonicalizationPatterns(
RewritePatternSet &patterns, MLIRContext *context) {
patterns.add<UMulExtendedOpFold, UMulExtendedOpXOne>(context);
diff --git a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
index e80145419f8a8..94761086a3f40 100644
--- a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
+++ b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
@@ -521,6 +521,18 @@ func.func @smulextended_x_0(%arg0 : i32) -> !spirv.struct<(i32, i32)> {
return %0 : !spirv.struct<(i32, i32)>
}
+// CHECK-LABEL: @smulextended_x_1
+// CHECK-SAME: (%[[ARG:.*]]: i32)
+func.func @smulextended_x_1(%arg0 : i32) -> !spirv.struct<(i32, i32)> {
+ // CHECK: %[[C0:.*]] = spirv.Constant 0
+ // CHECK: %[[RET:.*]] = spirv.CompositeConstruct %[[ARG]], %[[C0]]
+ %c0 = spirv.Constant 1 : i32
+ %0 = spirv.SMulExtended %arg0, %c0 : !spirv.struct<(i32, i32)>
+
+ // CHECK: return %[[RET]]
+ return %0 : !spirv.struct<(i32, i32)>
+}
+
// CHECK-LABEL: @const_fold_scalar_smulextended
func.func @const_fold_scalar_smulextended() -> (!spirv.struct<(i32, i32)>, !spirv.struct<(i32, i32)>) {
%c5 = spirv.Constant 5 : i32
More information about the Mlir-commits
mailing list