[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