1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2 ; RUN: opt -S -expandmemcmp -memcmp-num-loads-per-block=1 -mtriple=aarch64-unknown-unknown < %s | FileCheck %s
4 declare i32 @memcmp(ptr nocapture, ptr nocapture, i64)
6 define i32 @cmp2(ptr nocapture readonly %x, ptr nocapture readonly %y) {
7 ; CHECK-LABEL: define i32 @cmp2(
8 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
9 ; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[X]], align 1
10 ; CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr [[Y]], align 1
11 ; CHECK-NEXT: [[TMP3:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP1]])
12 ; CHECK-NEXT: [[TMP4:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP2]])
13 ; CHECK-NEXT: [[TMP5:%.*]] = zext i16 [[TMP3]] to i32
14 ; CHECK-NEXT: [[TMP6:%.*]] = zext i16 [[TMP4]] to i32
15 ; CHECK-NEXT: [[TMP7:%.*]] = sub i32 [[TMP5]], [[TMP6]]
16 ; CHECK-NEXT: ret i32 [[TMP7]]
18 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 2)
22 define i32 @cmp2_align2(ptr nocapture readonly align 2 %x, ptr nocapture readonly align 2 %y) {
23 ; CHECK-LABEL: define i32 @cmp2_align2(
24 ; CHECK-SAME: ptr nocapture readonly align 2 [[X:%.*]], ptr nocapture readonly align 2 [[Y:%.*]]) {
25 ; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[X]], align 2
26 ; CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr [[Y]], align 2
27 ; CHECK-NEXT: [[TMP3:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP1]])
28 ; CHECK-NEXT: [[TMP4:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP2]])
29 ; CHECK-NEXT: [[TMP5:%.*]] = zext i16 [[TMP3]] to i32
30 ; CHECK-NEXT: [[TMP6:%.*]] = zext i16 [[TMP4]] to i32
31 ; CHECK-NEXT: [[TMP7:%.*]] = sub i32 [[TMP5]], [[TMP6]]
32 ; CHECK-NEXT: ret i32 [[TMP7]]
34 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 2)
38 define i32 @cmp3(ptr nocapture readonly %x, ptr nocapture readonly %y) {
39 ; CHECK-LABEL: define i32 @cmp3(
40 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
41 ; CHECK-NEXT: [[TMP1:%.*]] = load i24, ptr [[X]], align 1
42 ; CHECK-NEXT: [[TMP2:%.*]] = load i24, ptr [[Y]], align 1
43 ; CHECK-NEXT: [[TMP3:%.*]] = zext i24 [[TMP1]] to i32
44 ; CHECK-NEXT: [[TMP4:%.*]] = zext i24 [[TMP2]] to i32
45 ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP3]])
46 ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP4]])
47 ; CHECK-NEXT: [[TMP7:%.*]] = icmp ugt i32 [[TMP5]], [[TMP6]]
48 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i32 [[TMP5]], [[TMP6]]
49 ; CHECK-NEXT: [[TMP9:%.*]] = zext i1 [[TMP7]] to i32
50 ; CHECK-NEXT: [[TMP10:%.*]] = zext i1 [[TMP8]] to i32
51 ; CHECK-NEXT: [[TMP11:%.*]] = sub i32 [[TMP9]], [[TMP10]]
52 ; CHECK-NEXT: ret i32 [[TMP11]]
54 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 3)
58 define i32 @cmp4(ptr nocapture readonly %x, ptr nocapture readonly %y) {
59 ; CHECK-LABEL: define i32 @cmp4(
60 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
61 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 1
62 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 1
63 ; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP1]])
64 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP2]])
65 ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt i32 [[TMP3]], [[TMP4]]
66 ; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i32 [[TMP3]], [[TMP4]]
67 ; CHECK-NEXT: [[TMP7:%.*]] = zext i1 [[TMP5]] to i32
68 ; CHECK-NEXT: [[TMP8:%.*]] = zext i1 [[TMP6]] to i32
69 ; CHECK-NEXT: [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]
70 ; CHECK-NEXT: ret i32 [[TMP9]]
72 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4)
76 define i32 @cmp5(ptr nocapture readonly %x, ptr nocapture readonly %y) {
77 ; CHECK-LABEL: define i32 @cmp5(
78 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
79 ; CHECK-NEXT: [[TMP1:%.*]] = load i40, ptr [[X]], align 1
80 ; CHECK-NEXT: [[TMP2:%.*]] = load i40, ptr [[Y]], align 1
81 ; CHECK-NEXT: [[TMP3:%.*]] = zext i40 [[TMP1]] to i64
82 ; CHECK-NEXT: [[TMP4:%.*]] = zext i40 [[TMP2]] to i64
83 ; CHECK-NEXT: [[TMP5:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
84 ; CHECK-NEXT: [[TMP6:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
85 ; CHECK-NEXT: [[TMP7:%.*]] = icmp ugt i64 [[TMP5]], [[TMP6]]
86 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i64 [[TMP5]], [[TMP6]]
87 ; CHECK-NEXT: [[TMP9:%.*]] = zext i1 [[TMP7]] to i32
88 ; CHECK-NEXT: [[TMP10:%.*]] = zext i1 [[TMP8]] to i32
89 ; CHECK-NEXT: [[TMP11:%.*]] = sub i32 [[TMP9]], [[TMP10]]
90 ; CHECK-NEXT: ret i32 [[TMP11]]
92 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 5)
96 define i32 @cmp6(ptr nocapture readonly %x, ptr nocapture readonly %y) {
97 ; CHECK-LABEL: define i32 @cmp6(
98 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
99 ; CHECK-NEXT: [[TMP1:%.*]] = load i48, ptr [[X]], align 1
100 ; CHECK-NEXT: [[TMP2:%.*]] = load i48, ptr [[Y]], align 1
101 ; CHECK-NEXT: [[TMP3:%.*]] = zext i48 [[TMP1]] to i64
102 ; CHECK-NEXT: [[TMP4:%.*]] = zext i48 [[TMP2]] to i64
103 ; CHECK-NEXT: [[TMP5:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
104 ; CHECK-NEXT: [[TMP6:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
105 ; CHECK-NEXT: [[TMP7:%.*]] = icmp ugt i64 [[TMP5]], [[TMP6]]
106 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i64 [[TMP5]], [[TMP6]]
107 ; CHECK-NEXT: [[TMP9:%.*]] = zext i1 [[TMP7]] to i32
108 ; CHECK-NEXT: [[TMP10:%.*]] = zext i1 [[TMP8]] to i32
109 ; CHECK-NEXT: [[TMP11:%.*]] = sub i32 [[TMP9]], [[TMP10]]
110 ; CHECK-NEXT: ret i32 [[TMP11]]
112 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 6)
116 define i32 @cmp7(ptr nocapture readonly %x, ptr nocapture readonly %y) {
117 ; CHECK-LABEL: define i32 @cmp7(
118 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
119 ; CHECK-NEXT: br label [[LOADBB:%.*]]
121 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i32 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP12:%.*]], [[LOADBB1:%.*]] ]
122 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i32 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP13:%.*]], [[LOADBB1]] ]
123 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]
124 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
125 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
127 ; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[X]], align 1
128 ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[Y]], align 1
129 ; CHECK-NEXT: [[TMP5]] = call i32 @llvm.bswap.i32(i32 [[TMP3]])
130 ; CHECK-NEXT: [[TMP6]] = call i32 @llvm.bswap.i32(i32 [[TMP4]])
131 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i32 [[TMP5]], [[TMP6]]
132 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
134 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 3
135 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 3
136 ; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 1
137 ; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP9]], align 1
138 ; CHECK-NEXT: [[TMP12]] = call i32 @llvm.bswap.i32(i32 [[TMP10]])
139 ; CHECK-NEXT: [[TMP13]] = call i32 @llvm.bswap.i32(i32 [[TMP11]])
140 ; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[TMP12]], [[TMP13]]
141 ; CHECK-NEXT: br i1 [[TMP14]], label [[ENDBLOCK]], label [[RES_BLOCK]]
143 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
144 ; CHECK-NEXT: ret i32 [[PHI_RES]]
146 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 7)
150 define i32 @cmp8(ptr nocapture readonly %x, ptr nocapture readonly %y) {
151 ; CHECK-LABEL: define i32 @cmp8(
152 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
153 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
154 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
155 ; CHECK-NEXT: [[TMP3:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP1]])
156 ; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP2]])
157 ; CHECK-NEXT: [[TMP5:%.*]] = icmp ugt i64 [[TMP3]], [[TMP4]]
158 ; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i64 [[TMP3]], [[TMP4]]
159 ; CHECK-NEXT: [[TMP7:%.*]] = zext i1 [[TMP5]] to i32
160 ; CHECK-NEXT: [[TMP8:%.*]] = zext i1 [[TMP6]] to i32
161 ; CHECK-NEXT: [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]
162 ; CHECK-NEXT: ret i32 [[TMP9]]
164 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 8)
168 define i32 @cmp9(ptr nocapture readonly %x, ptr nocapture readonly %y) {
169 ; CHECK-LABEL: define i32 @cmp9(
170 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
171 ; CHECK-NEXT: br label [[LOADBB:%.*]]
173 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP5:%.*]], [[TMP6:%.*]]
174 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
175 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
177 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
178 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
179 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
180 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
181 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
182 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]
184 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 8
185 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 8
186 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 1
187 ; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP9]], align 1
188 ; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP10]] to i32
189 ; CHECK-NEXT: [[TMP13:%.*]] = zext i8 [[TMP11]] to i32
190 ; CHECK-NEXT: [[TMP14:%.*]] = sub i32 [[TMP12]], [[TMP13]]
191 ; CHECK-NEXT: br label [[ENDBLOCK]]
193 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ [[TMP14]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
194 ; CHECK-NEXT: ret i32 [[PHI_RES]]
196 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 9)
200 define i32 @cmp10(ptr nocapture readonly %x, ptr nocapture readonly %y) {
201 ; CHECK-LABEL: define i32 @cmp10(
202 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
203 ; CHECK-NEXT: br label [[LOADBB:%.*]]
205 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP14:%.*]], [[LOADBB1:%.*]] ]
206 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP15:%.*]], [[LOADBB1]] ]
207 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
208 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
209 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
211 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
212 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
213 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
214 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
215 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
216 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
218 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 8
219 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 8
220 ; CHECK-NEXT: [[TMP10:%.*]] = load i16, ptr [[TMP8]], align 1
221 ; CHECK-NEXT: [[TMP11:%.*]] = load i16, ptr [[TMP9]], align 1
222 ; CHECK-NEXT: [[TMP12:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP10]])
223 ; CHECK-NEXT: [[TMP13:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP11]])
224 ; CHECK-NEXT: [[TMP14]] = zext i16 [[TMP12]] to i64
225 ; CHECK-NEXT: [[TMP15]] = zext i16 [[TMP13]] to i64
226 ; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[TMP14]], [[TMP15]]
227 ; CHECK-NEXT: br i1 [[TMP16]], label [[ENDBLOCK]], label [[RES_BLOCK]]
229 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
230 ; CHECK-NEXT: ret i32 [[PHI_RES]]
232 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 10)
236 define i32 @cmp11(ptr nocapture readonly %x, ptr nocapture readonly %y) {
237 ; CHECK-LABEL: define i32 @cmp11(
238 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
239 ; CHECK-NEXT: br label [[LOADBB:%.*]]
241 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP12:%.*]], [[LOADBB1:%.*]] ]
242 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP13:%.*]], [[LOADBB1]] ]
243 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
244 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
245 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
247 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
248 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
249 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
250 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
251 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
252 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
254 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 3
255 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 3
256 ; CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP8]], align 1
257 ; CHECK-NEXT: [[TMP11:%.*]] = load i64, ptr [[TMP9]], align 1
258 ; CHECK-NEXT: [[TMP12]] = call i64 @llvm.bswap.i64(i64 [[TMP10]])
259 ; CHECK-NEXT: [[TMP13]] = call i64 @llvm.bswap.i64(i64 [[TMP11]])
260 ; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP12]], [[TMP13]]
261 ; CHECK-NEXT: br i1 [[TMP14]], label [[ENDBLOCK]], label [[RES_BLOCK]]
263 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
264 ; CHECK-NEXT: ret i32 [[PHI_RES]]
266 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 11)
270 define i32 @cmp12(ptr nocapture readonly %x, ptr nocapture readonly %y) {
271 ; CHECK-LABEL: define i32 @cmp12(
272 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
273 ; CHECK-NEXT: br label [[LOADBB:%.*]]
275 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP14:%.*]], [[LOADBB1:%.*]] ]
276 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP15:%.*]], [[LOADBB1]] ]
277 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
278 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
279 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
281 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
282 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
283 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
284 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
285 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
286 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
288 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 8
289 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 8
290 ; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 1
291 ; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP9]], align 1
292 ; CHECK-NEXT: [[TMP12:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP10]])
293 ; CHECK-NEXT: [[TMP13:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP11]])
294 ; CHECK-NEXT: [[TMP14]] = zext i32 [[TMP12]] to i64
295 ; CHECK-NEXT: [[TMP15]] = zext i32 [[TMP13]] to i64
296 ; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i64 [[TMP14]], [[TMP15]]
297 ; CHECK-NEXT: br i1 [[TMP16]], label [[ENDBLOCK]], label [[RES_BLOCK]]
299 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
300 ; CHECK-NEXT: ret i32 [[PHI_RES]]
302 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 12)
306 define i32 @cmp13(ptr nocapture readonly %x, ptr nocapture readonly %y) {
307 ; CHECK-LABEL: define i32 @cmp13(
308 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
309 ; CHECK-NEXT: br label [[LOADBB:%.*]]
311 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP12:%.*]], [[LOADBB1:%.*]] ]
312 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP13:%.*]], [[LOADBB1]] ]
313 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
314 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
315 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
317 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
318 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
319 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
320 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
321 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
322 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
324 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 5
325 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 5
326 ; CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP8]], align 1
327 ; CHECK-NEXT: [[TMP11:%.*]] = load i64, ptr [[TMP9]], align 1
328 ; CHECK-NEXT: [[TMP12]] = call i64 @llvm.bswap.i64(i64 [[TMP10]])
329 ; CHECK-NEXT: [[TMP13]] = call i64 @llvm.bswap.i64(i64 [[TMP11]])
330 ; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP12]], [[TMP13]]
331 ; CHECK-NEXT: br i1 [[TMP14]], label [[ENDBLOCK]], label [[RES_BLOCK]]
333 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
334 ; CHECK-NEXT: ret i32 [[PHI_RES]]
336 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 13)
340 define i32 @cmp14(ptr nocapture readonly %x, ptr nocapture readonly %y) {
341 ; CHECK-LABEL: define i32 @cmp14(
342 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
343 ; CHECK-NEXT: br label [[LOADBB:%.*]]
345 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP12:%.*]], [[LOADBB1:%.*]] ]
346 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP13:%.*]], [[LOADBB1]] ]
347 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
348 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
349 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
351 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
352 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
353 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
354 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
355 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
356 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
358 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 6
359 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 6
360 ; CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP8]], align 1
361 ; CHECK-NEXT: [[TMP11:%.*]] = load i64, ptr [[TMP9]], align 1
362 ; CHECK-NEXT: [[TMP12]] = call i64 @llvm.bswap.i64(i64 [[TMP10]])
363 ; CHECK-NEXT: [[TMP13]] = call i64 @llvm.bswap.i64(i64 [[TMP11]])
364 ; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP12]], [[TMP13]]
365 ; CHECK-NEXT: br i1 [[TMP14]], label [[ENDBLOCK]], label [[RES_BLOCK]]
367 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
368 ; CHECK-NEXT: ret i32 [[PHI_RES]]
370 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 14)
374 define i32 @cmp15(ptr nocapture readonly %x, ptr nocapture readonly %y) {
375 ; CHECK-LABEL: define i32 @cmp15(
376 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
377 ; CHECK-NEXT: br label [[LOADBB:%.*]]
379 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP12:%.*]], [[LOADBB1:%.*]] ]
380 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP13:%.*]], [[LOADBB1]] ]
381 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
382 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
383 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
385 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
386 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
387 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
388 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
389 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
390 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
392 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 7
393 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 7
394 ; CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP8]], align 1
395 ; CHECK-NEXT: [[TMP11:%.*]] = load i64, ptr [[TMP9]], align 1
396 ; CHECK-NEXT: [[TMP12]] = call i64 @llvm.bswap.i64(i64 [[TMP10]])
397 ; CHECK-NEXT: [[TMP13]] = call i64 @llvm.bswap.i64(i64 [[TMP11]])
398 ; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP12]], [[TMP13]]
399 ; CHECK-NEXT: br i1 [[TMP14]], label [[ENDBLOCK]], label [[RES_BLOCK]]
401 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
402 ; CHECK-NEXT: ret i32 [[PHI_RES]]
404 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 15)
408 define i32 @cmp16(ptr nocapture readonly %x, ptr nocapture readonly %y) {
409 ; CHECK-LABEL: define i32 @cmp16(
410 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
411 ; CHECK-NEXT: br label [[LOADBB:%.*]]
413 ; CHECK-NEXT: [[PHI_SRC1:%.*]] = phi i64 [ [[TMP5:%.*]], [[LOADBB]] ], [ [[TMP12:%.*]], [[LOADBB1:%.*]] ]
414 ; CHECK-NEXT: [[PHI_SRC2:%.*]] = phi i64 [ [[TMP6:%.*]], [[LOADBB]] ], [ [[TMP13:%.*]], [[LOADBB1]] ]
415 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
416 ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
417 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
419 ; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X]], align 1
420 ; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[Y]], align 1
421 ; CHECK-NEXT: [[TMP5]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
422 ; CHECK-NEXT: [[TMP6]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
423 ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP5]], [[TMP6]]
424 ; CHECK-NEXT: br i1 [[TMP7]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
426 ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[X]], i64 8
427 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[Y]], i64 8
428 ; CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP8]], align 1
429 ; CHECK-NEXT: [[TMP11:%.*]] = load i64, ptr [[TMP9]], align 1
430 ; CHECK-NEXT: [[TMP12]] = call i64 @llvm.bswap.i64(i64 [[TMP10]])
431 ; CHECK-NEXT: [[TMP13]] = call i64 @llvm.bswap.i64(i64 [[TMP11]])
432 ; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP12]], [[TMP13]]
433 ; CHECK-NEXT: br i1 [[TMP14]], label [[ENDBLOCK]], label [[RES_BLOCK]]
435 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
436 ; CHECK-NEXT: ret i32 [[PHI_RES]]
438 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16)
442 define i32 @cmp_eq2(ptr nocapture readonly %x, ptr nocapture readonly %y) {
443 ; CHECK-LABEL: define i32 @cmp_eq2(
444 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
445 ; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[X]], align 1
446 ; CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr [[Y]], align 1
447 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i16 [[TMP1]], [[TMP2]]
448 ; CHECK-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i32
449 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP4]], 0
450 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
451 ; CHECK-NEXT: ret i32 [[CONV]]
453 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 2)
454 %cmp = icmp eq i32 %call, 0
455 %conv = zext i1 %cmp to i32
459 define i32 @cmp_eq3(ptr nocapture readonly %x, ptr nocapture readonly %y) {
460 ; CHECK-LABEL: define i32 @cmp_eq3(
461 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
462 ; CHECK-NEXT: br label [[LOADBB:%.*]]
464 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
466 ; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[X]], align 1
467 ; CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr [[Y]], align 1
468 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i16 [[TMP1]], [[TMP2]]
469 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
471 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 2
472 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 2
473 ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP4]], align 1
474 ; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP5]], align 1
475 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP6]], [[TMP7]]
476 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
478 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
479 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
480 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
481 ; CHECK-NEXT: ret i32 [[CONV]]
483 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 3)
484 %cmp = icmp eq i32 %call, 0
485 %conv = zext i1 %cmp to i32
489 define i32 @cmp_eq4(ptr nocapture readonly %x, ptr nocapture readonly %y) {
490 ; CHECK-LABEL: define i32 @cmp_eq4(
491 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
492 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 1
493 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 1
494 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
495 ; CHECK-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i32
496 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP4]], 0
497 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
498 ; CHECK-NEXT: ret i32 [[CONV]]
500 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4)
501 %cmp = icmp eq i32 %call, 0
502 %conv = zext i1 %cmp to i32
506 define i32 @cmp_eq5(ptr nocapture readonly %x, ptr nocapture readonly %y) {
507 ; CHECK-LABEL: define i32 @cmp_eq5(
508 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
509 ; CHECK-NEXT: br label [[LOADBB:%.*]]
511 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
513 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 1
514 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 1
515 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
516 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
518 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 4
519 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 4
520 ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP4]], align 1
521 ; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP5]], align 1
522 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP6]], [[TMP7]]
523 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
525 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
526 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
527 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
528 ; CHECK-NEXT: ret i32 [[CONV]]
530 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 5)
531 %cmp = icmp eq i32 %call, 0
532 %conv = zext i1 %cmp to i32
536 define i32 @cmp_eq6(ptr nocapture readonly %x, ptr nocapture readonly %y) {
537 ; CHECK-LABEL: define i32 @cmp_eq6(
538 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
539 ; CHECK-NEXT: br label [[LOADBB:%.*]]
541 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
543 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 1
544 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 1
545 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
546 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
548 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 4
549 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 4
550 ; CHECK-NEXT: [[TMP6:%.*]] = load i16, ptr [[TMP4]], align 1
551 ; CHECK-NEXT: [[TMP7:%.*]] = load i16, ptr [[TMP5]], align 1
552 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i16 [[TMP6]], [[TMP7]]
553 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
555 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
556 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
557 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
558 ; CHECK-NEXT: ret i32 [[CONV]]
560 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 6)
561 %cmp = icmp eq i32 %call, 0
562 %conv = zext i1 %cmp to i32
566 define i32 @cmp_eq6_align4(ptr nocapture readonly align 4 %x, ptr nocapture readonly align 4 %y) {
567 ; CHECK-LABEL: define i32 @cmp_eq6_align4(
568 ; CHECK-SAME: ptr nocapture readonly align 4 [[X:%.*]], ptr nocapture readonly align 4 [[Y:%.*]]) {
569 ; CHECK-NEXT: br label [[LOADBB:%.*]]
571 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
573 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4
574 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 4
575 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
576 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
578 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 4
579 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 4
580 ; CHECK-NEXT: [[TMP6:%.*]] = load i16, ptr [[TMP4]], align 4
581 ; CHECK-NEXT: [[TMP7:%.*]] = load i16, ptr [[TMP5]], align 4
582 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i16 [[TMP6]], [[TMP7]]
583 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
585 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
586 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
587 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
588 ; CHECK-NEXT: ret i32 [[CONV]]
590 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 6)
591 %cmp = icmp eq i32 %call, 0
592 %conv = zext i1 %cmp to i32
596 define i32 @cmp_eq7(ptr nocapture readonly %x, ptr nocapture readonly %y) {
597 ; CHECK-LABEL: define i32 @cmp_eq7(
598 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
599 ; CHECK-NEXT: br label [[LOADBB:%.*]]
601 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
603 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 1
604 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 1
605 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]]
606 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
608 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 3
609 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 3
610 ; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP4]], align 1
611 ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP5]], align 1
612 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP6]], [[TMP7]]
613 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
615 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
616 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
617 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
618 ; CHECK-NEXT: ret i32 [[CONV]]
620 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 7)
621 %cmp = icmp eq i32 %call, 0
622 %conv = zext i1 %cmp to i32
626 define i32 @cmp_eq8(ptr nocapture readonly %x, ptr nocapture readonly %y) {
627 ; CHECK-LABEL: define i32 @cmp_eq8(
628 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
629 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
630 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
631 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
632 ; CHECK-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i32
633 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP4]], 0
634 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
635 ; CHECK-NEXT: ret i32 [[CONV]]
637 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 8)
638 %cmp = icmp eq i32 %call, 0
639 %conv = zext i1 %cmp to i32
643 define i32 @cmp_eq9(ptr nocapture readonly %x, ptr nocapture readonly %y) {
644 ; CHECK-LABEL: define i32 @cmp_eq9(
645 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
646 ; CHECK-NEXT: br label [[LOADBB:%.*]]
648 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
650 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
651 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
652 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
653 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
655 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 8
656 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 8
657 ; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP4]], align 1
658 ; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP5]], align 1
659 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP6]], [[TMP7]]
660 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
662 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
663 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
664 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
665 ; CHECK-NEXT: ret i32 [[CONV]]
667 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 9)
668 %cmp = icmp eq i32 %call, 0
669 %conv = zext i1 %cmp to i32
673 define i32 @cmp_eq10(ptr nocapture readonly %x, ptr nocapture readonly %y) {
674 ; CHECK-LABEL: define i32 @cmp_eq10(
675 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
676 ; CHECK-NEXT: br label [[LOADBB:%.*]]
678 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
680 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
681 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
682 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
683 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
685 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 8
686 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 8
687 ; CHECK-NEXT: [[TMP6:%.*]] = load i16, ptr [[TMP4]], align 1
688 ; CHECK-NEXT: [[TMP7:%.*]] = load i16, ptr [[TMP5]], align 1
689 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i16 [[TMP6]], [[TMP7]]
690 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
692 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
693 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
694 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
695 ; CHECK-NEXT: ret i32 [[CONV]]
697 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 10)
698 %cmp = icmp eq i32 %call, 0
699 %conv = zext i1 %cmp to i32
703 define i32 @cmp_eq11(ptr nocapture readonly %x, ptr nocapture readonly %y) {
704 ; CHECK-LABEL: define i32 @cmp_eq11(
705 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
706 ; CHECK-NEXT: br label [[LOADBB:%.*]]
708 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
710 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
711 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
712 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
713 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
715 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 3
716 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 3
717 ; CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP4]], align 1
718 ; CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[TMP5]], align 1
719 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i64 [[TMP6]], [[TMP7]]
720 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
722 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
723 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
724 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
725 ; CHECK-NEXT: ret i32 [[CONV]]
727 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 11)
728 %cmp = icmp eq i32 %call, 0
729 %conv = zext i1 %cmp to i32
733 define i32 @cmp_eq12(ptr nocapture readonly %x, ptr nocapture readonly %y) {
734 ; CHECK-LABEL: define i32 @cmp_eq12(
735 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
736 ; CHECK-NEXT: br label [[LOADBB:%.*]]
738 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
740 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
741 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
742 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
743 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
745 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 8
746 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 8
747 ; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP4]], align 1
748 ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP5]], align 1
749 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP6]], [[TMP7]]
750 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
752 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
753 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
754 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
755 ; CHECK-NEXT: ret i32 [[CONV]]
757 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 12)
758 %cmp = icmp eq i32 %call, 0
759 %conv = zext i1 %cmp to i32
763 define i32 @cmp_eq13(ptr nocapture readonly %x, ptr nocapture readonly %y) {
764 ; CHECK-LABEL: define i32 @cmp_eq13(
765 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
766 ; CHECK-NEXT: br label [[LOADBB:%.*]]
768 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
770 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
771 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
772 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
773 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
775 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 5
776 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 5
777 ; CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP4]], align 1
778 ; CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[TMP5]], align 1
779 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i64 [[TMP6]], [[TMP7]]
780 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
782 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
783 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
784 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
785 ; CHECK-NEXT: ret i32 [[CONV]]
787 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 13)
788 %cmp = icmp eq i32 %call, 0
789 %conv = zext i1 %cmp to i32
793 define i32 @cmp_eq14(ptr nocapture readonly %x, ptr nocapture readonly %y) {
794 ; CHECK-LABEL: define i32 @cmp_eq14(
795 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
796 ; CHECK-NEXT: br label [[LOADBB:%.*]]
798 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
800 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
801 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
802 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
803 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
805 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 6
806 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 6
807 ; CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP4]], align 1
808 ; CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[TMP5]], align 1
809 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i64 [[TMP6]], [[TMP7]]
810 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
812 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
813 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
814 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
815 ; CHECK-NEXT: ret i32 [[CONV]]
817 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 14)
818 %cmp = icmp eq i32 %call, 0
819 %conv = zext i1 %cmp to i32
823 define i32 @cmp_eq15(ptr nocapture readonly %x, ptr nocapture readonly %y) {
824 ; CHECK-LABEL: define i32 @cmp_eq15(
825 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
826 ; CHECK-NEXT: br label [[LOADBB:%.*]]
828 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
830 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
831 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
832 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
833 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
835 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 7
836 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 7
837 ; CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP4]], align 1
838 ; CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[TMP5]], align 1
839 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i64 [[TMP6]], [[TMP7]]
840 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
842 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
843 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
844 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
845 ; CHECK-NEXT: ret i32 [[CONV]]
847 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 15)
848 %cmp = icmp eq i32 %call, 0
849 %conv = zext i1 %cmp to i32
853 define i32 @cmp_eq16(ptr nocapture readonly %x, ptr nocapture readonly %y) {
854 ; CHECK-LABEL: define i32 @cmp_eq16(
855 ; CHECK-SAME: ptr nocapture readonly [[X:%.*]], ptr nocapture readonly [[Y:%.*]]) {
856 ; CHECK-NEXT: br label [[LOADBB:%.*]]
858 ; CHECK-NEXT: br label [[ENDBLOCK:%.*]]
860 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X]], align 1
861 ; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[Y]], align 1
862 ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[TMP1]], [[TMP2]]
863 ; CHECK-NEXT: br i1 [[TMP3]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
865 ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[X]], i64 8
866 ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[Y]], i64 8
867 ; CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP4]], align 1
868 ; CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[TMP5]], align 1
869 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i64 [[TMP6]], [[TMP7]]
870 ; CHECK-NEXT: br i1 [[TMP8]], label [[RES_BLOCK]], label [[ENDBLOCK]]
872 ; CHECK-NEXT: [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
873 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
874 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
875 ; CHECK-NEXT: ret i32 [[CONV]]
877 %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16)
878 %cmp = icmp eq i32 %call, 0
879 %conv = zext i1 %cmp to i32