[Mlir-commits] [mlir] [mlir][spirv] Fix a crash in `spirv::ISubOp::fold` (PR #131570)
Longsheng Mou
llvmlistbot at llvm.org
Sun Mar 16 23:31:26 PDT 2025
https://github.com/CoTinker created https://github.com/llvm/llvm-project/pull/131570
This PR fixes a crash if `spirv.ISub` is not integer type. Fixes #131283.
>From cf2b9514a42360c9fcc3559bb5dba68906545c06 Mon Sep 17 00:00:00 2001
From: Longsheng Mou <longshengmou at gmail.com>
Date: Mon, 17 Mar 2025 14:24:40 +0800
Subject: [PATCH 1/2] [mlir][spirv] Fix a crash in `spirv::ISubOp::fold`
This PR fixes a crash if `spirv.ISub` is not integer type.
---
mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
index b1acfd1a2abed..e36d4b910193e 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp
@@ -476,7 +476,7 @@ OpFoldResult spirv::IMulOp::fold(FoldAdaptor adaptor) {
OpFoldResult spirv::ISubOp::fold(FoldAdaptor adaptor) {
// x - x = 0
if (getOperand1() == getOperand2())
- return Builder(getContext()).getIntegerAttr(getType(), 0);
+ return Builder(getContext()).getZeroAttr(getType());
// According to the SPIR-V spec:
//
>From 80fc5153edcaebbf704968eb6a430e0d05bc709a Mon Sep 17 00:00:00 2001
From: Longsheng Mou <longshengmou at gmail.com>
Date: Mon, 17 Mar 2025 14:29:47 +0800
Subject: [PATCH 2/2] add test
---
mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
index 3a775e209903c..0fd6c18a6c241 100644
--- a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
+++ b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
@@ -593,6 +593,13 @@ func.func @isub_x_x(%arg0: i32) -> i32 {
return %0: i32
}
+// CHECK-LABEL: @isub_vector_x_x
+func.func @isub_vector_x_x(%arg0: vector<3xi32>) -> vector<3xi32> {
+ // CHECK: spirv.Constant dense<0>
+ %0 = spirv.ISub %arg0, %arg0: vector<3xi32>
+ return %0: vector<3xi32>
+}
+
// CHECK-LABEL: @const_fold_scalar_isub_normal
func.func @const_fold_scalar_isub_normal() -> (i32, i32, i32) {
%c5 = spirv.Constant 5 : i32
More information about the Mlir-commits
mailing list