Skip to content

Commit fb0069e

Browse files
committed
remove lifetime intrinsics removal. Move memset cleanup first incase we want to do i8 load store cleanup later.
1 parent 4cd08da commit fb0069e

File tree

2 files changed

+57
-32
lines changed

2 files changed

+57
-32
lines changed

llvm/lib/Target/DirectX/DXILLegalizePass.cpp

-21
Original file line numberDiff line numberDiff line change
@@ -277,26 +277,6 @@ void emitMemset(IRBuilder<> &Builder, Value *Dst, Value *Val,
277277
}
278278
}
279279

280-
void removeLifetimesForMemset(CallInst *Memset,
281-
SmallVectorImpl<Instruction *> &ToRemove) {
282-
assert(Memset->getCalledFunction()->getIntrinsicID() == Intrinsic::memset &&
283-
"Expected a memset intrinsic");
284-
285-
Value *DstPtr = Memset->getArgOperand(0);
286-
DstPtr = DstPtr->stripPointerCasts();
287-
288-
for (User *U : DstPtr->users()) {
289-
if (auto *CI = dyn_cast<CallInst>(U)) {
290-
switch (CI->getIntrinsicID()) {
291-
case Intrinsic::lifetime_start:
292-
case Intrinsic::lifetime_end:
293-
ToRemove.push_back(CI);
294-
break;
295-
}
296-
}
297-
}
298-
}
299-
300280
static void removeMemSet(Instruction &I,
301281
SmallVectorImpl<Instruction *> &ToRemove,
302282
DenseMap<Value *, Value *>) {
@@ -310,7 +290,6 @@ static void removeMemSet(Instruction &I,
310290
dyn_cast<ConstantInt>(CI->getArgOperand(2));
311291
assert(Size && "Expected Size to be a ConstantInt");
312292
emitMemset(Builder, Dst, Val, Size);
313-
removeLifetimesForMemset(CI, ToRemove);
314293
ToRemove.push_back(CI);
315294
}
316295
}
+57-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2-
; RUN: opt -S -passes='dxil-legalize' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
2+
; RUN: opt -S -dxil-legalize -dxil-finalize-linkage -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
33

44

5-
define void @replace_float_memset_test() {
6-
; CHECK-LABEL: define void @replace_float_memset_test() {
5+
define void @replace_float_memset_test() #0 {
6+
; CHECK-LABEL: define void @replace_float_memset_test(
7+
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
78
; CHECK-NEXT: [[ACCUM_I_FLAT:%.*]] = alloca [2 x float], align 4
9+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr nonnull [[ACCUM_I_FLAT]])
810
; CHECK-NEXT: [[GEP:%.*]] = getelementptr float, ptr [[ACCUM_I_FLAT]], i32 0
911
; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP]], align 4
1012
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr float, ptr [[ACCUM_I_FLAT]], i32 1
1113
; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP1]], align 4
14+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr nonnull [[ACCUM_I_FLAT]])
1215
; CHECK-NEXT: ret void
1316
;
1417
%accum.i.flat = alloca [2 x float], align 4
@@ -18,13 +21,16 @@ define void @replace_float_memset_test() {
1821
ret void
1922
}
2023

21-
define void @replace_half_memset_test() {
22-
; CHECK-LABEL: define void @replace_half_memset_test() {
24+
define void @replace_half_memset_test() #0 {
25+
; CHECK-LABEL: define void @replace_half_memset_test(
26+
; CHECK-SAME: ) #[[ATTR0]] {
2327
; CHECK-NEXT: [[ACCUM_I_FLAT:%.*]] = alloca [2 x half], align 4
28+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[ACCUM_I_FLAT]])
2429
; CHECK-NEXT: [[GEP:%.*]] = getelementptr half, ptr [[ACCUM_I_FLAT]], i32 0
2530
; CHECK-NEXT: store half 0xH0000, ptr [[GEP]], align 2
2631
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr half, ptr [[ACCUM_I_FLAT]], i32 1
2732
; CHECK-NEXT: store half 0xH0000, ptr [[GEP1]], align 2
33+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr nonnull [[ACCUM_I_FLAT]])
2834
; CHECK-NEXT: ret void
2935
;
3036
%accum.i.flat = alloca [2 x half], align 4
@@ -34,13 +40,16 @@ define void @replace_half_memset_test() {
3440
ret void
3541
}
3642

37-
define void @replace_double_memset_test() {
38-
; CHECK-LABEL: define void @replace_double_memset_test() {
43+
define void @replace_double_memset_test() #0 {
44+
; CHECK-LABEL: define void @replace_double_memset_test(
45+
; CHECK-SAME: ) #[[ATTR0]] {
3946
; CHECK-NEXT: [[ACCUM_I_FLAT:%.*]] = alloca [2 x double], align 4
47+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr nonnull [[ACCUM_I_FLAT]])
4048
; CHECK-NEXT: [[GEP:%.*]] = getelementptr double, ptr [[ACCUM_I_FLAT]], i32 0
4149
; CHECK-NEXT: store double 0.000000e+00, ptr [[GEP]], align 8
4250
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr double, ptr [[ACCUM_I_FLAT]], i32 1
4351
; CHECK-NEXT: store double 0.000000e+00, ptr [[GEP1]], align 8
52+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr nonnull [[ACCUM_I_FLAT]])
4453
; CHECK-NEXT: ret void
4554
;
4655
%accum.i.flat = alloca [2 x double], align 4
@@ -50,13 +59,16 @@ define void @replace_double_memset_test() {
5059
ret void
5160
}
5261

53-
define void @replace_int16_memset_test() {
54-
; CHECK-LABEL: define void @replace_int16_memset_test() {
62+
define void @replace_int16_memset_test() #0 {
63+
; CHECK-LABEL: define void @replace_int16_memset_test(
64+
; CHECK-SAME: ) #[[ATTR0]] {
5565
; CHECK-NEXT: [[CACHE_I:%.*]] = alloca [2 x i16], align 2
66+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[CACHE_I]])
5667
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[CACHE_I]], i32 0
5768
; CHECK-NEXT: store i16 0, ptr [[GEP]], align 2
5869
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i16, ptr [[CACHE_I]], i32 1
5970
; CHECK-NEXT: store i16 0, ptr [[GEP1]], align 2
71+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr nonnull [[CACHE_I]])
6072
; CHECK-NEXT: ret void
6173
;
6274
%cache.i = alloca [2 x i16], align 2
@@ -66,11 +78,14 @@ define void @replace_int16_memset_test() {
6678
ret void
6779
}
6880

69-
define void @replace_int_memset_test() {
70-
; CHECK-LABEL: define void @replace_int_memset_test() {
81+
define void @replace_int_memset_test() #0 {
82+
; CHECK-LABEL: define void @replace_int_memset_test(
83+
; CHECK-SAME: ) #[[ATTR0]] {
7184
; CHECK-NEXT: [[ACCUM_I_FLAT:%.*]] = alloca [1 x i32], align 4
85+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[ACCUM_I_FLAT]])
7286
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[ACCUM_I_FLAT]], i32 0
7387
; CHECK-NEXT: store i32 0, ptr [[GEP]], align 4
88+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr nonnull [[ACCUM_I_FLAT]])
7489
; CHECK-NEXT: ret void
7590
;
7691
%accum.i.flat = alloca [1 x i32], align 4
@@ -79,3 +94,34 @@ define void @replace_int_memset_test() {
7994
call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %accum.i.flat)
8095
ret void
8196
}
97+
98+
define void @replace_int_memset_to_var_test() #0 {
99+
; CHECK-LABEL: define void @replace_int_memset_to_var_test(
100+
; CHECK-SAME: ) #[[ATTR0]] {
101+
; CHECK-NEXT: [[ACCUM_I_FLAT:%.*]] = alloca [1 x i32], align 4
102+
; CHECK-NEXT: [[I:%.*]] = alloca i8, align 4
103+
; CHECK-NEXT: store i8 1, ptr [[I]], align 1
104+
; CHECK-NEXT: [[I8_LOAD:%.*]] = load i8, ptr [[I]], align 1
105+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[ACCUM_I_FLAT]])
106+
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[I8_LOAD]] to i32
107+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[ACCUM_I_FLAT]], i32 0
108+
; CHECK-NEXT: store i32 [[TMP1]], ptr [[GEP]], align 4
109+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr nonnull [[ACCUM_I_FLAT]])
110+
; CHECK-NEXT: ret void
111+
;
112+
%accum.i.flat = alloca [1 x i32], align 4
113+
%i = alloca i8, align 4
114+
store i8 1, ptr %i
115+
%i8.load = load i8, ptr %i
116+
call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %accum.i.flat)
117+
call void @llvm.memset.p0.i32(ptr nonnull align 4 dereferenceable(8) %accum.i.flat, i8 %i8.load, i32 4, i1 false)
118+
call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %accum.i.flat)
119+
ret void
120+
}
121+
122+
attributes #0 = {"hlsl.export"}
123+
124+
125+
declare void @llvm.lifetime.end.p0(i64 immarg, ptr captures(none))
126+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr captures(none))
127+
declare void @llvm.memset.p0.i32(ptr writeonly captures(none), i8, i32, i1 immarg)

0 commit comments

Comments
 (0)