1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -expandmemcmp -memcmp-num-loads-per-block=1 -mtriple=x86_64-unknown-unknown -data-layout=e-m:o-i64:64-f80:128-n8:16:32:64-S128         < %s | FileCheck %s --check-prefix=X64 --check-prefix=X64_1LD
3; RUN: opt -S -expandmemcmp -memcmp-num-loads-per-block=2 -mtriple=x86_64-unknown-unknown -data-layout=e-m:o-i64:64-f80:128-n8:16:32:64-S128         < %s | FileCheck %s --check-prefix=X64 --check-prefix=X64_2LD
4
5declare i32 @memcmp(i8* nocapture, i8* nocapture, i64)
6
7define i32 @cmp2(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
8; X64-LABEL: @cmp2(
9; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i16*
10; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i16*
11; X64-NEXT:    [[TMP3:%.*]] = load i16, i16* [[TMP1]], align 1
12; X64-NEXT:    [[TMP4:%.*]] = load i16, i16* [[TMP2]], align 1
13; X64-NEXT:    [[TMP5:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP3]])
14; X64-NEXT:    [[TMP6:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP4]])
15; X64-NEXT:    [[TMP7:%.*]] = zext i16 [[TMP5]] to i32
16; X64-NEXT:    [[TMP8:%.*]] = zext i16 [[TMP6]] to i32
17; X64-NEXT:    [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]
18; X64-NEXT:    ret i32 [[TMP9]]
19;
20  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 2)
21  ret i32 %call
22}
23
24define i32 @cmp2_align2(i8* nocapture readonly align 2 %x, i8* nocapture readonly align 2 %y)  {
25; X64-LABEL: @cmp2_align2(
26; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i16*
27; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i16*
28; X64-NEXT:    [[TMP3:%.*]] = load i16, i16* [[TMP1]], align 2
29; X64-NEXT:    [[TMP4:%.*]] = load i16, i16* [[TMP2]], align 2
30; X64-NEXT:    [[TMP5:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP3]])
31; X64-NEXT:    [[TMP6:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP4]])
32; X64-NEXT:    [[TMP7:%.*]] = zext i16 [[TMP5]] to i32
33; X64-NEXT:    [[TMP8:%.*]] = zext i16 [[TMP6]] to i32
34; X64-NEXT:    [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]
35; X64-NEXT:    ret i32 [[TMP9]]
36;
37  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 2)
38  ret i32 %call
39}
40
41define i32 @cmp3(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
42; X64-LABEL: @cmp3(
43; X64-NEXT:    br label [[LOADBB:%.*]]
44; X64:       res_block:
45; X64-NEXT:    [[TMP1:%.*]] = icmp ult i16 [[TMP7:%.*]], [[TMP8:%.*]]
46; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
47; X64-NEXT:    br label [[ENDBLOCK:%.*]]
48; X64:       loadbb:
49; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i16*
50; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i16*
51; X64-NEXT:    [[TMP5:%.*]] = load i16, i16* [[TMP3]], align 1
52; X64-NEXT:    [[TMP6:%.*]] = load i16, i16* [[TMP4]], align 1
53; X64-NEXT:    [[TMP7]] = call i16 @llvm.bswap.i16(i16 [[TMP5]])
54; X64-NEXT:    [[TMP8]] = call i16 @llvm.bswap.i16(i16 [[TMP6]])
55; X64-NEXT:    [[TMP9:%.*]] = icmp eq i16 [[TMP7]], [[TMP8]]
56; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]
57; X64:       loadbb1:
58; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 2
59; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 2
60; X64-NEXT:    [[TMP12:%.*]] = load i8, i8* [[TMP10]], align 1
61; X64-NEXT:    [[TMP13:%.*]] = load i8, i8* [[TMP11]], align 1
62; X64-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i32
63; X64-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i32
64; X64-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]
65; X64-NEXT:    br label [[ENDBLOCK]]
66; X64:       endblock:
67; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
68; X64-NEXT:    ret i32 [[PHI_RES]]
69;
70  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 3)
71  ret i32 %call
72}
73
74define i32 @cmp4(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
75; X64-LABEL: @cmp4(
76; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
77; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
78; X64-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
79; X64-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
80; X64-NEXT:    [[TMP5:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP3]])
81; X64-NEXT:    [[TMP6:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP4]])
82; X64-NEXT:    [[TMP7:%.*]] = icmp ugt i32 [[TMP5]], [[TMP6]]
83; X64-NEXT:    [[TMP8:%.*]] = icmp ult i32 [[TMP5]], [[TMP6]]
84; X64-NEXT:    [[TMP9:%.*]] = zext i1 [[TMP7]] to i32
85; X64-NEXT:    [[TMP10:%.*]] = zext i1 [[TMP8]] to i32
86; X64-NEXT:    [[TMP11:%.*]] = sub i32 [[TMP9]], [[TMP10]]
87; X64-NEXT:    ret i32 [[TMP11]]
88;
89  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 4)
90  ret i32 %call
91}
92
93define i32 @cmp5(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
94; X64-LABEL: @cmp5(
95; X64-NEXT:    br label [[LOADBB:%.*]]
96; X64:       res_block:
97; X64-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[TMP7:%.*]], [[TMP8:%.*]]
98; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
99; X64-NEXT:    br label [[ENDBLOCK:%.*]]
100; X64:       loadbb:
101; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i32*
102; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i32*
103; X64-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP3]], align 1
104; X64-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP4]], align 1
105; X64-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])
106; X64-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])
107; X64-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]
108; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]
109; X64:       loadbb1:
110; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 4
111; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 4
112; X64-NEXT:    [[TMP12:%.*]] = load i8, i8* [[TMP10]], align 1
113; X64-NEXT:    [[TMP13:%.*]] = load i8, i8* [[TMP11]], align 1
114; X64-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i32
115; X64-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i32
116; X64-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]
117; X64-NEXT:    br label [[ENDBLOCK]]
118; X64:       endblock:
119; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
120; X64-NEXT:    ret i32 [[PHI_RES]]
121;
122  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 5)
123  ret i32 %call
124}
125
126define i32 @cmp6(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
127; X64-LABEL: @cmp6(
128; X64-NEXT:    br label [[LOADBB:%.*]]
129; X64:       res_block:
130; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]
131; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]
132; X64-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]
133; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
134; X64-NEXT:    br label [[ENDBLOCK:%.*]]
135; X64:       loadbb:
136; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i32*
137; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i32*
138; X64-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP3]], align 1
139; X64-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP4]], align 1
140; X64-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])
141; X64-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])
142; X64-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]
143; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
144; X64:       loadbb1:
145; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 4
146; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 4
147; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i16*
148; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i16*
149; X64-NEXT:    [[TMP14:%.*]] = load i16, i16* [[TMP12]], align 1
150; X64-NEXT:    [[TMP15:%.*]] = load i16, i16* [[TMP13]], align 1
151; X64-NEXT:    [[TMP16:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP14]])
152; X64-NEXT:    [[TMP17:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP15]])
153; X64-NEXT:    [[TMP18]] = zext i16 [[TMP16]] to i32
154; X64-NEXT:    [[TMP19]] = zext i16 [[TMP17]] to i32
155; X64-NEXT:    [[TMP20:%.*]] = icmp eq i32 [[TMP18]], [[TMP19]]
156; X64-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]
157; X64:       endblock:
158; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
159; X64-NEXT:    ret i32 [[PHI_RES]]
160;
161  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 6)
162  ret i32 %call
163}
164
165define i32 @cmp7(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
166; X64-LABEL: @cmp7(
167; X64-NEXT:    br label [[LOADBB:%.*]]
168; X64:       res_block:
169; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]
170; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]
171; X64-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]
172; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
173; X64-NEXT:    br label [[ENDBLOCK:%.*]]
174; X64:       loadbb:
175; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i32*
176; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i32*
177; X64-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP3]], align 1
178; X64-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP4]], align 1
179; X64-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])
180; X64-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])
181; X64-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]
182; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
183; X64:       loadbb1:
184; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 3
185; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 3
186; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i32*
187; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i32*
188; X64-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP12]], align 1
189; X64-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP13]], align 1
190; X64-NEXT:    [[TMP16]] = call i32 @llvm.bswap.i32(i32 [[TMP14]])
191; X64-NEXT:    [[TMP17]] = call i32 @llvm.bswap.i32(i32 [[TMP15]])
192; X64-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[TMP16]], [[TMP17]]
193; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]
194; X64:       endblock:
195; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
196; X64-NEXT:    ret i32 [[PHI_RES]]
197;
198  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 7)
199  ret i32 %call
200}
201
202define i32 @cmp8(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
203; X64-LABEL: @cmp8(
204; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
205; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
206; X64-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
207; X64-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
208; X64-NEXT:    [[TMP5:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])
209; X64-NEXT:    [[TMP6:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])
210; X64-NEXT:    [[TMP7:%.*]] = icmp ugt i64 [[TMP5]], [[TMP6]]
211; X64-NEXT:    [[TMP8:%.*]] = icmp ult i64 [[TMP5]], [[TMP6]]
212; X64-NEXT:    [[TMP9:%.*]] = zext i1 [[TMP7]] to i32
213; X64-NEXT:    [[TMP10:%.*]] = zext i1 [[TMP8]] to i32
214; X64-NEXT:    [[TMP11:%.*]] = sub i32 [[TMP9]], [[TMP10]]
215; X64-NEXT:    ret i32 [[TMP11]]
216;
217  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 8)
218  ret i32 %call
219}
220
221define i32 @cmp9(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
222; X64-LABEL: @cmp9(
223; X64-NEXT:    br label [[LOADBB:%.*]]
224; X64:       res_block:
225; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[TMP7:%.*]], [[TMP8:%.*]]
226; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
227; X64-NEXT:    br label [[ENDBLOCK:%.*]]
228; X64:       loadbb:
229; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
230; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
231; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
232; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
233; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
234; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
235; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
236; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]
237; X64:       loadbb1:
238; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 8
239; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 8
240; X64-NEXT:    [[TMP12:%.*]] = load i8, i8* [[TMP10]], align 1
241; X64-NEXT:    [[TMP13:%.*]] = load i8, i8* [[TMP11]], align 1
242; X64-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i32
243; X64-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i32
244; X64-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]
245; X64-NEXT:    br label [[ENDBLOCK]]
246; X64:       endblock:
247; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
248; X64-NEXT:    ret i32 [[PHI_RES]]
249;
250  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 9)
251  ret i32 %call
252}
253
254define i32 @cmp10(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
255; X64-LABEL: @cmp10(
256; X64-NEXT:    br label [[LOADBB:%.*]]
257; X64:       res_block:
258; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]
259; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]
260; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
261; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
262; X64-NEXT:    br label [[ENDBLOCK:%.*]]
263; X64:       loadbb:
264; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
265; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
266; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
267; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
268; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
269; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
270; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
271; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
272; X64:       loadbb1:
273; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 8
274; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 8
275; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i16*
276; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i16*
277; X64-NEXT:    [[TMP14:%.*]] = load i16, i16* [[TMP12]], align 1
278; X64-NEXT:    [[TMP15:%.*]] = load i16, i16* [[TMP13]], align 1
279; X64-NEXT:    [[TMP16:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP14]])
280; X64-NEXT:    [[TMP17:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP15]])
281; X64-NEXT:    [[TMP18]] = zext i16 [[TMP16]] to i64
282; X64-NEXT:    [[TMP19]] = zext i16 [[TMP17]] to i64
283; X64-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[TMP18]], [[TMP19]]
284; X64-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]
285; X64:       endblock:
286; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
287; X64-NEXT:    ret i32 [[PHI_RES]]
288;
289  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 10)
290  ret i32 %call
291}
292
293define i32 @cmp11(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
294; X64-LABEL: @cmp11(
295; X64-NEXT:    br label [[LOADBB:%.*]]
296; X64:       res_block:
297; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]
298; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]
299; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
300; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
301; X64-NEXT:    br label [[ENDBLOCK:%.*]]
302; X64:       loadbb:
303; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
304; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
305; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
306; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
307; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
308; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
309; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
310; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
311; X64:       loadbb1:
312; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 3
313; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 3
314; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i64*
315; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i64*
316; X64-NEXT:    [[TMP14:%.*]] = load i64, i64* [[TMP12]], align 1
317; X64-NEXT:    [[TMP15:%.*]] = load i64, i64* [[TMP13]], align 1
318; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])
319; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])
320; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]
321; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]
322; X64:       endblock:
323; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
324; X64-NEXT:    ret i32 [[PHI_RES]]
325;
326  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 11)
327  ret i32 %call
328}
329
330define i32 @cmp12(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
331; X64-LABEL: @cmp12(
332; X64-NEXT:    br label [[LOADBB:%.*]]
333; X64:       res_block:
334; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]
335; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]
336; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
337; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
338; X64-NEXT:    br label [[ENDBLOCK:%.*]]
339; X64:       loadbb:
340; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
341; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
342; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
343; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
344; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
345; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
346; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
347; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
348; X64:       loadbb1:
349; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 8
350; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 8
351; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i32*
352; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i32*
353; X64-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP12]], align 1
354; X64-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP13]], align 1
355; X64-NEXT:    [[TMP16:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP14]])
356; X64-NEXT:    [[TMP17:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP15]])
357; X64-NEXT:    [[TMP18]] = zext i32 [[TMP16]] to i64
358; X64-NEXT:    [[TMP19]] = zext i32 [[TMP17]] to i64
359; X64-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[TMP18]], [[TMP19]]
360; X64-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]
361; X64:       endblock:
362; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
363; X64-NEXT:    ret i32 [[PHI_RES]]
364;
365  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 12)
366  ret i32 %call
367}
368
369define i32 @cmp13(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
370; X64-LABEL: @cmp13(
371; X64-NEXT:    br label [[LOADBB:%.*]]
372; X64:       res_block:
373; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]
374; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]
375; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
376; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
377; X64-NEXT:    br label [[ENDBLOCK:%.*]]
378; X64:       loadbb:
379; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
380; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
381; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
382; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
383; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
384; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
385; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
386; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
387; X64:       loadbb1:
388; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 5
389; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 5
390; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i64*
391; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i64*
392; X64-NEXT:    [[TMP14:%.*]] = load i64, i64* [[TMP12]], align 1
393; X64-NEXT:    [[TMP15:%.*]] = load i64, i64* [[TMP13]], align 1
394; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])
395; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])
396; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]
397; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]
398; X64:       endblock:
399; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
400; X64-NEXT:    ret i32 [[PHI_RES]]
401;
402  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 13)
403  ret i32 %call
404}
405
406define i32 @cmp14(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
407; X64-LABEL: @cmp14(
408; X64-NEXT:    br label [[LOADBB:%.*]]
409; X64:       res_block:
410; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]
411; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]
412; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
413; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
414; X64-NEXT:    br label [[ENDBLOCK:%.*]]
415; X64:       loadbb:
416; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
417; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
418; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
419; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
420; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
421; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
422; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
423; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
424; X64:       loadbb1:
425; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 6
426; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 6
427; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i64*
428; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i64*
429; X64-NEXT:    [[TMP14:%.*]] = load i64, i64* [[TMP12]], align 1
430; X64-NEXT:    [[TMP15:%.*]] = load i64, i64* [[TMP13]], align 1
431; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])
432; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])
433; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]
434; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]
435; X64:       endblock:
436; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
437; X64-NEXT:    ret i32 [[PHI_RES]]
438;
439  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 14)
440  ret i32 %call
441}
442
443define i32 @cmp15(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
444; X64-LABEL: @cmp15(
445; X64-NEXT:    br label [[LOADBB:%.*]]
446; X64:       res_block:
447; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]
448; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]
449; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
450; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
451; X64-NEXT:    br label [[ENDBLOCK:%.*]]
452; X64:       loadbb:
453; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
454; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
455; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
456; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
457; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
458; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
459; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
460; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
461; X64:       loadbb1:
462; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 7
463; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 7
464; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i64*
465; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i64*
466; X64-NEXT:    [[TMP14:%.*]] = load i64, i64* [[TMP12]], align 1
467; X64-NEXT:    [[TMP15:%.*]] = load i64, i64* [[TMP13]], align 1
468; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])
469; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])
470; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]
471; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]
472; X64:       endblock:
473; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
474; X64-NEXT:    ret i32 [[PHI_RES]]
475;
476  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 15)
477  ret i32 %call
478}
479
480define i32 @cmp16(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
481; X64-LABEL: @cmp16(
482; X64-NEXT:    br label [[LOADBB:%.*]]
483; X64:       res_block:
484; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]
485; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]
486; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]
487; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1
488; X64-NEXT:    br label [[ENDBLOCK:%.*]]
489; X64:       loadbb:
490; X64-NEXT:    [[TMP3:%.*]] = bitcast i8* [[X:%.*]] to i64*
491; X64-NEXT:    [[TMP4:%.*]] = bitcast i8* [[Y:%.*]] to i64*
492; X64-NEXT:    [[TMP5:%.*]] = load i64, i64* [[TMP3]], align 1
493; X64-NEXT:    [[TMP6:%.*]] = load i64, i64* [[TMP4]], align 1
494; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])
495; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])
496; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]
497; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]
498; X64:       loadbb1:
499; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, i8* [[X]], i64 8
500; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, i8* [[Y]], i64 8
501; X64-NEXT:    [[TMP12:%.*]] = bitcast i8* [[TMP10]] to i64*
502; X64-NEXT:    [[TMP13:%.*]] = bitcast i8* [[TMP11]] to i64*
503; X64-NEXT:    [[TMP14:%.*]] = load i64, i64* [[TMP12]], align 1
504; X64-NEXT:    [[TMP15:%.*]] = load i64, i64* [[TMP13]], align 1
505; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])
506; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])
507; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]
508; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]
509; X64:       endblock:
510; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]
511; X64-NEXT:    ret i32 [[PHI_RES]]
512;
513  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16)
514  ret i32 %call
515}
516
517define i32 @cmp_eq2(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
518; X64-LABEL: @cmp_eq2(
519; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i16*
520; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i16*
521; X64-NEXT:    [[TMP3:%.*]] = load i16, i16* [[TMP1]], align 1
522; X64-NEXT:    [[TMP4:%.*]] = load i16, i16* [[TMP2]], align 1
523; X64-NEXT:    [[TMP5:%.*]] = icmp ne i16 [[TMP3]], [[TMP4]]
524; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
525; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0
526; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
527; X64-NEXT:    ret i32 [[CONV]]
528;
529  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 2)
530  %cmp = icmp eq i32 %call, 0
531  %conv = zext i1 %cmp to i32
532  ret i32 %conv
533}
534
535define i32 @cmp_eq3(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
536; X64_1LD-LABEL: @cmp_eq3(
537; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
538; X64_1LD:       res_block:
539; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
540; X64_1LD:       loadbb:
541; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i16*
542; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i16*
543; X64_1LD-NEXT:    [[TMP3:%.*]] = load i16, i16* [[TMP1]], align 1
544; X64_1LD-NEXT:    [[TMP4:%.*]] = load i16, i16* [[TMP2]], align 1
545; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i16 [[TMP3]], [[TMP4]]
546; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
547; X64_1LD:       loadbb1:
548; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 2
549; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 2
550; X64_1LD-NEXT:    [[TMP8:%.*]] = load i8, i8* [[TMP6]], align 1
551; X64_1LD-NEXT:    [[TMP9:%.*]] = load i8, i8* [[TMP7]], align 1
552; X64_1LD-NEXT:    [[TMP10:%.*]] = icmp ne i8 [[TMP8]], [[TMP9]]
553; X64_1LD-NEXT:    br i1 [[TMP10]], label [[RES_BLOCK]], label [[ENDBLOCK]]
554; X64_1LD:       endblock:
555; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
556; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
557; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
558; X64_1LD-NEXT:    ret i32 [[CONV]]
559;
560; X64_2LD-LABEL: @cmp_eq3(
561; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i16*
562; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i16*
563; X64_2LD-NEXT:    [[TMP3:%.*]] = load i16, i16* [[TMP1]], align 1
564; X64_2LD-NEXT:    [[TMP4:%.*]] = load i16, i16* [[TMP2]], align 1
565; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i16 [[TMP3]], [[TMP4]]
566; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 2
567; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 2
568; X64_2LD-NEXT:    [[TMP8:%.*]] = load i8, i8* [[TMP6]], align 1
569; X64_2LD-NEXT:    [[TMP9:%.*]] = load i8, i8* [[TMP7]], align 1
570; X64_2LD-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i16
571; X64_2LD-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i16
572; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i16 [[TMP10]], [[TMP11]]
573; X64_2LD-NEXT:    [[TMP13:%.*]] = or i16 [[TMP5]], [[TMP12]]
574; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i16 [[TMP13]], 0
575; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
576; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
577; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
578; X64_2LD-NEXT:    ret i32 [[CONV]]
579;
580  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 3)
581  %cmp = icmp eq i32 %call, 0
582  %conv = zext i1 %cmp to i32
583  ret i32 %conv
584}
585
586define i32 @cmp_eq4(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
587; X64-LABEL: @cmp_eq4(
588; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
589; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
590; X64-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
591; X64-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
592; X64-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]
593; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
594; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0
595; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
596; X64-NEXT:    ret i32 [[CONV]]
597;
598  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 4)
599  %cmp = icmp eq i32 %call, 0
600  %conv = zext i1 %cmp to i32
601  ret i32 %conv
602}
603
604define i32 @cmp_eq5(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
605; X64_1LD-LABEL: @cmp_eq5(
606; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
607; X64_1LD:       res_block:
608; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
609; X64_1LD:       loadbb:
610; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
611; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
612; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
613; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
614; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]
615; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
616; X64_1LD:       loadbb1:
617; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 4
618; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 4
619; X64_1LD-NEXT:    [[TMP8:%.*]] = load i8, i8* [[TMP6]], align 1
620; X64_1LD-NEXT:    [[TMP9:%.*]] = load i8, i8* [[TMP7]], align 1
621; X64_1LD-NEXT:    [[TMP10:%.*]] = icmp ne i8 [[TMP8]], [[TMP9]]
622; X64_1LD-NEXT:    br i1 [[TMP10]], label [[RES_BLOCK]], label [[ENDBLOCK]]
623; X64_1LD:       endblock:
624; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
625; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
626; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
627; X64_1LD-NEXT:    ret i32 [[CONV]]
628;
629; X64_2LD-LABEL: @cmp_eq5(
630; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
631; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
632; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
633; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
634; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
635; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 4
636; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 4
637; X64_2LD-NEXT:    [[TMP8:%.*]] = load i8, i8* [[TMP6]], align 1
638; X64_2LD-NEXT:    [[TMP9:%.*]] = load i8, i8* [[TMP7]], align 1
639; X64_2LD-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i32
640; X64_2LD-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i32
641; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]
642; X64_2LD-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]
643; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
644; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
645; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
646; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
647; X64_2LD-NEXT:    ret i32 [[CONV]]
648;
649  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 5)
650  %cmp = icmp eq i32 %call, 0
651  %conv = zext i1 %cmp to i32
652  ret i32 %conv
653}
654
655define i32 @cmp_eq6(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
656; X64_1LD-LABEL: @cmp_eq6(
657; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
658; X64_1LD:       res_block:
659; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
660; X64_1LD:       loadbb:
661; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
662; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
663; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
664; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
665; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]
666; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
667; X64_1LD:       loadbb1:
668; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 4
669; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 4
670; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i16*
671; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i16*
672; X64_1LD-NEXT:    [[TMP10:%.*]] = load i16, i16* [[TMP8]], align 1
673; X64_1LD-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP9]], align 1
674; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i16 [[TMP10]], [[TMP11]]
675; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
676; X64_1LD:       endblock:
677; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
678; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
679; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
680; X64_1LD-NEXT:    ret i32 [[CONV]]
681;
682; X64_2LD-LABEL: @cmp_eq6(
683; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
684; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
685; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
686; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
687; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
688; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 4
689; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 4
690; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i16*
691; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i16*
692; X64_2LD-NEXT:    [[TMP10:%.*]] = load i16, i16* [[TMP8]], align 1
693; X64_2LD-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP9]], align 1
694; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i32
695; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i32
696; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i32 [[TMP12]], [[TMP13]]
697; X64_2LD-NEXT:    [[TMP15:%.*]] = or i32 [[TMP5]], [[TMP14]]
698; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
699; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32
700; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0
701; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
702; X64_2LD-NEXT:    ret i32 [[CONV]]
703;
704  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 6)
705  %cmp = icmp eq i32 %call, 0
706  %conv = zext i1 %cmp to i32
707  ret i32 %conv
708}
709
710define i32 @cmp_eq6_align4(i8* nocapture readonly align 4 %x, i8* nocapture readonly align 4 %y)  {
711; X64_1LD-LABEL: @cmp_eq6_align4(
712; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
713; X64_1LD:       res_block:
714; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
715; X64_1LD:       loadbb:
716; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
717; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
718; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 4
719; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 4
720; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]
721; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
722; X64_1LD:       loadbb1:
723; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 4
724; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 4
725; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i16*
726; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i16*
727; X64_1LD-NEXT:    [[TMP10:%.*]] = load i16, i16* [[TMP8]], align 4
728; X64_1LD-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP9]], align 4
729; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i16 [[TMP10]], [[TMP11]]
730; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
731; X64_1LD:       endblock:
732; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
733; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
734; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
735; X64_1LD-NEXT:    ret i32 [[CONV]]
736;
737; X64_2LD-LABEL: @cmp_eq6_align4(
738; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
739; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
740; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 4
741; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 4
742; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
743; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 4
744; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 4
745; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i16*
746; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i16*
747; X64_2LD-NEXT:    [[TMP10:%.*]] = load i16, i16* [[TMP8]], align 4
748; X64_2LD-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP9]], align 4
749; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i32
750; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i32
751; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i32 [[TMP12]], [[TMP13]]
752; X64_2LD-NEXT:    [[TMP15:%.*]] = or i32 [[TMP5]], [[TMP14]]
753; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
754; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32
755; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0
756; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
757; X64_2LD-NEXT:    ret i32 [[CONV]]
758;
759  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 6)
760  %cmp = icmp eq i32 %call, 0
761  %conv = zext i1 %cmp to i32
762  ret i32 %conv
763}
764
765define i32 @cmp_eq7(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
766; X64_1LD-LABEL: @cmp_eq7(
767; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
768; X64_1LD:       res_block:
769; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
770; X64_1LD:       loadbb:
771; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
772; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
773; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
774; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
775; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]
776; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
777; X64_1LD:       loadbb1:
778; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 3
779; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 3
780; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i32*
781; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i32*
782; X64_1LD-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP8]], align 1
783; X64_1LD-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP9]], align 1
784; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i32 [[TMP10]], [[TMP11]]
785; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
786; X64_1LD:       endblock:
787; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
788; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
789; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
790; X64_1LD-NEXT:    ret i32 [[CONV]]
791;
792; X64_2LD-LABEL: @cmp_eq7(
793; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i32*
794; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i32*
795; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP1]], align 1
796; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP2]], align 1
797; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]
798; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 3
799; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 3
800; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i32*
801; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i32*
802; X64_2LD-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP8]], align 1
803; X64_2LD-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP9]], align 1
804; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]
805; X64_2LD-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]
806; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
807; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
808; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
809; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
810; X64_2LD-NEXT:    ret i32 [[CONV]]
811;
812  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 7)
813  %cmp = icmp eq i32 %call, 0
814  %conv = zext i1 %cmp to i32
815  ret i32 %conv
816}
817
818define i32 @cmp_eq8(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
819; X64-LABEL: @cmp_eq8(
820; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
821; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
822; X64-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
823; X64-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
824; X64-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
825; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
826; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0
827; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
828; X64-NEXT:    ret i32 [[CONV]]
829;
830  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 8)
831  %cmp = icmp eq i32 %call, 0
832  %conv = zext i1 %cmp to i32
833  ret i32 %conv
834}
835
836define i32 @cmp_eq9(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
837; X64_1LD-LABEL: @cmp_eq9(
838; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
839; X64_1LD:       res_block:
840; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
841; X64_1LD:       loadbb:
842; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
843; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
844; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
845; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
846; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
847; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
848; X64_1LD:       loadbb1:
849; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 8
850; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 8
851; X64_1LD-NEXT:    [[TMP8:%.*]] = load i8, i8* [[TMP6]], align 1
852; X64_1LD-NEXT:    [[TMP9:%.*]] = load i8, i8* [[TMP7]], align 1
853; X64_1LD-NEXT:    [[TMP10:%.*]] = icmp ne i8 [[TMP8]], [[TMP9]]
854; X64_1LD-NEXT:    br i1 [[TMP10]], label [[RES_BLOCK]], label [[ENDBLOCK]]
855; X64_1LD:       endblock:
856; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
857; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
858; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
859; X64_1LD-NEXT:    ret i32 [[CONV]]
860;
861; X64_2LD-LABEL: @cmp_eq9(
862; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
863; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
864; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
865; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
866; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
867; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 8
868; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 8
869; X64_2LD-NEXT:    [[TMP8:%.*]] = load i8, i8* [[TMP6]], align 1
870; X64_2LD-NEXT:    [[TMP9:%.*]] = load i8, i8* [[TMP7]], align 1
871; X64_2LD-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i64
872; X64_2LD-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i64
873; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]
874; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]
875; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0
876; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
877; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
878; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
879; X64_2LD-NEXT:    ret i32 [[CONV]]
880;
881  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 9)
882  %cmp = icmp eq i32 %call, 0
883  %conv = zext i1 %cmp to i32
884  ret i32 %conv
885}
886
887define i32 @cmp_eq10(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
888; X64_1LD-LABEL: @cmp_eq10(
889; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
890; X64_1LD:       res_block:
891; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
892; X64_1LD:       loadbb:
893; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
894; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
895; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
896; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
897; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
898; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
899; X64_1LD:       loadbb1:
900; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 8
901; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 8
902; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i16*
903; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i16*
904; X64_1LD-NEXT:    [[TMP10:%.*]] = load i16, i16* [[TMP8]], align 1
905; X64_1LD-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP9]], align 1
906; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i16 [[TMP10]], [[TMP11]]
907; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
908; X64_1LD:       endblock:
909; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
910; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
911; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
912; X64_1LD-NEXT:    ret i32 [[CONV]]
913;
914; X64_2LD-LABEL: @cmp_eq10(
915; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
916; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
917; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
918; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
919; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
920; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 8
921; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 8
922; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i16*
923; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i16*
924; X64_2LD-NEXT:    [[TMP10:%.*]] = load i16, i16* [[TMP8]], align 1
925; X64_2LD-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP9]], align 1
926; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i64
927; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i64
928; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP12]], [[TMP13]]
929; X64_2LD-NEXT:    [[TMP15:%.*]] = or i64 [[TMP5]], [[TMP14]]
930; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i64 [[TMP15]], 0
931; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32
932; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0
933; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
934; X64_2LD-NEXT:    ret i32 [[CONV]]
935;
936  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 10)
937  %cmp = icmp eq i32 %call, 0
938  %conv = zext i1 %cmp to i32
939  ret i32 %conv
940}
941
942define i32 @cmp_eq11(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
943; X64_1LD-LABEL: @cmp_eq11(
944; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
945; X64_1LD:       res_block:
946; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
947; X64_1LD:       loadbb:
948; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
949; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
950; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
951; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
952; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
953; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
954; X64_1LD:       loadbb1:
955; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 3
956; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 3
957; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
958; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
959; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
960; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
961; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]
962; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
963; X64_1LD:       endblock:
964; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
965; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
966; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
967; X64_1LD-NEXT:    ret i32 [[CONV]]
968;
969; X64_2LD-LABEL: @cmp_eq11(
970; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
971; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
972; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
973; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
974; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
975; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 3
976; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 3
977; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
978; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
979; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
980; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
981; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]
982; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]
983; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0
984; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
985; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
986; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
987; X64_2LD-NEXT:    ret i32 [[CONV]]
988;
989  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 11)
990  %cmp = icmp eq i32 %call, 0
991  %conv = zext i1 %cmp to i32
992  ret i32 %conv
993}
994
995define i32 @cmp_eq12(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
996; X64_1LD-LABEL: @cmp_eq12(
997; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
998; X64_1LD:       res_block:
999; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
1000; X64_1LD:       loadbb:
1001; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1002; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1003; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1004; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1005; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
1006; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
1007; X64_1LD:       loadbb1:
1008; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 8
1009; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 8
1010; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i32*
1011; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i32*
1012; X64_1LD-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP8]], align 1
1013; X64_1LD-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP9]], align 1
1014; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i32 [[TMP10]], [[TMP11]]
1015; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
1016; X64_1LD:       endblock:
1017; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
1018; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
1019; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1020; X64_1LD-NEXT:    ret i32 [[CONV]]
1021;
1022; X64_2LD-LABEL: @cmp_eq12(
1023; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1024; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1025; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1026; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1027; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
1028; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 8
1029; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 8
1030; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i32*
1031; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i32*
1032; X64_2LD-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP8]], align 1
1033; X64_2LD-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP9]], align 1
1034; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i32 [[TMP10]] to i64
1035; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i32 [[TMP11]] to i64
1036; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP12]], [[TMP13]]
1037; X64_2LD-NEXT:    [[TMP15:%.*]] = or i64 [[TMP5]], [[TMP14]]
1038; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i64 [[TMP15]], 0
1039; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32
1040; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0
1041; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1042; X64_2LD-NEXT:    ret i32 [[CONV]]
1043;
1044  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 12)
1045  %cmp = icmp eq i32 %call, 0
1046  %conv = zext i1 %cmp to i32
1047  ret i32 %conv
1048}
1049
1050define i32 @cmp_eq13(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
1051; X64_1LD-LABEL: @cmp_eq13(
1052; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
1053; X64_1LD:       res_block:
1054; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
1055; X64_1LD:       loadbb:
1056; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1057; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1058; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1059; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1060; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
1061; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
1062; X64_1LD:       loadbb1:
1063; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 5
1064; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 5
1065; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
1066; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
1067; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
1068; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
1069; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]
1070; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
1071; X64_1LD:       endblock:
1072; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
1073; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
1074; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1075; X64_1LD-NEXT:    ret i32 [[CONV]]
1076;
1077; X64_2LD-LABEL: @cmp_eq13(
1078; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1079; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1080; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1081; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1082; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
1083; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 5
1084; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 5
1085; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
1086; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
1087; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
1088; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
1089; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]
1090; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]
1091; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0
1092; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
1093; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
1094; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1095; X64_2LD-NEXT:    ret i32 [[CONV]]
1096;
1097  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 13)
1098  %cmp = icmp eq i32 %call, 0
1099  %conv = zext i1 %cmp to i32
1100  ret i32 %conv
1101}
1102
1103define i32 @cmp_eq14(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
1104; X64_1LD-LABEL: @cmp_eq14(
1105; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
1106; X64_1LD:       res_block:
1107; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
1108; X64_1LD:       loadbb:
1109; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1110; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1111; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1112; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1113; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
1114; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
1115; X64_1LD:       loadbb1:
1116; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 6
1117; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 6
1118; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
1119; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
1120; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
1121; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
1122; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]
1123; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
1124; X64_1LD:       endblock:
1125; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
1126; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
1127; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1128; X64_1LD-NEXT:    ret i32 [[CONV]]
1129;
1130; X64_2LD-LABEL: @cmp_eq14(
1131; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1132; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1133; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1134; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1135; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
1136; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 6
1137; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 6
1138; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
1139; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
1140; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
1141; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
1142; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]
1143; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]
1144; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0
1145; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
1146; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
1147; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1148; X64_2LD-NEXT:    ret i32 [[CONV]]
1149;
1150  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 14)
1151  %cmp = icmp eq i32 %call, 0
1152  %conv = zext i1 %cmp to i32
1153  ret i32 %conv
1154}
1155
1156define i32 @cmp_eq15(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
1157; X64_1LD-LABEL: @cmp_eq15(
1158; X64_1LD-NEXT:    br label [[LOADBB:%.*]]
1159; X64_1LD:       res_block:
1160; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]
1161; X64_1LD:       loadbb:
1162; X64_1LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1163; X64_1LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1164; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1165; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1166; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]
1167; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]
1168; X64_1LD:       loadbb1:
1169; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 7
1170; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 7
1171; X64_1LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
1172; X64_1LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
1173; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
1174; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
1175; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]
1176; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]
1177; X64_1LD:       endblock:
1178; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]
1179; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0
1180; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1181; X64_1LD-NEXT:    ret i32 [[CONV]]
1182;
1183; X64_2LD-LABEL: @cmp_eq15(
1184; X64_2LD-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i64*
1185; X64_2LD-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i64*
1186; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 1
1187; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, i64* [[TMP2]], align 1
1188; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]
1189; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, i8* [[X]], i64 7
1190; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, i8* [[Y]], i64 7
1191; X64_2LD-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP6]] to i64*
1192; X64_2LD-NEXT:    [[TMP9:%.*]] = bitcast i8* [[TMP7]] to i64*
1193; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, i64* [[TMP8]], align 1
1194; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, i64* [[TMP9]], align 1
1195; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]
1196; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]
1197; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0
1198; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32
1199; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0
1200; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1201; X64_2LD-NEXT:    ret i32 [[CONV]]
1202;
1203  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 15)
1204  %cmp = icmp eq i32 %call, 0
1205  %conv = zext i1 %cmp to i32
1206  ret i32 %conv
1207}
1208
1209define i32 @cmp_eq16(i8* nocapture readonly %x, i8* nocapture readonly %y)  {
1210; X64-LABEL: @cmp_eq16(
1211; X64-NEXT:    [[TMP1:%.*]] = bitcast i8* [[X:%.*]] to i128*
1212; X64-NEXT:    [[TMP2:%.*]] = bitcast i8* [[Y:%.*]] to i128*
1213; X64-NEXT:    [[TMP3:%.*]] = load i128, i128* [[TMP1]], align 1
1214; X64-NEXT:    [[TMP4:%.*]] = load i128, i128* [[TMP2]], align 1
1215; X64-NEXT:    [[TMP5:%.*]] = icmp ne i128 [[TMP3]], [[TMP4]]
1216; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
1217; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0
1218; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32
1219; X64-NEXT:    ret i32 [[CONV]]
1220;
1221  %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16)
1222  %cmp = icmp eq i32 %call, 0
1223  %conv = zext i1 %cmp to i32
1224  ret i32 %conv
1225}
1226
1227