1
1
; 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
3
3
4
4
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]+]] {
7
8
; 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]])
8
10
; CHECK-NEXT: [[GEP:%.*]] = getelementptr float, ptr [[ACCUM_I_FLAT]], i32 0
9
11
; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP]], align 4
10
12
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr float, ptr [[ACCUM_I_FLAT]], i32 1
11
13
; 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]])
12
15
; CHECK-NEXT: ret void
13
16
;
14
17
%accum.i.flat = alloca [2 x float ], align 4
@@ -18,13 +21,16 @@ define void @replace_float_memset_test() {
18
21
ret void
19
22
}
20
23
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]] {
23
27
; 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]])
24
29
; CHECK-NEXT: [[GEP:%.*]] = getelementptr half, ptr [[ACCUM_I_FLAT]], i32 0
25
30
; CHECK-NEXT: store half 0xH0000, ptr [[GEP]], align 2
26
31
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr half, ptr [[ACCUM_I_FLAT]], i32 1
27
32
; 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]])
28
34
; CHECK-NEXT: ret void
29
35
;
30
36
%accum.i.flat = alloca [2 x half ], align 4
@@ -34,13 +40,16 @@ define void @replace_half_memset_test() {
34
40
ret void
35
41
}
36
42
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]] {
39
46
; 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]])
40
48
; CHECK-NEXT: [[GEP:%.*]] = getelementptr double, ptr [[ACCUM_I_FLAT]], i32 0
41
49
; CHECK-NEXT: store double 0.000000e+00, ptr [[GEP]], align 8
42
50
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr double, ptr [[ACCUM_I_FLAT]], i32 1
43
51
; 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]])
44
53
; CHECK-NEXT: ret void
45
54
;
46
55
%accum.i.flat = alloca [2 x double ], align 4
@@ -50,13 +59,16 @@ define void @replace_double_memset_test() {
50
59
ret void
51
60
}
52
61
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]] {
55
65
; 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]])
56
67
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[CACHE_I]], i32 0
57
68
; CHECK-NEXT: store i16 0, ptr [[GEP]], align 2
58
69
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i16, ptr [[CACHE_I]], i32 1
59
70
; CHECK-NEXT: store i16 0, ptr [[GEP1]], align 2
71
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr nonnull [[CACHE_I]])
60
72
; CHECK-NEXT: ret void
61
73
;
62
74
%cache.i = alloca [2 x i16 ], align 2
@@ -66,11 +78,14 @@ define void @replace_int16_memset_test() {
66
78
ret void
67
79
}
68
80
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]] {
71
84
; 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]])
72
86
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[ACCUM_I_FLAT]], i32 0
73
87
; 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]])
74
89
; CHECK-NEXT: ret void
75
90
;
76
91
%accum.i.flat = alloca [1 x i32 ], align 4
@@ -79,3 +94,34 @@ define void @replace_int_memset_test() {
79
94
call void @llvm.lifetime.end.p0 (i64 4 , ptr nonnull %accum.i.flat )
80
95
ret void
81
96
}
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