[Mlir-commits] [mlir] [mlir][SPIR-V] Add folder for spirv.SMulExtended(x, 1) (PR #214137)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Aug 4 22:58:52 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-spirv
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/214137.diff
2 Files Affected:
- (modified) mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp (+13-10)
- (modified) mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir (+12)
``````````diff
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
index 2d5c4d7d3fd0e..ac6704cc51959 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
@@ -246,23 +246,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};
@@ -275,7 +270,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 94d9c53db0bbc..713471821b4bc 100644
--- a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
+++ b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
@@ -502,6 +502,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
``````````
</details>
https://github.com/llvm/llvm-project/pull/214137
More information about the Mlir-commits
mailing list