[llvm] 96cab30 - [AMDGPU] Improve amdgcn_kill verification (#208220)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 16 08:01:44 PDT 2026


Author: Robert Imschweiler
Date: 2026-07-16T17:01:39+02:00
New Revision: 96cab305c0402e051d16e748911bd469b4ad57fe

URL: https://github.com/llvm/llvm-project/commit/96cab305c0402e051d16e748911bd469b4ad57fe
DIFF: https://github.com/llvm/llvm-project/commit/96cab305c0402e051d16e748911bd469b4ad57fe.diff

LOG: [AMDGPU] Improve amdgcn_kill verification (#208220)

Added: 
    

Modified: 
    llvm/lib/IR/VerifierAMDGPU.cpp
    llvm/test/Assembler/callbr.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/IR/VerifierAMDGPU.cpp b/llvm/lib/IR/VerifierAMDGPU.cpp
index 04cb214ef2520..a668d3135644e 100644
--- a/llvm/lib/IR/VerifierAMDGPU.cpp
+++ b/llvm/lib/IR/VerifierAMDGPU.cpp
@@ -144,9 +144,13 @@ void llvm::verifyAMDGPUIntrinsicCall(VerifierSupport &VS, Intrinsic::ID ID,
     if (auto *CBI = dyn_cast<CallBrInst>(&Call)) {
       Check(CBI->getNumIndirectDests() == 1,
             "callbr amdgcn_kill only supports one indirect dest");
-      bool Unreachable = isa<UnreachableInst>(CBI->getIndirectDest(0)->begin());
-      CallInst *CI = dyn_cast<CallInst>(CBI->getIndirectDest(0)->begin());
-      Check(Unreachable ||
+      // We assume that amdgcn_unreachable is only introduced by
+      // AMDGPUUnifyDivergentExitNodes, which replaces the block's original
+      // unreachable terminator by a call to amdgcn_unreachable + a return.
+      const Instruction *Term = CBI->getIndirectDest(0)->getTerminator();
+      const CallInst *CI =
+          Term ? dyn_cast_if_present<CallInst>(Term->getPrevNode()) : nullptr;
+      Check(isa_and_nonnull<UnreachableInst>(Term) ||
                 (CI && CI->getIntrinsicID() == Intrinsic::amdgcn_unreachable),
             "callbr amdgcn_kill indirect dest needs to be unreachable");
     }

diff  --git a/llvm/test/Assembler/callbr.ll b/llvm/test/Assembler/callbr.ll
index 37fd777e1a395..6e63bdcbfa9ca 100644
--- a/llvm/test/Assembler/callbr.ll
+++ b/llvm/test/Assembler/callbr.ll
@@ -1,6 +1,7 @@
 ; RUN: llvm-as < %s | llvm-dis | FileCheck %s
 
 declare void @llvm.amdgcn.kill(i1)
+declare void @llvm.amdgcn.unreachable()
 
 define void @test_kill(i1 %c) {
 ; CHECK-LABEL: define void @test_kill(
@@ -18,3 +19,43 @@ kill:
 cont:
   ret void
 }
+
+define void @test_kill_unreachable_not_first(i1 %c, ptr %p) {
+; CHECK-LABEL: define void @test_kill_unreachable_not_first(
+; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) {
+; CHECK-NEXT:    callbr void @llvm.amdgcn.kill(i1 [[C]])
+; CHECK-NEXT:            to label %[[CONT:.*]] [label %kill]
+; CHECK:       [[KILL:.*:]]
+; CHECK-NEXT:    store i32 0, ptr [[P]], align 4
+; CHECK-NEXT:    unreachable
+; CHECK:       [[CONT]]:
+; CHECK-NEXT:    ret void
+;
+  callbr void @llvm.amdgcn.kill(i1 %c) to label %cont [label %kill]
+kill:
+  store i32 0, ptr %p, align 4
+  unreachable
+cont:
+  ret void
+}
+
+define void @test_kill_amdgcn_unreachable_not_first(i1 %c, ptr %p) {
+; CHECK-LABEL: define void @test_kill_amdgcn_unreachable_not_first(
+; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) {
+; CHECK-NEXT:    callbr void @llvm.amdgcn.kill(i1 [[C]])
+; CHECK-NEXT:            to label %[[CONT:.*]] [label %kill]
+; CHECK:       [[KILL:.*:]]
+; CHECK-NEXT:    store i32 0, ptr [[P]], align 4
+; CHECK-NEXT:    call void @llvm.amdgcn.unreachable()
+; CHECK-NEXT:    ret void
+; CHECK:       [[CONT]]:
+; CHECK-NEXT:    ret void
+;
+  callbr void @llvm.amdgcn.kill(i1 %c) to label %cont [label %kill]
+kill:
+  store i32 0, ptr %p, align 4
+  call void @llvm.amdgcn.unreachable()
+  ret void
+cont:
+  ret void
+}


        


More information about the llvm-commits mailing list