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