Skip to content

Commit 476c1c5

Browse files
authored
[SPIR-V] Don't emit OpLifetime for Vulkan (llvm#135166)
Those instructions require the Kernel capability, which is not available when targeting Vulkan.
1 parent 8a351f1 commit 476c1c5

File tree

2 files changed

+59
-33
lines changed

2 files changed

+59
-33
lines changed

llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp

+11-7
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

+48-26
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
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=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=CL
55
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
66

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

1014
%tprange = type { %tparray }
1115
%tparray = type { [2 x i64] }
1216

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
17+
; CL: OpFunction
18+
; CL: %[[#FooVar:]] = OpVariable
19+
; CL-NEXT: %[[#Casted1:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
20+
; CL-NEXT: OpLifetimeStart %[[#Casted1]], 72
21+
; CL-NEXT: OpCopyMemorySized
22+
; CL-NEXT: OpBitcast
23+
; CL-NEXT: OpInBoundsPtrAccessChain
24+
; CL-NEXT: %[[#Casted2:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
25+
; CL-NEXT: OpLifetimeStop %[[#Casted2]], 72
26+
27+
; VK: OpFunction
28+
; VK: %[[#FooVar:]] = OpVariable
29+
; VK-NEXT: OpCopyMemorySized
30+
; VK-NEXT: OpInBoundsAccessChain
31+
; VK-NEXT: OpReturn
2232
define spir_func void @foo(ptr noundef byval(%tprange) align 8 %_arg_UserRange) {
2333
%RoundedRangeKernel = alloca %tprange, align 8
2434
call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %RoundedRangeKernel)
@@ -28,13 +38,19 @@ define spir_func void @foo(ptr noundef byval(%tprange) align 8 %_arg_UserRange)
2838
ret void
2939
}
3040

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
41+
; CL: OpFunction
42+
; CL: %[[#BarVar:]] = OpVariable
43+
; CL-NEXT: OpLifetimeStart %[[#BarVar]], 0
44+
; CL-NEXT: OpCopyMemorySized
45+
; CL-NEXT: OpBitcast
46+
; CL-NEXT: OpInBoundsPtrAccessChain
47+
; CL-NEXT: OpLifetimeStop %[[#BarVar]], 0
48+
49+
; VK: OpFunction
50+
; VK: %[[#BarVar:]] = OpVariable
51+
; VK-NEXT: OpCopyMemorySized
52+
; VK-NEXT: OpInBoundsAccessChain
53+
; VK-NEXT: OpReturn
3854
define spir_func void @bar(ptr noundef byval(%tprange) align 8 %_arg_UserRange) {
3955
%RoundedRangeKernel = alloca %tprange, align 8
4056
call void @llvm.lifetime.start.p0(i64 -1, ptr nonnull %RoundedRangeKernel)
@@ -44,12 +60,18 @@ define spir_func void @bar(ptr noundef byval(%tprange) align 8 %_arg_UserRange)
4460
ret void
4561
}
4662

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

0 commit comments

Comments
 (0)