[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / ExpandMemCmp / AArch64 / memcmp.ll
blob54f8c7006bb516f063dca477b60d742a8a531f2e
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)
19   ret i32 %call
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)
35   ret i32 %call
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)
55   ret i32 %call
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)
73   ret i32 %call
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)
93   ret i32 %call
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)
113   ret i32 %call
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:%.*]]
120 ; CHECK:       res_block:
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:%.*]]
126 ; CHECK:       loadbb:
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:%.*]]
133 ; CHECK:       loadbb1:
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]]
142 ; CHECK:       endblock:
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)
147   ret i32 %call
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)
165   ret i32 %call
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:%.*]]
172 ; CHECK:       res_block:
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:%.*]]
176 ; CHECK:       loadbb:
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:%.*]]
183 ; CHECK:       loadbb1:
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]]
192 ; CHECK:       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)
197   ret i32 %call
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:%.*]]
204 ; CHECK:       res_block:
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:%.*]]
210 ; CHECK:       loadbb:
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:%.*]]
217 ; CHECK:       loadbb1:
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]]
228 ; CHECK:       endblock:
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)
233   ret i32 %call
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:%.*]]
240 ; CHECK:       res_block:
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:%.*]]
246 ; CHECK:       loadbb:
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:%.*]]
253 ; CHECK:       loadbb1:
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]]
262 ; CHECK:       endblock:
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)
267   ret i32 %call
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:%.*]]
274 ; CHECK:       res_block:
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:%.*]]
280 ; CHECK:       loadbb:
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:%.*]]
287 ; CHECK:       loadbb1:
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]]
298 ; CHECK:       endblock:
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)
303   ret i32 %call
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:%.*]]
310 ; CHECK:       res_block:
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:%.*]]
316 ; CHECK:       loadbb:
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:%.*]]
323 ; CHECK:       loadbb1:
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]]
332 ; CHECK:       endblock:
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)
337   ret i32 %call
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:%.*]]
344 ; CHECK:       res_block:
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:%.*]]
350 ; CHECK:       loadbb:
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:%.*]]
357 ; CHECK:       loadbb1:
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]]
366 ; CHECK:       endblock:
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)
371   ret i32 %call
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:%.*]]
378 ; CHECK:       res_block:
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:%.*]]
384 ; CHECK:       loadbb:
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:%.*]]
391 ; CHECK:       loadbb1:
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]]
400 ; CHECK:       endblock:
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)
405   ret i32 %call
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:%.*]]
412 ; CHECK:       res_block:
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:%.*]]
418 ; CHECK:       loadbb:
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:%.*]]
425 ; CHECK:       loadbb1:
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]]
434 ; CHECK:       endblock:
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)
439   ret i32 %call
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
456   ret i32 %conv
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:%.*]]
463 ; CHECK:       res_block:
464 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
465 ; CHECK:       loadbb:
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:%.*]]
470 ; CHECK:       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]]
477 ; CHECK:       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
486   ret i32 %conv
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
503   ret i32 %conv
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:%.*]]
510 ; CHECK:       res_block:
511 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
512 ; CHECK:       loadbb:
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:%.*]]
517 ; CHECK:       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]]
524 ; CHECK:       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
533   ret i32 %conv
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:%.*]]
540 ; CHECK:       res_block:
541 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
542 ; CHECK:       loadbb:
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:%.*]]
547 ; CHECK:       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]]
554 ; CHECK:       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
563   ret i32 %conv
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:%.*]]
570 ; CHECK:       res_block:
571 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
572 ; CHECK:       loadbb:
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:%.*]]
577 ; CHECK:       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]]
584 ; CHECK:       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
593   ret i32 %conv
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:%.*]]
600 ; CHECK:       res_block:
601 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
602 ; CHECK:       loadbb:
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:%.*]]
607 ; CHECK:       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]]
614 ; CHECK:       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
623   ret i32 %conv
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
640   ret i32 %conv
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:%.*]]
647 ; CHECK:       res_block:
648 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
649 ; CHECK:       loadbb:
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:%.*]]
654 ; CHECK:       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]]
661 ; CHECK:       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
670   ret i32 %conv
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:%.*]]
677 ; CHECK:       res_block:
678 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
679 ; CHECK:       loadbb:
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:%.*]]
684 ; CHECK:       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]]
691 ; CHECK:       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
700   ret i32 %conv
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:%.*]]
707 ; CHECK:       res_block:
708 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
709 ; CHECK:       loadbb:
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:%.*]]
714 ; CHECK:       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]]
721 ; CHECK:       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
730   ret i32 %conv
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:%.*]]
737 ; CHECK:       res_block:
738 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
739 ; CHECK:       loadbb:
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:%.*]]
744 ; CHECK:       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]]
751 ; CHECK:       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
760   ret i32 %conv
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:%.*]]
767 ; CHECK:       res_block:
768 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
769 ; CHECK:       loadbb:
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:%.*]]
774 ; CHECK:       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]]
781 ; CHECK:       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
790   ret i32 %conv
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:%.*]]
797 ; CHECK:       res_block:
798 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
799 ; CHECK:       loadbb:
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:%.*]]
804 ; CHECK:       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]]
811 ; CHECK:       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
820   ret i32 %conv
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:%.*]]
827 ; CHECK:       res_block:
828 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
829 ; CHECK:       loadbb:
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:%.*]]
834 ; CHECK:       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]]
841 ; CHECK:       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
850   ret i32 %conv
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:%.*]]
857 ; CHECK:       res_block:
858 ; CHECK-NEXT:    br label [[ENDBLOCK:%.*]]
859 ; CHECK:       loadbb:
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:%.*]]
864 ; CHECK:       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]]
871 ; CHECK:       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
880   ret i32 %conv