Skip to content

Commit c676eb7

Browse files
committed
[PreISelIntrinsicLowering][test] Add coverage for @llvm.experimental.memset.pattern with ptr pattern argument
These tests all show the desired output because after #132026, the intrinsic can take any sized type as an argument. The tests were adapted from those I proposed adding in #129220.
1 parent c10e26b commit c676eb7

File tree

1 file changed

+66
-19
lines changed

1 file changed

+66
-19
lines changed

llvm/test/Transforms/PreISelIntrinsicLowering/X86/memset-pattern.ll

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
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
;.
1518
define 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 {
3336
define 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
6164
define 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
7174
define 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 {
134137
define 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+
144152
define 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

Comments
 (0)