22; RUN: opt -mtriple=x86_64-apple-darwin10.0.0 -passes=pre-isel-intrinsic-lowering -S -o - %s | FileCheck %s
33
44;.
5- ; CHECK: @.memset_pattern = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
6- ; CHECK: @.memset_pattern.1 = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
5+ ; CHECK: @G = global i32 5
6+ ; CHECK: @.memset_pattern = private unnamed_addr constant [2 x ptr] [ptr @G, ptr @G], align 16
7+ ; CHECK: @.memset_pattern.1 = private unnamed_addr constant [2 x ptr] [ptr @G, ptr @G], align 16
78; CHECK: @.memset_pattern.2 = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
8- ; CHECK: @.memset_pattern.3 = private unnamed_addr constant [2 x i64] [i64 4614256656552045848 , i64 4614256656552045848 ], align 16
9- ; CHECK: @.memset_pattern.4 = private unnamed_addr constant [8 x i16 ] [i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555 ], align 16
10- ; CHECK: @.memset_pattern.5 = private unnamed_addr constant i128 -113427455635030943652277463699152839203 , align 16
11- ; CHECK: @.memset_pattern.6 = private unnamed_addr constant i128 -113427455635030943652277463699152839203 , align 16
9+ ; CHECK: @.memset_pattern.3 = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307 , i64 -6148895925951734307 ], align 16
10+ ; CHECK: @.memset_pattern.4 = private unnamed_addr constant [2 x i64 ] [i64 -6148895925951734307, i64 -6148895925951734307 ], align 16
11+ ; CHECK: @.memset_pattern.5 = private unnamed_addr constant [2 x i64] [i64 4614256656552045848, i64 4614256656552045848] , align 16
12+ ; CHECK: @.memset_pattern.6 = private unnamed_addr constant [8 x i16] [i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555] , align 16
1213; CHECK: @.memset_pattern.7 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
1314; CHECK: @.memset_pattern.8 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
15+ ; CHECK: @.memset_pattern.9 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
16+ ; CHECK: @.memset_pattern.10 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
1417;.
1518define void @memset_pattern_i128_1_dynvalue (ptr %a , i128 %value ) nounwind {
1619; CHECK-LABEL: define void @memset_pattern_i128_1_dynvalue(
@@ -33,7 +36,7 @@ define void @memset_pattern_i128_1_dynvalue(ptr %a, i128 %value) nounwind {
3336define void @memset_pattern_i128_1 (ptr %a , i128 %value ) nounwind {
3437; CHECK-LABEL: define void @memset_pattern_i128_1(
3538; CHECK-SAME: ptr [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {
36- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.5 , i64 16)
39+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.7 , i64 16)
3740; CHECK-NEXT: ret void
3841;
3942 tail call void @llvm.experimental.memset.pattern (ptr %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1 , i1 false )
@@ -61,7 +64,7 @@ define void @memset_pattern_i128_1_nz_as(ptr addrspace(1) %a, i128 %value) nounw
6164define void @memset_pattern_i128_1_align_attr (ptr align (16 ) %a , i128 %value ) nounwind {
6265; CHECK-LABEL: define void @memset_pattern_i128_1_align_attr(
6366; CHECK-SAME: ptr align 16 [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {
64- ; CHECK-NEXT: call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.6 , i64 16)
67+ ; CHECK-NEXT: call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.8 , i64 16)
6568; CHECK-NEXT: ret void
6669;
6770 tail call void @llvm.experimental.memset.pattern (ptr align (16 ) %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1 , i1 false )
@@ -71,7 +74,7 @@ define void @memset_pattern_i128_1_align_attr(ptr align(16) %a, i128 %value) nou
7174define void @memset_pattern_i128_16 (ptr %a ) nounwind {
7275; CHECK-LABEL: define void @memset_pattern_i128_16(
7376; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
74- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.7 , i64 256)
77+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.9 , i64 256)
7578; CHECK-NEXT: ret void
7679;
7780 tail call void @llvm.experimental.memset.pattern (ptr %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 16 , i1 false )
@@ -82,7 +85,7 @@ define void @memset_pattern_i128_x(ptr %a, i64 %x) nounwind {
8285; CHECK-LABEL: define void @memset_pattern_i128_x(
8386; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
8487; CHECK-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
85- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.8 , i64 [[TMP1]])
88+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.10 , i64 [[TMP1]])
8689; CHECK-NEXT: ret void
8790;
8891 tail call void @llvm.experimental.memset.pattern (ptr %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 %x , i1 false )
@@ -112,7 +115,7 @@ define void @memset_pattern_i16_x(ptr %a, i64 %x) nounwind {
112115; CHECK-LABEL: define void @memset_pattern_i16_x(
113116; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
114117; CHECK-NEXT: [[TMP1:%.*]] = mul i64 2, [[X]]
115- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4 , i64 [[TMP1]])
118+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.6 , i64 [[TMP1]])
116119; CHECK-NEXT: ret void
117120;
118121 tail call void @llvm.experimental.memset.pattern (ptr %a , i16 u0xabcd, i64 %x , i1 false )
@@ -123,7 +126,7 @@ define void @memset_pattern_i64_x(ptr %a, i64 %x) nounwind {
123126; CHECK-LABEL: define void @memset_pattern_i64_x(
124127; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
125128; CHECK-NEXT: [[TMP1:%.*]] = mul i64 8, [[X]]
126- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2 , i64 [[TMP1]])
129+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4 , i64 [[TMP1]])
127130; CHECK-NEXT: ret void
128131;
129132 tail call void @llvm.experimental.memset.pattern (ptr %a , i64 u0xaaaabbbbccccdddd, i64 %x , i1 false )
@@ -134,19 +137,24 @@ define void @memset_pattern_i64_x(ptr %a, i64 %x) nounwind {
134137define void @memset_pattern_i64_128_tbaa (ptr %a ) nounwind {
135138; CHECK-LABEL: define void @memset_pattern_i64_128_tbaa(
136139; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
137- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3 , i64 1024), !tbaa [[TBAA0:![0-9]+]]
140+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.5 , i64 1024), !tbaa [[TBAA0:![0-9]+]]
138141; CHECK-NEXT: ret void
139142;
140143 tail call void @llvm.experimental.memset.pattern (ptr %a , i64 u0x400921fb54442d18, i64 128 , i1 false ), !tbaa !5
141144 ret void
142145}
143146
147+ !5 = !{!6 , !6 , i64 0 }
148+ !6 = !{!"double" , !7 , i64 0 }
149+ !7 = !{!"omnipotent char" , !8 , i64 0 }
150+ !8 = !{!"Simple C++ TBAA" }
151+
144152define void @memset_pattern_i64_narrow_idx (ptr %a , i32 %x ) nounwind {
145153; CHECK-LABEL: define void @memset_pattern_i64_narrow_idx(
146154; CHECK-SAME: ptr [[A:%.*]], i32 [[X:%.*]]) #[[ATTR0]] {
147155; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[X]] to i64
148156; CHECK-NEXT: [[TMP2:%.*]] = mul i64 8, [[TMP1]]
149- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1 , i64 [[TMP2]])
157+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3 , i64 [[TMP2]])
150158; CHECK-NEXT: ret void
151159;
152160 tail call void @llvm.experimental.memset.pattern (ptr %a , i64 u0xaaaabbbbccccdddd, i32 %x , i1 false )
@@ -158,17 +166,56 @@ define void @memset_pattern_i64_wide_idx(ptr %a, i128 %x) nounwind {
158166; CHECK-SAME: ptr [[A:%.*]], i128 [[X:%.*]]) #[[ATTR0]] {
159167; CHECK-NEXT: [[TMP1:%.*]] = trunc i128 [[X]] to i64
160168; CHECK-NEXT: [[TMP2:%.*]] = mul i64 8, [[TMP1]]
161- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern, i64 [[TMP2]])
169+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2 , i64 [[TMP2]])
162170; CHECK-NEXT: ret void
163171;
164172 tail call void @llvm.experimental.memset.pattern (ptr %a , i64 u0xaaaabbbbccccdddd, i128 %x , i1 false )
165173 ret void
166174}
167175
168- !5 = !{!6 , !6 , i64 0 }
169- !6 = !{!"double" , !7 , i64 0 }
170- !7 = !{!"omnipotent char" , !8 , i64 0 }
171- !8 = !{!"Simple C++ TBAA" }
176+ @G = global i32 5
177+
178+ define void @memset_pattern_i64_16_fromptr (ptr %a ) nounwind {
179+ ; CHECK-LABEL: define void @memset_pattern_i64_16_fromptr(
180+ ; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
181+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern, i64 128)
182+ ; CHECK-NEXT: ret void
183+ ;
184+ tail call void @llvm.experimental.memset.pattern (ptr %a , ptr @G , i64 16 , i1 false )
185+ ret void
186+ }
187+
188+ define void @memset_pattern_i64_x_fromptr (ptr %a , i64 %x ) nounwind {
189+ ; CHECK-LABEL: define void @memset_pattern_i64_x_fromptr(
190+ ; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
191+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i64 8, [[X]]
192+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1, i64 [[TMP2]])
193+ ; CHECK-NEXT: ret void
194+ ;
195+ tail call void @llvm.experimental.memset.pattern (ptr %a , ptr @G , i64 %x , i1 false )
196+ ret void
197+ }
198+
199+ ; memset_pattern16 shouldn't be used for this example (at least not by just
200+ ; creating a constantarray global at compile time), as the ptr isn't constant.
201+ define void @memset_pattern_i64_x_fromnonconstptr (ptr %a , i64 %x , ptr %p ) nounwind {
202+ ; CHECK-LABEL: define void @memset_pattern_i64_x_fromnonconstptr(
203+ ; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
204+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 0, [[X]]
205+ ; CHECK-NEXT: br i1 [[TMP2]], label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]
206+ ; CHECK: [[LOADSTORELOOP]]:
207+ ; CHECK-NEXT: [[TMP3:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP5:%.*]], %[[LOADSTORELOOP]] ]
208+ ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 [[TMP3]]
209+ ; CHECK-NEXT: store ptr [[P]], ptr [[TMP4]], align 1
210+ ; CHECK-NEXT: [[TMP5]] = add i64 [[TMP3]], 1
211+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i64 [[TMP5]], [[X]]
212+ ; CHECK-NEXT: br i1 [[TMP6]], label %[[LOADSTORELOOP]], label %[[SPLIT]]
213+ ; CHECK: [[SPLIT]]:
214+ ; CHECK-NEXT: ret void
215+ ;
216+ tail call void @llvm.experimental.memset.pattern (ptr %a , ptr %p , i64 %x , i1 false )
217+ ret void
218+ }
172219
173220;.
174221; CHECK: attributes #[[ATTR0]] = { nounwind }
0 commit comments