2
2
; RUN: opt -mtriple=x86_64-apple-darwin10.0.0 -passes=pre-isel-intrinsic-lowering -S -o - %s | FileCheck %s
3
3
4
4
;.
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
7
8
; 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
12
13
; CHECK: @.memset_pattern.7 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
13
14
; 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
14
17
;.
15
18
define void @memset_pattern_i128_1_dynvalue (ptr %a , i128 %value ) nounwind {
16
19
; 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 {
33
36
define void @memset_pattern_i128_1 (ptr %a , i128 %value ) nounwind {
34
37
; CHECK-LABEL: define void @memset_pattern_i128_1(
35
38
; 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)
37
40
; CHECK-NEXT: ret void
38
41
;
39
42
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
61
64
define void @memset_pattern_i128_1_align_attr (ptr align (16 ) %a , i128 %value ) nounwind {
62
65
; CHECK-LABEL: define void @memset_pattern_i128_1_align_attr(
63
66
; 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)
65
68
; CHECK-NEXT: ret void
66
69
;
67
70
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
71
74
define void @memset_pattern_i128_16 (ptr %a ) nounwind {
72
75
; CHECK-LABEL: define void @memset_pattern_i128_16(
73
76
; 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)
75
78
; CHECK-NEXT: ret void
76
79
;
77
80
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 {
82
85
; CHECK-LABEL: define void @memset_pattern_i128_x(
83
86
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
84
87
; 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]])
86
89
; CHECK-NEXT: ret void
87
90
;
88
91
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 {
112
115
; CHECK-LABEL: define void @memset_pattern_i16_x(
113
116
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
114
117
; 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]])
116
119
; CHECK-NEXT: ret void
117
120
;
118
121
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 {
123
126
; CHECK-LABEL: define void @memset_pattern_i64_x(
124
127
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
125
128
; 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]])
127
130
; CHECK-NEXT: ret void
128
131
;
129
132
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 {
134
137
define void @memset_pattern_i64_128_tbaa (ptr %a ) nounwind {
135
138
; CHECK-LABEL: define void @memset_pattern_i64_128_tbaa(
136
139
; 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]+]]
138
141
; CHECK-NEXT: ret void
139
142
;
140
143
tail call void @llvm.experimental.memset.pattern (ptr %a , i64 u0x400921fb54442d18, i64 128 , i1 false ), !tbaa !5
141
144
ret void
142
145
}
143
146
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
+
144
152
define void @memset_pattern_i64_narrow_idx (ptr %a , i32 %x ) nounwind {
145
153
; CHECK-LABEL: define void @memset_pattern_i64_narrow_idx(
146
154
; CHECK-SAME: ptr [[A:%.*]], i32 [[X:%.*]]) #[[ATTR0]] {
147
155
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[X]] to i64
148
156
; 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]])
150
158
; CHECK-NEXT: ret void
151
159
;
152
160
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 {
158
166
; CHECK-SAME: ptr [[A:%.*]], i128 [[X:%.*]]) #[[ATTR0]] {
159
167
; CHECK-NEXT: [[TMP1:%.*]] = trunc i128 [[X]] to i64
160
168
; 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]])
162
170
; CHECK-NEXT: ret void
163
171
;
164
172
tail call void @llvm.experimental.memset.pattern (ptr %a , i64 u0xaaaabbbbccccdddd, i128 %x , i1 false )
165
173
ret void
166
174
}
167
175
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
+ }
172
219
173
220
;.
174
221
; CHECK: attributes #[[ATTR0]] = { nounwind }
0 commit comments