Skip to content

Commit 4175c7d

Browse files
author
Zhenhao Yang
committed
[InferAddressSpaces] Handle llvm.lifetime
1 parent 491619a commit 4175c7d

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-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: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s
2+
3+
4+
define i32 @lifetime_flat_pointer() {
5+
; CHECK-LABEL: define i32 @lifetime_flat_pointer() {
6+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca i32, align 4, addrspace(5)
7+
; CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) [[ALLOCA]])
8+
; CHECK-NEXT: store i32 1, ptr addrspace(5) [[ALLOCA]], align 4
9+
; CHECK-NEXT: %ret = load i32, ptr addrspace(5) [[ALLOCA]], align 4
10+
; CHECK-NEXT: call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) [[ALLOCA]])
11+
; CHECK-NEXT: ret i32 %ret
12+
;
13+
%alloca = alloca i32, align 4, addrspace(5)
14+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
15+
call void @llvm.lifetime.start.p0(i64 4 , ptr %flat)
16+
store i32 1, ptr %flat, align 4
17+
%ret = load i32, ptr %flat, align 4
18+
call void @llvm.lifetime.end.p0(i64 4 , ptr %flat)
19+
ret i32 %ret
20+
}
21+
22+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
23+
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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, addrspace(5)
8+
; CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) [[ALLOCA]])
9+
; CHECK-NEXT: store i32 1, ptr addrspace(5) [[ALLOCA]], align 4
10+
; CHECK-NEXT: %ret = load i32, ptr addrspace(5) [[ALLOCA]], align 4
11+
; CHECK-NEXT: call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) [[ALLOCA]])
12+
; CHECK-NEXT: ret i32 %ret
13+
;
14+
%alloca = alloca i32, align 4, addrspace(5)
15+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
16+
call void @llvm.lifetime.start.p0(i64 4 , ptr %flat)
17+
store i32 1, ptr %flat, align 4
18+
%ret = load i32, ptr %flat, align 4
19+
call void @llvm.lifetime.end.p0(i64 4 , ptr %flat)
20+
ret i32 %ret
21+
}
22+
23+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
24+
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)

0 commit comments

Comments
 (0)