Skip to content

Commit 758fea0

Browse files
ActhinksZhenhao Yangarsenm
authored
[InferAddressSpaces] Handle llvm.lifetime (#141045)
Co-authored-by: Zhenhao Yang <zhenhao.yang@nio.com> Co-authored-by: Matt Arsenault <arsenm2@gmail.com>
1 parent ed75e21 commit 758fea0

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,14 @@ bool InferAddressSpacesImpl::rewriteIntrinsicOperands(IntrinsicInst *II,
428428
II->replaceUsesOfWith(OldV, NewV);
429429
return true;
430430
}
431+
case Intrinsic::lifetime_start:
432+
case Intrinsic::lifetime_end: {
433+
Function *NewDecl = Intrinsic::getOrInsertDeclaration(
434+
M, II->getIntrinsicID(), {NewV->getType()});
435+
II->setArgOperand(1, NewV);
436+
II->setCalledFunction(NewDecl);
437+
return true;
438+
}
431439
default: {
432440
Value *Rewrite = TTI->rewriteIntrinsicWithAddressSpace(II, OldV, NewV);
433441
if (!Rewrite)
@@ -479,6 +487,12 @@ void InferAddressSpacesImpl::collectRewritableIntrinsicOperands(
479487

480488
break;
481489
}
490+
case Intrinsic::lifetime_start:
491+
case Intrinsic::lifetime_end: {
492+
appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(1),
493+
PostorderStack, Visited);
494+
break;
495+
}
482496
default:
483497
SmallVector<int, 2> OpIndexes;
484498
if (TTI->collectFlatAddressOperands(OpIndexes, IID)) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s
2+
3+
define i32 @lifetime_flat_pointer() {
4+
; CHECK-LABEL: define i32 @lifetime_flat_pointer() {
5+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca i32, align 4, addrspace(5)
6+
; CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) [[ALLOCA]])
7+
; CHECK-NEXT: store i32 1, ptr addrspace(5) [[ALLOCA]], align 4
8+
; CHECK-NEXT: %ret = load i32, ptr addrspace(5) [[ALLOCA]], align 4
9+
; CHECK-NEXT: call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) [[ALLOCA]])
10+
; CHECK-NEXT: ret i32 %ret
11+
;
12+
%alloca = alloca i32, align 4, addrspace(5)
13+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
14+
call void @llvm.lifetime.start.p0(i64 4 , ptr %flat)
15+
store i32 1, ptr %flat, align 4
16+
%ret = load i32, ptr %flat, align 4
17+
call void @llvm.lifetime.end.p0(i64 4 , ptr %flat)
18+
ret i32 %ret
19+
}
20+
21+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
22+
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; RUN: opt -S -passes=infer-address-spaces %s | FileCheck %s
2+
3+
target triple = "nvptx64-nvidia-cuda"
4+
5+
define i32 @lifetime_flat_pointer() {
6+
; CHECK-LABEL: define i32 @lifetime_flat_pointer() {
7+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca i32, align 4
8+
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[ALLOCA]] to ptr addrspace(5)
9+
; CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) [[TMP1]])
10+
; CHECK-NEXT: store i32 1, ptr addrspace(5) [[TMP1]], align 4
11+
; CHECK-NEXT: %ret = load i32, ptr addrspace(5) [[TMP1]], align 4
12+
; CHECK-NEXT: call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) [[TMP1]])
13+
; CHECK-NEXT: ret i32 %ret
14+
;
15+
%alloca = alloca i32, align 4
16+
%1 = addrspacecast ptr %alloca to ptr addrspace(5)
17+
%2 = addrspacecast ptr addrspace(5) %1 to ptr
18+
%3 = addrspacecast ptr addrspace(5) %1 to ptr
19+
call void @llvm.lifetime.start.p0(i64 4, ptr %2)
20+
store i32 1, ptr addrspace(5) %1, align 4
21+
%ret = load i32, ptr addrspace(5) %1, align 4
22+
call void @llvm.lifetime.end.p0(i64 4, ptr %3)
23+
ret i32 %ret
24+
}
25+
26+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
27+
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)

0 commit comments

Comments
 (0)