Skip to content

Commit 768f1e1

Browse files
committed
[SPIR-V] Don't emit OpLifetime for Vulkan
Those instructions require the Kernel capability, which is not available when targeting Vulkan.
1 parent a625bc6 commit 768f1e1

File tree

2 files changed

+58
-31
lines changed

2 files changed

+58
-31
lines changed

llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ static bool toSpvOverloadedIntrinsic(IntrinsicInst *II, Intrinsic::ID NewID,
380380
// or calls to proper generated functions. Returns True if F was modified.
381381
bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) {
382382
bool Changed = false;
383+
const SPIRVSubtarget &STI = TM.getSubtarget<SPIRVSubtarget>(*F);
383384
for (BasicBlock &BB : *F) {
384385
for (Instruction &I : BB) {
385386
auto Call = dyn_cast<CallInst>(&I);
@@ -400,19 +401,22 @@ bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) {
400401
Changed = true;
401402
break;
402403
case Intrinsic::assume:
403-
case Intrinsic::expect: {
404-
const SPIRVSubtarget &STI = TM.getSubtarget<SPIRVSubtarget>(*F);
404+
case Intrinsic::expect:
405405
if (STI.canUseExtension(SPIRV::Extension::SPV_KHR_expect_assume))
406406
lowerExpectAssume(II);
407407
Changed = true;
408-
} break;
408+
break;
409409
case Intrinsic::lifetime_start:
410-
Changed |= toSpvOverloadedIntrinsic(
411-
II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1});
410+
if (STI.isOpenCLEnv()) {
411+
Changed |= toSpvOverloadedIntrinsic(
412+
II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1});
413+
}
412414
break;
413415
case Intrinsic::lifetime_end:
414-
Changed |= toSpvOverloadedIntrinsic(
415-
II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1});
416+
if (STI.isOpenCLEnv()) {
417+
Changed |= toSpvOverloadedIntrinsic(
418+
II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1});
419+
}
416420
break;
417421
case Intrinsic::ptr_annotation:
418422
lowerPtrAnnotation(II);

llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
1-
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CL
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

4-
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
4+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CL
55
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
66

7+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s --check-prefixes=CHECK,VK
8+
9+
; FIXME(135165) Alignment capability emitted for Vulkan.
10+
; FIXME: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - -filetype=obj | spirv-val %}
11+
712
; CHECK-DAG: %[[#Char:]] = OpTypeInt 8 0
813
; CHECK-DAG: %[[#PtrChar:]] = OpTypePointer Function %[[#Char]]
914

1015
%tprange = type { %tparray }
1116
%tparray = type { [2 x i64] }
1217

13-
; CHECK: OpFunction
14-
; CHECK: %[[#FooVar:]] = OpVariable
15-
; CHECK: %[[#Casted1:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
16-
; CHECK: OpLifetimeStart %[[#Casted1]], 72
17-
; CHECK: OpCopyMemorySized
18-
; CHECK: OpBitcast
19-
; CHECK: OpInBoundsPtrAccessChain
20-
; CHECK: %[[#Casted2:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
21-
; CHECK: OpLifetimeStop %[[#Casted2]], 72
18+
; CL: OpFunction
19+
; CL: %[[#FooVar:]] = OpVariable
20+
; CL-NEXT: %[[#Casted1:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
21+
; CL-NEXT: OpLifetimeStart %[[#Casted1]], 72
22+
; CL-NEXT: OpCopyMemorySized
23+
; CL-NEXT: OpBitcast
24+
; CL-NEXT: OpInBoundsPtrAccessChain
25+
; CL-NEXT: %[[#Casted2:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
26+
; CL-NEXT: OpLifetimeStop %[[#Casted2]], 72
27+
28+
; VK: OpFunction
29+
; VK: %[[#FooVar:]] = OpVariable
30+
; VK-NEXT: OpCopyMemorySized
31+
; VK-NEXT: OpInBoundsAccessChain
32+
; VK-NEXT: OpReturn
2233
define spir_func void @foo(ptr noundef byval(%tprange) align 8 %_arg_UserRange) {
2334
%RoundedRangeKernel = alloca %tprange, align 8
2435
call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %RoundedRangeKernel)
@@ -28,13 +39,19 @@ define spir_func void @foo(ptr noundef byval(%tprange) align 8 %_arg_UserRange)
2839
ret void
2940
}
3041

31-
; CHECK: OpFunction
32-
; CHECK: %[[#BarVar:]] = OpVariable
33-
; CHECK: OpLifetimeStart %[[#BarVar]], 0
34-
; CHECK: OpCopyMemorySized
35-
; CHECK: OpBitcast
36-
; CHECK: OpInBoundsPtrAccessChain
37-
; CHECK: OpLifetimeStop %[[#BarVar]], 0
42+
; CL: OpFunction
43+
; CL: %[[#BarVar:]] = OpVariable
44+
; CL-NEXT: OpLifetimeStart %[[#BarVar]], 0
45+
; CL-NEXT: OpCopyMemorySized
46+
; CL-NEXT: OpBitcast
47+
; CL-NEXT: OpInBoundsPtrAccessChain
48+
; CL-NEXT: OpLifetimeStop %[[#BarVar]], 0
49+
50+
; VK: OpFunction
51+
; VK: %[[#BarVar:]] = OpVariable
52+
; VK-NEXT: OpCopyMemorySized
53+
; VK-NEXT: OpInBoundsAccessChain
54+
; VK-NEXT: OpReturn
3855
define spir_func void @bar(ptr noundef byval(%tprange) align 8 %_arg_UserRange) {
3956
%RoundedRangeKernel = alloca %tprange, align 8
4057
call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %RoundedRangeKernel)
@@ -44,12 +61,18 @@ define spir_func void @bar(ptr noundef byval(%tprange) align 8 %_arg_UserRange)
4461
ret void
4562
}
4663

47-
; CHECK: OpFunction
48-
; CHECK: %[[#TestVar:]] = OpVariable
49-
; CHECK: OpLifetimeStart %[[#TestVar]], 1
50-
; CHECK: OpCopyMemorySized
51-
; CHECK: OpInBoundsPtrAccessChain
52-
; CHECK: OpLifetimeStop %[[#TestVar]], 1
64+
; CL: OpFunction
65+
; CL: %[[#TestVar:]] = OpVariable
66+
; CL-NEXT: OpLifetimeStart %[[#TestVar]], 1
67+
; CL-NEXT: OpCopyMemorySized
68+
; CL-NEXT: OpInBoundsPtrAccessChain
69+
; CL-NEXT: OpLifetimeStop %[[#TestVar]], 1
70+
71+
; VK: OpFunction
72+
; VK: %[[#Test:]] = OpVariable
73+
; VK-NEXT: OpCopyMemorySized
74+
; VK-NEXT: OpInBoundsAccessChain
75+
; VK-NEXT: OpReturn
5376
define spir_func void @test(ptr noundef align 8 %_arg) {
5477
%var = alloca i8, align 8
5578
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %var)

0 commit comments

Comments
 (0)