[llvm] [SPIR-V] Fix crash in SPIRVEmitIntrinsics for llvm.assume with operand bundles (PR #185840)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 11 05:18:57 PDT 2026


https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/185840

>From bdbb72bf75186d015670ffbea5db7235b480e6ee Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 11 Mar 2026 10:13:04 +0100
Subject: [PATCH 1/2] [SPIR-V] Fix crash in SPIRVEmitIntrinsics for llvm.assume
 with operand bundles

---
 llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp |  5 ++--
 llvm/test/CodeGen/SPIRV/assume.ll             | 24 +++++++++++++++----
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index c84f41dada005..4931b16d0f40c 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -2707,8 +2707,9 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
         !(isa<ConstantData>(Op) || isa<ConstantExpr>(Op)))
       continue;
     unsigned OpNo = Op.getOperandNo();
-    if (II && ((II->getIntrinsicID() == Intrinsic::spv_gep && OpNo == 0) ||
-               (II->paramHasAttr(OpNo, Attribute::ImmArg))))
+    if (II &&
+        ((II->getIntrinsicID() == Intrinsic::spv_gep && OpNo == 0) ||
+         (OpNo < II->arg_size() && II->paramHasAttr(OpNo, Attribute::ImmArg))))
       continue;
 
     if (!BPrepared) {
diff --git a/llvm/test/CodeGen/SPIRV/assume.ll b/llvm/test/CodeGen/SPIRV/assume.ll
index fbf12ef184a89..958c774169656 100644
--- a/llvm/test/CodeGen/SPIRV/assume.ll
+++ b/llvm/test/CodeGen/SPIRV/assume.ll
@@ -2,19 +2,35 @@
 ; RUN: llc -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_KHR_expect_assume < %s | FileCheck --check-prefixes=EXT,CHECK %s
 ; RUN: llc -mtriple=spirv32-unknown-unknown < %s | FileCheck --check-prefixes=NOEXT,CHECK %s
 ; RUN: llc -mtriple=spirv64-unknown-unknown < %s | FileCheck --check-prefixes=NOEXT,CHECK %s
+; RUN: llc -mtriple=spirv64-amd-amdhsa < %s | FileCheck --check-prefixes=EXT,CHECK %s
+; RUN: llc -mtriple=spirv64-amd-amdhsa --spirv-ext=-SPV_KHR_expect_assume < %s | FileCheck --check-prefixes=NOEXT,CHECK %s
 
 ; EXT:        OpCapability ExpectAssumeKHR
-; EXT-NEXT:   OpExtension "SPV_KHR_expect_assume"
+; EXT:        OpExtension "SPV_KHR_expect_assume"
 ; NOEXT-NOT:  OpCapability ExpectAssumeKHR
 ; NOEXT-NOT:  OpExtension "SPV_KHR_expect_assume"
 
 declare void @llvm.assume(i1)
 
-; CHECK-DAG:  %8 = OpIEqual %3 %5 %6
-; EXT:        OpAssumeTrueKHR %8
-; NOEXT-NOT:  OpAssumeTrueKHR %8
+; CHECK:      %[[#X:]] = OpFunctionParameter
+; CHECK:      %[[#Y:]] = OpFunctionParameter
+; CHECK:      %[[#CMP:]] = OpIEqual %[[#]] %[[#X]] %[[#Y]]
+; EXT:        OpAssumeTrueKHR %[[#CMP]]
+; NOEXT-NOT:  OpAssumeTrueKHR
 define i1 @assumeeq(i32 %x, i32 %y) {
     %cmp = icmp eq i32 %x, %y
     call void @llvm.assume(i1 %cmp)
     ret i1 %cmp
 }
+
+; CHECK:      %[[#FUNC:]] = OpFunction
+; CHECK:      %[[#P:]] = OpFunctionParameter
+; CHECK:      %[[#LABEL:]] = OpLabel
+; EXT:        OpAssumeTrueKHR %[[#TRUE:]]
+; NOEXT-NOT:  OpAssumeTrueKHR
+; CHECK:      OpReturn
+; CHECK:      OpFunctionEnd
+define void @assume_with_operand_bundles(ptr %p) {
+    call void @llvm.assume(i1 true) [ "align"(ptr %p, i64 64), "nonnull"(ptr %p) ]
+    ret void
+}

>From 12d2ba4940acae95df28896c53085754711dca82 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 11 Mar 2026 13:18:45 +0100
Subject: [PATCH 2/2] Address review comments

---
 llvm/test/CodeGen/SPIRV/assume.ll | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/llvm/test/CodeGen/SPIRV/assume.ll b/llvm/test/CodeGen/SPIRV/assume.ll
index 958c774169656..b65724e252643 100644
--- a/llvm/test/CodeGen/SPIRV/assume.ll
+++ b/llvm/test/CodeGen/SPIRV/assume.ll
@@ -2,11 +2,9 @@
 ; RUN: llc -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_KHR_expect_assume < %s | FileCheck --check-prefixes=EXT,CHECK %s
 ; RUN: llc -mtriple=spirv32-unknown-unknown < %s | FileCheck --check-prefixes=NOEXT,CHECK %s
 ; RUN: llc -mtriple=spirv64-unknown-unknown < %s | FileCheck --check-prefixes=NOEXT,CHECK %s
-; RUN: llc -mtriple=spirv64-amd-amdhsa < %s | FileCheck --check-prefixes=EXT,CHECK %s
-; RUN: llc -mtriple=spirv64-amd-amdhsa --spirv-ext=-SPV_KHR_expect_assume < %s | FileCheck --check-prefixes=NOEXT,CHECK %s
 
-; EXT:        OpCapability ExpectAssumeKHR
-; EXT:        OpExtension "SPV_KHR_expect_assume"
+; EXT-DAG:    OpCapability ExpectAssumeKHR
+; EXT-DAG:    OpExtension "SPV_KHR_expect_assume"
 ; NOEXT-NOT:  OpCapability ExpectAssumeKHR
 ; NOEXT-NOT:  OpExtension "SPV_KHR_expect_assume"
 



More information about the llvm-commits mailing list