[llvm] [SPIR-V] Set MIB insert point before widened type lookup in widenSignSensitiveOps (PR #214424)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 6 00:48:48 PDT 2026


https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/214424

Fix an assertion crash (release: null-MBB walk) when a sub-pow2 sign-sensitive op has no preceding G_TRUNC to set the insert point

>From 7586cc239a4e033074241158c5f1cd9e6cbc3d4e Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Thu, 6 Aug 2026 09:47:58 +0200
Subject: [PATCH] [SPIR-V] Set MIB insert point before widened type lookup in
 widenSignSensitiveOps

Fix an assertion crash (release: null-MBB walk) when a sub-pow2 sign-sensitive op has no preceding G_TRUNC to set the insert point
---
 llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp   |  2 +-
 .../SPIRV/legalization/signed-narrow-int.ll   | 20 +++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
index 0a6a277f01bd9..2c77b23f2f5da 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
@@ -573,12 +573,12 @@ static void widenSignSensitiveOps(MachineFunction &MF, SPIRVGlobalRegistry *GR,
                            MachineInstr &MI) -> Register {
     unsigned NewW = widenBitWidthToNextPow2(OldW);
     LLT NewLLT = LLT::scalar(NewW);
+    MIB.setInsertPt(*MI.getParent(), MI.getIterator());
     SPIRVTypeInst SpvTy = GR->getOrCreateSPIRVIntegerType(NewW, MIB);
     Register SExted = MRI.createGenericVirtualRegister(NewLLT);
     GR->assignSPIRVTypeToVReg(SpvTy, SExted, MF);
     MRI.setRegClass(SExted, GR->getRegClass(SpvTy));
     MRI.setType(Reg, NewLLT);
-    MIB.setInsertPt(*MI.getParent(), MI.getIterator());
     MIB.buildSExtInReg(SExted, Reg, OldW);
     return SExted;
   };
diff --git a/llvm/test/CodeGen/SPIRV/legalization/signed-narrow-int.ll b/llvm/test/CodeGen/SPIRV/legalization/signed-narrow-int.ll
index 3ac752f9b8d9d..c2d9974939c21 100644
--- a/llvm/test/CodeGen/SPIRV/legalization/signed-narrow-int.ll
+++ b/llvm/test/CodeGen/SPIRV/legalization/signed-narrow-int.ll
@@ -250,6 +250,26 @@ define spir_kernel void @trunc_i8_to_i4_icmp_slt(i8 %a, i8 %b, ptr addrspace(1)
   ret void
 }
 
+; ----------------------------------------------------------------------------
+; CHECK: OpFunction
+; CHECK: %[[#GA:]] = OpLoad %[[#I32]]
+; CHECK: %[[#GB:]] = OpLoad %[[#I32]]
+; CHECK: %[[#SHLA8:]] = OpShiftLeftLogical %[[#I32]] %[[#GA]] %[[#K8]]
+; CHECK: %[[#SXA8:]] = OpShiftRightArithmetic %[[#I32]] %[[#SHLA8]] %[[#K8]]
+; CHECK: %[[#SHLB8:]] = OpShiftLeftLogical %[[#I32]] %[[#GB]] %[[#K8]]
+; CHECK: %[[#SXB8:]] = OpShiftRightArithmetic %[[#I32]] %[[#SHLB8]] %[[#K8]]
+; CHECK: OpSDiv %[[#I32]] %[[#SXA8]] %[[#SXB8]]
+ at ga = global i24 0
+ at gb = global i24 0
+ at out24 = global i24 0
+define spir_kernel void @sdiv_i24_from_globals() {
+  %a = load i24, ptr @ga
+  %b = load i24, ptr @gb
+  %r = sdiv i24 %a, %b
+  store i24 %r, ptr @out24
+  ret void
+}
+
 ; ----------------------------------------------------------------------------
 ; Negative test: unsigned compare must NOT emit sign-extension shifts.
 ; CHECK: OpFunction



More information about the llvm-commits mailing list