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