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