[llvm] [SPIR-V] Don't emit OpLifetime for Vulkan (PR #135166)
Nathan Gauër via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 10 04:51:01 PDT 2025
https://github.com/Keenuts updated https://github.com/llvm/llvm-project/pull/135166
>From 768f1e1a610fc6be458c7ecbb5ef02838d8b5bb8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brioche at google.com>
Date: Thu, 10 Apr 2025 13:13:19 +0200
Subject: [PATCH 1/2] [SPIR-V] Don't emit OpLifetime for Vulkan
Those instructions require the Kernel capability, which is not
available when targeting Vulkan.
---
.../Target/SPIRV/SPIRVPrepareFunctions.cpp | 18 +++--
.../CodeGen/SPIRV/llvm-intrinsics/lifetime.ll | 71 ++++++++++++-------
2 files changed, 58 insertions(+), 31 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
index 628688d83a314..bd039871dec44 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
@@ -380,6 +380,7 @@ static bool toSpvOverloadedIntrinsic(IntrinsicInst *II, Intrinsic::ID NewID,
// or calls to proper generated functions. Returns True if F was modified.
bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) {
bool Changed = false;
+ const SPIRVSubtarget &STI = TM.getSubtarget<SPIRVSubtarget>(*F);
for (BasicBlock &BB : *F) {
for (Instruction &I : BB) {
auto Call = dyn_cast<CallInst>(&I);
@@ -400,19 +401,22 @@ bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) {
Changed = true;
break;
case Intrinsic::assume:
- case Intrinsic::expect: {
- const SPIRVSubtarget &STI = TM.getSubtarget<SPIRVSubtarget>(*F);
+ case Intrinsic::expect:
if (STI.canUseExtension(SPIRV::Extension::SPV_KHR_expect_assume))
lowerExpectAssume(II);
Changed = true;
- } break;
+ break;
case Intrinsic::lifetime_start:
- Changed |= toSpvOverloadedIntrinsic(
- II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1});
+ if (STI.isOpenCLEnv()) {
+ Changed |= toSpvOverloadedIntrinsic(
+ II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1});
+ }
break;
case Intrinsic::lifetime_end:
- Changed |= toSpvOverloadedIntrinsic(
- II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1});
+ if (STI.isOpenCLEnv()) {
+ Changed |= toSpvOverloadedIntrinsic(
+ II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1});
+ }
break;
case Intrinsic::ptr_annotation:
lowerPtrAnnotation(II);
diff --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll
index 45683585d6514..2d2ffe36d97bd 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll
@@ -1,24 +1,35 @@
-; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CL
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
-; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CL
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s --check-prefixes=CHECK,VK
+
+; FIXME(135165) Alignment capability emitted for Vulkan.
+; FIXME: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - -filetype=obj | spirv-val %}
+
; CHECK-DAG: %[[#Char:]] = OpTypeInt 8 0
; CHECK-DAG: %[[#PtrChar:]] = OpTypePointer Function %[[#Char]]
%tprange = type { %tparray }
%tparray = type { [2 x i64] }
-; CHECK: OpFunction
-; CHECK: %[[#FooVar:]] = OpVariable
-; CHECK: %[[#Casted1:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
-; CHECK: OpLifetimeStart %[[#Casted1]], 72
-; CHECK: OpCopyMemorySized
-; CHECK: OpBitcast
-; CHECK: OpInBoundsPtrAccessChain
-; CHECK: %[[#Casted2:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
-; CHECK: OpLifetimeStop %[[#Casted2]], 72
+; CL: OpFunction
+; CL: %[[#FooVar:]] = OpVariable
+; CL-NEXT: %[[#Casted1:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
+; CL-NEXT: OpLifetimeStart %[[#Casted1]], 72
+; CL-NEXT: OpCopyMemorySized
+; CL-NEXT: OpBitcast
+; CL-NEXT: OpInBoundsPtrAccessChain
+; CL-NEXT: %[[#Casted2:]] = OpBitcast %[[#PtrChar]] %[[#FooVar]]
+; CL-NEXT: OpLifetimeStop %[[#Casted2]], 72
+
+; VK: OpFunction
+; VK: %[[#FooVar:]] = OpVariable
+; VK-NEXT: OpCopyMemorySized
+; VK-NEXT: OpInBoundsAccessChain
+; VK-NEXT: OpReturn
define spir_func void @foo(ptr noundef byval(%tprange) align 8 %_arg_UserRange) {
%RoundedRangeKernel = alloca %tprange, align 8
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)
ret void
}
-; CHECK: OpFunction
-; CHECK: %[[#BarVar:]] = OpVariable
-; CHECK: OpLifetimeStart %[[#BarVar]], 0
-; CHECK: OpCopyMemorySized
-; CHECK: OpBitcast
-; CHECK: OpInBoundsPtrAccessChain
-; CHECK: OpLifetimeStop %[[#BarVar]], 0
+; CL: OpFunction
+; CL: %[[#BarVar:]] = OpVariable
+; CL-NEXT: OpLifetimeStart %[[#BarVar]], 0
+; CL-NEXT: OpCopyMemorySized
+; CL-NEXT: OpBitcast
+; CL-NEXT: OpInBoundsPtrAccessChain
+; CL-NEXT: OpLifetimeStop %[[#BarVar]], 0
+
+; VK: OpFunction
+; VK: %[[#BarVar:]] = OpVariable
+; VK-NEXT: OpCopyMemorySized
+; VK-NEXT: OpInBoundsAccessChain
+; VK-NEXT: OpReturn
define spir_func void @bar(ptr noundef byval(%tprange) align 8 %_arg_UserRange) {
%RoundedRangeKernel = alloca %tprange, align 8
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)
ret void
}
-; CHECK: OpFunction
-; CHECK: %[[#TestVar:]] = OpVariable
-; CHECK: OpLifetimeStart %[[#TestVar]], 1
-; CHECK: OpCopyMemorySized
-; CHECK: OpInBoundsPtrAccessChain
-; CHECK: OpLifetimeStop %[[#TestVar]], 1
+; CL: OpFunction
+; CL: %[[#TestVar:]] = OpVariable
+; CL-NEXT: OpLifetimeStart %[[#TestVar]], 1
+; CL-NEXT: OpCopyMemorySized
+; CL-NEXT: OpInBoundsPtrAccessChain
+; CL-NEXT: OpLifetimeStop %[[#TestVar]], 1
+
+; VK: OpFunction
+; VK: %[[#Test:]] = OpVariable
+; VK-NEXT: OpCopyMemorySized
+; VK-NEXT: OpInBoundsAccessChain
+; VK-NEXT: OpReturn
define spir_func void @test(ptr noundef align 8 %_arg) {
%var = alloca i8, align 8
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %var)
>From ce537fed6d332e547bcc242c41eefad2e170ade3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brioche at google.com>
Date: Thu, 10 Apr 2025 13:50:45 +0200
Subject: [PATCH 2/2] remove CHECK prefix from runline
---
llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll
index 2d2ffe36d97bd..085f8b3bc44c0 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll
@@ -1,16 +1,15 @@
-; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CL
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CL
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
-; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CL
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CL
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
-; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s --check-prefixes=CHECK,VK
-
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s --check-prefixes=VK
; FIXME(135165) Alignment capability emitted for Vulkan.
; FIXME: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - -filetype=obj | spirv-val %}
-; CHECK-DAG: %[[#Char:]] = OpTypeInt 8 0
-; CHECK-DAG: %[[#PtrChar:]] = OpTypePointer Function %[[#Char]]
+; CL-DAG: %[[#Char:]] = OpTypeInt 8 0
+; CL-DAG: %[[#PtrChar:]] = OpTypePointer Function %[[#Char]]
%tprange = type { %tparray }
%tparray = type { [2 x i64] }
More information about the llvm-commits
mailing list