Skip to content

Commit 036d637

Browse files
authored
[AMDGPU][Verifier] Allow llvm.amdgcn.unreachable after cs.chain (llvm#139494)
Unreachable is transformed to llvm.amdgcn.unreachable() during exit unification. Make sure the verifier tolerates this.
1 parent 62a6218 commit 036d637

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6418,7 +6418,12 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
64186418
"SGPR arguments must have the `inreg` attribute", &Call);
64196419
Check(!Call.paramHasAttr(3, Attribute::InReg),
64206420
"VGPR arguments must not have the `inreg` attribute", &Call);
6421-
Check(isa_and_present<UnreachableInst>(Call.getNextNode()),
6421+
6422+
auto *Next = Call.getNextNonDebugInstruction();
6423+
bool IsAMDUnreachable = Next && isa<IntrinsicInst>(Next) &&
6424+
cast<IntrinsicInst>(Next)->getIntrinsicID() ==
6425+
Intrinsic::amdgcn_unreachable;
6426+
Check(Next && (isa<UnreachableInst>(Next) || IsAMDUnreachable),
64226427
"llvm.amdgcn.cs.chain must be followed by unreachable", &Call);
64236428
break;
64246429
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
2+
3+
declare amdgpu_cs_chain void @callee() nounwind
4+
declare void @llvm.amdgcn.cs.chain.p0.i64.i32.i32(ptr, i64, i32, i32, i32 immarg, ...)
5+
declare void @llvm.amdgcn.unreachable()
6+
declare void @llvm.dbg.value(metadata, metadata, metadata)
7+
8+
; @llvm.amdgcn.unreachable is legal after @llvm.amdgcn.cs.chain
9+
; CHECK: define amdgpu_cs_chain void @test_cc_chain_unreachable(i32 %val)
10+
define amdgpu_cs_chain void @test_cc_chain_unreachable(i32 %val) {
11+
tail.block:
12+
%.cond = icmp ne i32 %val, 0
13+
br i1 %.cond, label %chain.block, label %UnifiedReturnBlock
14+
15+
chain.block:
16+
call void (ptr, i64, i32, i32, i32, ...) @llvm.amdgcn.cs.chain.p0.i64.i32.i32(ptr @callee, i64 -1, i32 inreg 1, i32 2, i32 1, i32 inreg 32, i32 inreg -1, ptr @callee)
17+
call void @llvm.amdgcn.unreachable()
18+
br label %UnifiedReturnBlock
19+
20+
UnifiedReturnBlock:
21+
ret void
22+
}
23+
24+
; debug instructions should be ignored
25+
; CHECK: define amdgpu_cs_chain void @test_cc_chain_unreachable_debug(i32 %val)
26+
define amdgpu_cs_chain void @test_cc_chain_unreachable_debug(i32 %val) {
27+
init:
28+
call void (ptr, i64, i32, i32, i32, ...) @llvm.amdgcn.cs.chain.p0.i64.i32.i32(ptr @callee, i64 -1, i32 inreg 1, i32 2, i32 1, i32 inreg 32, i32 inreg -1, ptr @callee)
29+
call void @llvm.dbg.value(metadata i32 0, metadata !{}, metadata !DIExpression())
30+
call void @llvm.amdgcn.unreachable()
31+
ret void
32+
}

0 commit comments

Comments
 (0)