brintos

brintos / llvm-project-archived public Read only

0
0
Text · 52.9 KiB · 86dc3e5 Raw
1079 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -expand-memcmp -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_1LD3; RUN: opt -S -expand-memcmp -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_2LD4; RUN: opt -S -passes=expand-memcmp -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_1LD5; RUN: opt -S -passes=expand-memcmp -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_2LD6 7declare i32 @memcmp(ptr nocapture, ptr nocapture, i64)8 9define i32 @cmp2(ptr nocapture readonly %x, ptr nocapture readonly %y)  {10; X64-LABEL: @cmp2(11; X64-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 112; X64-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 113; 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 i3216; X64-NEXT:    [[TMP8:%.*]] = zext i16 [[TMP6]] to i3217; X64-NEXT:    [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]18; X64-NEXT:    ret i32 [[TMP9]]19;20  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 2)21  ret i32 %call22}23 24define i32 @cmp2_align2(ptr nocapture readonly align 2 %x, ptr nocapture readonly align 2 %y)  {25; X64-LABEL: @cmp2_align2(26; X64-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 227; X64-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 228; X64-NEXT:    [[TMP5:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP3]])29; X64-NEXT:    [[TMP6:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP4]])30; X64-NEXT:    [[TMP7:%.*]] = zext i16 [[TMP5]] to i3231; X64-NEXT:    [[TMP8:%.*]] = zext i16 [[TMP6]] to i3232; X64-NEXT:    [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]33; X64-NEXT:    ret i32 [[TMP9]]34;35  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 2)36  ret i32 %call37}38 39define i32 @cmp3(ptr nocapture readonly %x, ptr nocapture readonly %y)  {40; X64-LABEL: @cmp3(41; X64-NEXT:    br label [[LOADBB:%.*]]42; X64:       res_block:43; X64-NEXT:    [[TMP1:%.*]] = icmp ult i16 [[TMP7:%.*]], [[TMP8:%.*]]44; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 145; X64-NEXT:    br label [[ENDBLOCK:%.*]]46; X64:       loadbb:47; X64-NEXT:    [[TMP5:%.*]] = load i16, ptr [[X:%.*]], align 148; X64-NEXT:    [[TMP6:%.*]] = load i16, ptr [[Y:%.*]], align 149; X64-NEXT:    [[TMP7]] = call i16 @llvm.bswap.i16(i16 [[TMP5]])50; X64-NEXT:    [[TMP8]] = call i16 @llvm.bswap.i16(i16 [[TMP6]])51; X64-NEXT:    [[TMP9:%.*]] = icmp eq i16 [[TMP7]], [[TMP8]]52; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]53; X64:       loadbb1:54; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 255; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 256; X64-NEXT:    [[TMP12:%.*]] = load i8, ptr [[TMP10]], align 157; X64-NEXT:    [[TMP13:%.*]] = load i8, ptr [[TMP11]], align 158; X64-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i3259; X64-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i3260; X64-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]61; X64-NEXT:    br label [[ENDBLOCK]]62; X64:       endblock:63; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]64; X64-NEXT:    ret i32 [[PHI_RES]]65;66  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 3)67  ret i32 %call68}69 70define i32 @cmp4(ptr nocapture readonly %x, ptr nocapture readonly %y)  {71; X64-LABEL: @cmp4(72; X64-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 173; X64-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 174; X64-NEXT:    [[TMP5:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP3]])75; X64-NEXT:    [[TMP6:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP4]])76; X64-NEXT:    [[TMP11:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[TMP5]], i32 [[TMP6]])77; X64-NEXT:    ret i32 [[TMP11]]78;79  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4)80  ret i32 %call81}82 83define i32 @cmp5(ptr nocapture readonly %x, ptr nocapture readonly %y)  {84; X64-LABEL: @cmp5(85; X64-NEXT:    br label [[LOADBB:%.*]]86; X64:       res_block:87; X64-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[TMP7:%.*]], [[TMP8:%.*]]88; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 189; X64-NEXT:    br label [[ENDBLOCK:%.*]]90; X64:       loadbb:91; X64-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 192; X64-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 193; X64-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])94; X64-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])95; X64-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]96; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]97; X64:       loadbb1:98; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 499; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 4100; X64-NEXT:    [[TMP12:%.*]] = load i8, ptr [[TMP10]], align 1101; X64-NEXT:    [[TMP13:%.*]] = load i8, ptr [[TMP11]], align 1102; X64-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i32103; X64-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i32104; X64-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]105; X64-NEXT:    br label [[ENDBLOCK]]106; X64:       endblock:107; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]108; X64-NEXT:    ret i32 [[PHI_RES]]109;110  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 5)111  ret i32 %call112}113 114define i32 @cmp6(ptr nocapture readonly %x, ptr nocapture readonly %y)  {115; X64-LABEL: @cmp6(116; X64-NEXT:    br label [[LOADBB:%.*]]117; X64:       res_block:118; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]119; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]120; X64-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]121; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1122; X64-NEXT:    br label [[ENDBLOCK:%.*]]123; X64:       loadbb:124; X64-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 1125; X64-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 1126; X64-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])127; X64-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])128; X64-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]129; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]130; X64:       loadbb1:131; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 4132; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 4133; X64-NEXT:    [[TMP14:%.*]] = load i16, ptr [[TMP10]], align 1134; X64-NEXT:    [[TMP15:%.*]] = load i16, ptr [[TMP11]], align 1135; X64-NEXT:    [[TMP16:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP14]])136; X64-NEXT:    [[TMP17:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP15]])137; X64-NEXT:    [[TMP18]] = zext i16 [[TMP16]] to i32138; X64-NEXT:    [[TMP19]] = zext i16 [[TMP17]] to i32139; X64-NEXT:    [[TMP20:%.*]] = icmp eq i32 [[TMP18]], [[TMP19]]140; X64-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]141; X64:       endblock:142; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]143; X64-NEXT:    ret i32 [[PHI_RES]]144;145  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 6)146  ret i32 %call147}148 149define i32 @cmp7(ptr nocapture readonly %x, ptr nocapture readonly %y)  {150; X64-LABEL: @cmp7(151; X64-NEXT:    br label [[LOADBB:%.*]]152; X64:       res_block:153; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]154; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]155; X64-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]156; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1157; X64-NEXT:    br label [[ENDBLOCK:%.*]]158; X64:       loadbb:159; X64-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 1160; X64-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 1161; X64-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])162; X64-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])163; X64-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]164; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]165; X64:       loadbb1:166; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 3167; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 3168; X64-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP10]], align 1169; X64-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP11]], align 1170; X64-NEXT:    [[TMP16]] = call i32 @llvm.bswap.i32(i32 [[TMP14]])171; X64-NEXT:    [[TMP17]] = call i32 @llvm.bswap.i32(i32 [[TMP15]])172; X64-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[TMP16]], [[TMP17]]173; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]174; X64:       endblock:175; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]176; X64-NEXT:    ret i32 [[PHI_RES]]177;178  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 7)179  ret i32 %call180}181 182define i32 @cmp8(ptr nocapture readonly %x, ptr nocapture readonly %y)  {183; X64-LABEL: @cmp8(184; X64-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1185; X64-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1186; X64-NEXT:    [[TMP5:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP3]])187; X64-NEXT:    [[TMP6:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP4]])188; X64-NEXT:    [[TMP11:%.*]] = call i32 @llvm.ucmp.i32.i64(i64 [[TMP5]], i64 [[TMP6]])189; X64-NEXT:    ret i32 [[TMP11]]190;191  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 8)192  ret i32 %call193}194 195define i32 @cmp9(ptr nocapture readonly %x, ptr nocapture readonly %y)  {196; X64-LABEL: @cmp9(197; X64-NEXT:    br label [[LOADBB:%.*]]198; X64:       res_block:199; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[TMP7:%.*]], [[TMP8:%.*]]200; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1201; X64-NEXT:    br label [[ENDBLOCK:%.*]]202; X64:       loadbb:203; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1204; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1205; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])206; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])207; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]208; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]209; X64:       loadbb1:210; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 8211; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 8212; X64-NEXT:    [[TMP12:%.*]] = load i8, ptr [[TMP10]], align 1213; X64-NEXT:    [[TMP13:%.*]] = load i8, ptr [[TMP11]], align 1214; X64-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i32215; X64-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i32216; X64-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]217; X64-NEXT:    br label [[ENDBLOCK]]218; X64:       endblock:219; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]220; X64-NEXT:    ret i32 [[PHI_RES]]221;222  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 9)223  ret i32 %call224}225 226define i32 @cmp10(ptr nocapture readonly %x, ptr nocapture readonly %y)  {227; X64-LABEL: @cmp10(228; X64-NEXT:    br label [[LOADBB:%.*]]229; X64:       res_block:230; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]231; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]232; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]233; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1234; X64-NEXT:    br label [[ENDBLOCK:%.*]]235; X64:       loadbb:236; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1237; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1238; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])239; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])240; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]241; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]242; X64:       loadbb1:243; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 8244; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 8245; X64-NEXT:    [[TMP14:%.*]] = load i16, ptr [[TMP10]], align 1246; X64-NEXT:    [[TMP15:%.*]] = load i16, ptr [[TMP11]], align 1247; X64-NEXT:    [[TMP16:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP14]])248; X64-NEXT:    [[TMP17:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP15]])249; X64-NEXT:    [[TMP18]] = zext i16 [[TMP16]] to i64250; X64-NEXT:    [[TMP19]] = zext i16 [[TMP17]] to i64251; X64-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[TMP18]], [[TMP19]]252; X64-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]253; X64:       endblock:254; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]255; X64-NEXT:    ret i32 [[PHI_RES]]256;257  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 10)258  ret i32 %call259}260 261define i32 @cmp11(ptr nocapture readonly %x, ptr nocapture readonly %y)  {262; X64-LABEL: @cmp11(263; X64-NEXT:    br label [[LOADBB:%.*]]264; X64:       res_block:265; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]266; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]267; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]268; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1269; X64-NEXT:    br label [[ENDBLOCK:%.*]]270; X64:       loadbb:271; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1272; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1273; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])274; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])275; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]276; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]277; X64:       loadbb1:278; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 3279; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 3280; X64-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP10]], align 1281; X64-NEXT:    [[TMP15:%.*]] = load i64, ptr [[TMP11]], align 1282; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])283; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])284; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]285; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]286; X64:       endblock:287; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]288; X64-NEXT:    ret i32 [[PHI_RES]]289;290  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 11)291  ret i32 %call292}293 294define i32 @cmp12(ptr nocapture readonly %x, ptr nocapture readonly %y)  {295; X64-LABEL: @cmp12(296; X64-NEXT:    br label [[LOADBB:%.*]]297; X64:       res_block:298; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]299; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]300; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]301; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1302; X64-NEXT:    br label [[ENDBLOCK:%.*]]303; X64:       loadbb:304; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1305; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1306; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])307; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])308; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]309; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]310; X64:       loadbb1:311; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 8312; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 8313; X64-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP10]], align 1314; X64-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP11]], align 1315; X64-NEXT:    [[TMP16:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP14]])316; X64-NEXT:    [[TMP17:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP15]])317; X64-NEXT:    [[TMP18]] = zext i32 [[TMP16]] to i64318; X64-NEXT:    [[TMP19]] = zext i32 [[TMP17]] to i64319; X64-NEXT:    [[TMP20:%.*]] = icmp eq i64 [[TMP18]], [[TMP19]]320; X64-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]321; X64:       endblock:322; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]323; X64-NEXT:    ret i32 [[PHI_RES]]324;325  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 12)326  ret i32 %call327}328 329define i32 @cmp13(ptr nocapture readonly %x, ptr nocapture readonly %y)  {330; X64-LABEL: @cmp13(331; X64-NEXT:    br label [[LOADBB:%.*]]332; X64:       res_block:333; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]334; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]335; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]336; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1337; X64-NEXT:    br label [[ENDBLOCK:%.*]]338; X64:       loadbb:339; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1340; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1341; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])342; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])343; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]344; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]345; X64:       loadbb1:346; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 5347; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 5348; X64-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP10]], align 1349; X64-NEXT:    [[TMP15:%.*]] = load i64, ptr [[TMP11]], align 1350; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])351; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])352; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]353; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]354; X64:       endblock:355; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]356; X64-NEXT:    ret i32 [[PHI_RES]]357;358  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 13)359  ret i32 %call360}361 362define i32 @cmp14(ptr nocapture readonly %x, ptr nocapture readonly %y)  {363; X64-LABEL: @cmp14(364; X64-NEXT:    br label [[LOADBB:%.*]]365; X64:       res_block:366; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]367; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]368; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]369; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1370; X64-NEXT:    br label [[ENDBLOCK:%.*]]371; X64:       loadbb:372; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1373; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1374; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])375; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])376; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]377; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]378; X64:       loadbb1:379; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 6380; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 6381; X64-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP10]], align 1382; X64-NEXT:    [[TMP15:%.*]] = load i64, ptr [[TMP11]], align 1383; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])384; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])385; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]386; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]387; X64:       endblock:388; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]389; X64-NEXT:    ret i32 [[PHI_RES]]390;391  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 14)392  ret i32 %call393}394 395define i32 @cmp15(ptr nocapture readonly %x, ptr nocapture readonly %y)  {396; X64-LABEL: @cmp15(397; X64-NEXT:    br label [[LOADBB:%.*]]398; X64:       res_block:399; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]400; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]401; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]402; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1403; X64-NEXT:    br label [[ENDBLOCK:%.*]]404; X64:       loadbb:405; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1406; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1407; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])408; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])409; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]410; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]411; X64:       loadbb1:412; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 7413; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 7414; X64-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP10]], align 1415; X64-NEXT:    [[TMP15:%.*]] = load i64, ptr [[TMP11]], align 1416; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])417; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])418; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]419; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]420; X64:       endblock:421; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]422; X64-NEXT:    ret i32 [[PHI_RES]]423;424  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 15)425  ret i32 %call426}427 428define i32 @cmp16(ptr nocapture readonly %x, ptr nocapture readonly %y)  {429; X64-LABEL: @cmp16(430; X64-NEXT:    br label [[LOADBB:%.*]]431; X64:       res_block:432; X64-NEXT:    [[PHI_SRC1:%.*]] = phi i64 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]433; X64-NEXT:    [[PHI_SRC2:%.*]] = phi i64 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]434; X64-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[PHI_SRC1]], [[PHI_SRC2]]435; X64-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1436; X64-NEXT:    br label [[ENDBLOCK:%.*]]437; X64:       loadbb:438; X64-NEXT:    [[TMP5:%.*]] = load i64, ptr [[X:%.*]], align 1439; X64-NEXT:    [[TMP6:%.*]] = load i64, ptr [[Y:%.*]], align 1440; X64-NEXT:    [[TMP7]] = call i64 @llvm.bswap.i64(i64 [[TMP5]])441; X64-NEXT:    [[TMP8]] = call i64 @llvm.bswap.i64(i64 [[TMP6]])442; X64-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[TMP7]], [[TMP8]]443; X64-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]444; X64:       loadbb1:445; X64-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 8446; X64-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 8447; X64-NEXT:    [[TMP14:%.*]] = load i64, ptr [[TMP10]], align 1448; X64-NEXT:    [[TMP15:%.*]] = load i64, ptr [[TMP11]], align 1449; X64-NEXT:    [[TMP16]] = call i64 @llvm.bswap.i64(i64 [[TMP14]])450; X64-NEXT:    [[TMP17]] = call i64 @llvm.bswap.i64(i64 [[TMP15]])451; X64-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[TMP16]], [[TMP17]]452; X64-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]453; X64:       endblock:454; X64-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]455; X64-NEXT:    ret i32 [[PHI_RES]]456;457  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16)458  ret i32 %call459}460 461define i32 @cmp_eq2(ptr nocapture readonly %x, ptr nocapture readonly %y)  {462; X64-LABEL: @cmp_eq2(463; X64-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 1464; X64-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 1465; X64-NEXT:    [[TMP5:%.*]] = icmp ne i16 [[TMP3]], [[TMP4]]466; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32467; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0468; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32469; X64-NEXT:    ret i32 [[CONV]]470;471  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 2)472  %cmp = icmp eq i32 %call, 0473  %conv = zext i1 %cmp to i32474  ret i32 %conv475}476 477define i32 @cmp_eq3(ptr nocapture readonly %x, ptr nocapture readonly %y)  {478; X64_1LD-LABEL: @cmp_eq3(479; X64_1LD-NEXT:    br label [[LOADBB:%.*]]480; X64_1LD:       res_block:481; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]482; X64_1LD:       loadbb:483; X64_1LD-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 1484; X64_1LD-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 1485; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i16 [[TMP3]], [[TMP4]]486; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]487; X64_1LD:       loadbb1:488; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 2489; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 2490; X64_1LD-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1491; X64_1LD-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1492; X64_1LD-NEXT:    [[TMP10:%.*]] = icmp ne i8 [[TMP8]], [[TMP9]]493; X64_1LD-NEXT:    br i1 [[TMP10]], label [[RES_BLOCK]], label [[ENDBLOCK]]494; X64_1LD:       endblock:495; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]496; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0497; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32498; X64_1LD-NEXT:    ret i32 [[CONV]]499;500; X64_2LD-LABEL: @cmp_eq3(501; X64_2LD-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 1502; X64_2LD-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 1503; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i16 [[TMP3]], [[TMP4]]504; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 2505; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 2506; X64_2LD-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1507; X64_2LD-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1508; X64_2LD-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i16509; X64_2LD-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i16510; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i16 [[TMP10]], [[TMP11]]511; X64_2LD-NEXT:    [[TMP13:%.*]] = or i16 [[TMP5]], [[TMP12]]512; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i16 [[TMP13]], 0513; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32514; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0515; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32516; X64_2LD-NEXT:    ret i32 [[CONV]]517;518  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 3)519  %cmp = icmp eq i32 %call, 0520  %conv = zext i1 %cmp to i32521  ret i32 %conv522}523 524define i32 @cmp_eq4(ptr nocapture readonly %x, ptr nocapture readonly %y)  {525; X64-LABEL: @cmp_eq4(526; X64-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1527; X64-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1528; X64-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]529; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32530; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0531; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32532; X64-NEXT:    ret i32 [[CONV]]533;534  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4)535  %cmp = icmp eq i32 %call, 0536  %conv = zext i1 %cmp to i32537  ret i32 %conv538}539 540define i32 @cmp_eq5(ptr nocapture readonly %x, ptr nocapture readonly %y)  {541; X64_1LD-LABEL: @cmp_eq5(542; X64_1LD-NEXT:    br label [[LOADBB:%.*]]543; X64_1LD:       res_block:544; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]545; X64_1LD:       loadbb:546; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1547; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1548; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]549; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]550; X64_1LD:       loadbb1:551; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4552; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4553; X64_1LD-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1554; X64_1LD-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1555; X64_1LD-NEXT:    [[TMP10:%.*]] = icmp ne i8 [[TMP8]], [[TMP9]]556; X64_1LD-NEXT:    br i1 [[TMP10]], label [[RES_BLOCK]], label [[ENDBLOCK]]557; X64_1LD:       endblock:558; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]559; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0560; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32561; X64_1LD-NEXT:    ret i32 [[CONV]]562;563; X64_2LD-LABEL: @cmp_eq5(564; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1565; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1566; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]567; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4568; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4569; X64_2LD-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1570; X64_2LD-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1571; X64_2LD-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i32572; X64_2LD-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i32573; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]574; X64_2LD-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]575; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0576; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32577; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0578; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32579; X64_2LD-NEXT:    ret i32 [[CONV]]580;581  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 5)582  %cmp = icmp eq i32 %call, 0583  %conv = zext i1 %cmp to i32584  ret i32 %conv585}586 587define i32 @cmp_eq6(ptr nocapture readonly %x, ptr nocapture readonly %y)  {588; X64_1LD-LABEL: @cmp_eq6(589; X64_1LD-NEXT:    br label [[LOADBB:%.*]]590; X64_1LD:       res_block:591; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]592; X64_1LD:       loadbb:593; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1594; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1595; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]596; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]597; X64_1LD:       loadbb1:598; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4599; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4600; X64_1LD-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 1601; X64_1LD-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 1602; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i16 [[TMP10]], [[TMP11]]603; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]604; X64_1LD:       endblock:605; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]606; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0607; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32608; X64_1LD-NEXT:    ret i32 [[CONV]]609;610; X64_2LD-LABEL: @cmp_eq6(611; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1612; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1613; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]614; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4615; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4616; X64_2LD-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 1617; X64_2LD-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 1618; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i32619; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i32620; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i32 [[TMP12]], [[TMP13]]621; X64_2LD-NEXT:    [[TMP15:%.*]] = or i32 [[TMP5]], [[TMP14]]622; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0623; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32624; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0625; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32626; X64_2LD-NEXT:    ret i32 [[CONV]]627;628  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 6)629  %cmp = icmp eq i32 %call, 0630  %conv = zext i1 %cmp to i32631  ret i32 %conv632}633 634define i32 @cmp_eq6_align4(ptr nocapture readonly align 4 %x, ptr nocapture readonly align 4 %y)  {635; X64_1LD-LABEL: @cmp_eq6_align4(636; X64_1LD-NEXT:    br label [[LOADBB:%.*]]637; X64_1LD:       res_block:638; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]639; X64_1LD:       loadbb:640; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 4641; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 4642; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]643; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]644; X64_1LD:       loadbb1:645; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4646; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4647; X64_1LD-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 4648; X64_1LD-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 4649; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i16 [[TMP10]], [[TMP11]]650; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]651; X64_1LD:       endblock:652; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]653; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0654; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32655; X64_1LD-NEXT:    ret i32 [[CONV]]656;657; X64_2LD-LABEL: @cmp_eq6_align4(658; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 4659; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 4660; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]661; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4662; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4663; X64_2LD-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 4664; X64_2LD-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 4665; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i32666; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i32667; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i32 [[TMP12]], [[TMP13]]668; X64_2LD-NEXT:    [[TMP15:%.*]] = or i32 [[TMP5]], [[TMP14]]669; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0670; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32671; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0672; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32673; X64_2LD-NEXT:    ret i32 [[CONV]]674;675  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 6)676  %cmp = icmp eq i32 %call, 0677  %conv = zext i1 %cmp to i32678  ret i32 %conv679}680 681define i32 @cmp_eq7(ptr nocapture readonly %x, ptr nocapture readonly %y)  {682; X64_1LD-LABEL: @cmp_eq7(683; X64_1LD-NEXT:    br label [[LOADBB:%.*]]684; X64_1LD:       res_block:685; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]686; X64_1LD:       loadbb:687; X64_1LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1688; X64_1LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1689; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]690; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]691; X64_1LD:       loadbb1:692; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 3693; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 3694; X64_1LD-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP6]], align 1695; X64_1LD-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP7]], align 1696; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i32 [[TMP10]], [[TMP11]]697; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]698; X64_1LD:       endblock:699; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]700; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0701; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32702; X64_1LD-NEXT:    ret i32 [[CONV]]703;704; X64_2LD-LABEL: @cmp_eq7(705; X64_2LD-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1706; X64_2LD-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1707; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]708; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 3709; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 3710; X64_2LD-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP6]], align 1711; X64_2LD-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP7]], align 1712; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]713; X64_2LD-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]714; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0715; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32716; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0717; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32718; X64_2LD-NEXT:    ret i32 [[CONV]]719;720  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 7)721  %cmp = icmp eq i32 %call, 0722  %conv = zext i1 %cmp to i32723  ret i32 %conv724}725 726define i32 @cmp_eq8(ptr nocapture readonly %x, ptr nocapture readonly %y)  {727; X64-LABEL: @cmp_eq8(728; X64-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1729; X64-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1730; X64-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]731; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32732; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0733; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32734; X64-NEXT:    ret i32 [[CONV]]735;736  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 8)737  %cmp = icmp eq i32 %call, 0738  %conv = zext i1 %cmp to i32739  ret i32 %conv740}741 742define i32 @cmp_eq9(ptr nocapture readonly %x, ptr nocapture readonly %y)  {743; X64_1LD-LABEL: @cmp_eq9(744; X64_1LD-NEXT:    br label [[LOADBB:%.*]]745; X64_1LD:       res_block:746; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]747; X64_1LD:       loadbb:748; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1749; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1750; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]751; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]752; X64_1LD:       loadbb1:753; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 8754; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 8755; X64_1LD-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1756; X64_1LD-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1757; X64_1LD-NEXT:    [[TMP10:%.*]] = icmp ne i8 [[TMP8]], [[TMP9]]758; X64_1LD-NEXT:    br i1 [[TMP10]], label [[RES_BLOCK]], label [[ENDBLOCK]]759; X64_1LD:       endblock:760; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]761; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0762; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32763; X64_1LD-NEXT:    ret i32 [[CONV]]764;765; X64_2LD-LABEL: @cmp_eq9(766; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1767; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1768; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]769; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 8770; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 8771; X64_2LD-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1772; X64_2LD-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1773; X64_2LD-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i64774; X64_2LD-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i64775; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]776; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]777; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0778; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32779; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0780; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32781; X64_2LD-NEXT:    ret i32 [[CONV]]782;783  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 9)784  %cmp = icmp eq i32 %call, 0785  %conv = zext i1 %cmp to i32786  ret i32 %conv787}788 789define i32 @cmp_eq10(ptr nocapture readonly %x, ptr nocapture readonly %y)  {790; X64_1LD-LABEL: @cmp_eq10(791; X64_1LD-NEXT:    br label [[LOADBB:%.*]]792; X64_1LD:       res_block:793; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]794; X64_1LD:       loadbb:795; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1796; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1797; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]798; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]799; X64_1LD:       loadbb1:800; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 8801; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 8802; X64_1LD-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 1803; X64_1LD-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 1804; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i16 [[TMP10]], [[TMP11]]805; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]806; X64_1LD:       endblock:807; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]808; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0809; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32810; X64_1LD-NEXT:    ret i32 [[CONV]]811;812; X64_2LD-LABEL: @cmp_eq10(813; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1814; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1815; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]816; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 8817; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 8818; X64_2LD-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 1819; X64_2LD-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 1820; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i64821; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i64822; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP12]], [[TMP13]]823; X64_2LD-NEXT:    [[TMP15:%.*]] = or i64 [[TMP5]], [[TMP14]]824; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i64 [[TMP15]], 0825; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32826; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0827; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32828; X64_2LD-NEXT:    ret i32 [[CONV]]829;830  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 10)831  %cmp = icmp eq i32 %call, 0832  %conv = zext i1 %cmp to i32833  ret i32 %conv834}835 836define i32 @cmp_eq11(ptr nocapture readonly %x, ptr nocapture readonly %y)  {837; X64_1LD-LABEL: @cmp_eq11(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:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1843; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1844; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]845; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]846; X64_1LD:       loadbb1:847; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 3848; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 3849; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 1850; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 1851; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]852; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]853; X64_1LD:       endblock:854; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]855; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0856; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32857; X64_1LD-NEXT:    ret i32 [[CONV]]858;859; X64_2LD-LABEL: @cmp_eq11(860; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1861; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1862; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]863; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 3864; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 3865; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 1866; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 1867; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]868; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]869; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0870; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32871; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0872; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32873; X64_2LD-NEXT:    ret i32 [[CONV]]874;875  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 11)876  %cmp = icmp eq i32 %call, 0877  %conv = zext i1 %cmp to i32878  ret i32 %conv879}880 881define i32 @cmp_eq12(ptr nocapture readonly %x, ptr nocapture readonly %y)  {882; X64_1LD-LABEL: @cmp_eq12(883; X64_1LD-NEXT:    br label [[LOADBB:%.*]]884; X64_1LD:       res_block:885; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]886; X64_1LD:       loadbb:887; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1888; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1889; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]890; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]891; X64_1LD:       loadbb1:892; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 8893; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 8894; X64_1LD-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP6]], align 1895; X64_1LD-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP7]], align 1896; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i32 [[TMP10]], [[TMP11]]897; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]898; X64_1LD:       endblock:899; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]900; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0901; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32902; X64_1LD-NEXT:    ret i32 [[CONV]]903;904; X64_2LD-LABEL: @cmp_eq12(905; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1906; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1907; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]908; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 8909; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 8910; X64_2LD-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP6]], align 1911; X64_2LD-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP7]], align 1912; X64_2LD-NEXT:    [[TMP12:%.*]] = zext i32 [[TMP10]] to i64913; X64_2LD-NEXT:    [[TMP13:%.*]] = zext i32 [[TMP11]] to i64914; X64_2LD-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP12]], [[TMP13]]915; X64_2LD-NEXT:    [[TMP15:%.*]] = or i64 [[TMP5]], [[TMP14]]916; X64_2LD-NEXT:    [[TMP16:%.*]] = icmp ne i64 [[TMP15]], 0917; X64_2LD-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32918; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0919; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32920; X64_2LD-NEXT:    ret i32 [[CONV]]921;922  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 12)923  %cmp = icmp eq i32 %call, 0924  %conv = zext i1 %cmp to i32925  ret i32 %conv926}927 928define i32 @cmp_eq13(ptr nocapture readonly %x, ptr nocapture readonly %y)  {929; X64_1LD-LABEL: @cmp_eq13(930; X64_1LD-NEXT:    br label [[LOADBB:%.*]]931; X64_1LD:       res_block:932; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]933; X64_1LD:       loadbb:934; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1935; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1936; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]937; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]938; X64_1LD:       loadbb1:939; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 5940; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 5941; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 1942; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 1943; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]944; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]945; X64_1LD:       endblock:946; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]947; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0948; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32949; X64_1LD-NEXT:    ret i32 [[CONV]]950;951; X64_2LD-LABEL: @cmp_eq13(952; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1953; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1954; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]955; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 5956; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 5957; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 1958; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 1959; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]960; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]961; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 0962; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32963; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0964; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32965; X64_2LD-NEXT:    ret i32 [[CONV]]966;967  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 13)968  %cmp = icmp eq i32 %call, 0969  %conv = zext i1 %cmp to i32970  ret i32 %conv971}972 973define i32 @cmp_eq14(ptr nocapture readonly %x, ptr nocapture readonly %y)  {974; X64_1LD-LABEL: @cmp_eq14(975; X64_1LD-NEXT:    br label [[LOADBB:%.*]]976; X64_1LD:       res_block:977; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]978; X64_1LD:       loadbb:979; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1980; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1981; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]982; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]983; X64_1LD:       loadbb1:984; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 6985; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 6986; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 1987; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 1988; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]989; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]990; X64_1LD:       endblock:991; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]992; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 0993; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32994; X64_1LD-NEXT:    ret i32 [[CONV]]995;996; X64_2LD-LABEL: @cmp_eq14(997; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 1998; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 1999; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]1000; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 61001; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 61002; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 11003; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 11004; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]1005; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]1006; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 01007; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i321008; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 01009; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i321010; X64_2LD-NEXT:    ret i32 [[CONV]]1011;1012  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 14)1013  %cmp = icmp eq i32 %call, 01014  %conv = zext i1 %cmp to i321015  ret i32 %conv1016}1017 1018define i32 @cmp_eq15(ptr nocapture readonly %x, ptr nocapture readonly %y)  {1019; X64_1LD-LABEL: @cmp_eq15(1020; X64_1LD-NEXT:    br label [[LOADBB:%.*]]1021; X64_1LD:       res_block:1022; X64_1LD-NEXT:    br label [[ENDBLOCK:%.*]]1023; X64_1LD:       loadbb:1024; X64_1LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 11025; X64_1LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 11026; X64_1LD-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[TMP3]], [[TMP4]]1027; X64_1LD-NEXT:    br i1 [[TMP5]], label [[RES_BLOCK:%.*]], label [[LOADBB1:%.*]]1028; X64_1LD:       loadbb1:1029; X64_1LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 71030; X64_1LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 71031; X64_1LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 11032; X64_1LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 11033; X64_1LD-NEXT:    [[TMP12:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]]1034; X64_1LD-NEXT:    br i1 [[TMP12]], label [[RES_BLOCK]], label [[ENDBLOCK]]1035; X64_1LD:       endblock:1036; X64_1LD-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ 1, [[RES_BLOCK]] ]1037; X64_1LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[PHI_RES]], 01038; X64_1LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i321039; X64_1LD-NEXT:    ret i32 [[CONV]]1040;1041; X64_2LD-LABEL: @cmp_eq15(1042; X64_2LD-NEXT:    [[TMP3:%.*]] = load i64, ptr [[X:%.*]], align 11043; X64_2LD-NEXT:    [[TMP4:%.*]] = load i64, ptr [[Y:%.*]], align 11044; X64_2LD-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP3]], [[TMP4]]1045; X64_2LD-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 71046; X64_2LD-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 71047; X64_2LD-NEXT:    [[TMP10:%.*]] = load i64, ptr [[TMP6]], align 11048; X64_2LD-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP7]], align 11049; X64_2LD-NEXT:    [[TMP12:%.*]] = xor i64 [[TMP10]], [[TMP11]]1050; X64_2LD-NEXT:    [[TMP13:%.*]] = or i64 [[TMP5]], [[TMP12]]1051; X64_2LD-NEXT:    [[TMP14:%.*]] = icmp ne i64 [[TMP13]], 01052; X64_2LD-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i321053; X64_2LD-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 01054; X64_2LD-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i321055; X64_2LD-NEXT:    ret i32 [[CONV]]1056;1057  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 15)1058  %cmp = icmp eq i32 %call, 01059  %conv = zext i1 %cmp to i321060  ret i32 %conv1061}1062 1063define i32 @cmp_eq16(ptr nocapture readonly %x, ptr nocapture readonly %y)  {1064; X64-LABEL: @cmp_eq16(1065; X64-NEXT:    [[TMP3:%.*]] = load i128, ptr [[X:%.*]], align 11066; X64-NEXT:    [[TMP4:%.*]] = load i128, ptr [[Y:%.*]], align 11067; X64-NEXT:    [[TMP5:%.*]] = icmp ne i128 [[TMP3]], [[TMP4]]1068; X64-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i321069; X64-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 01070; X64-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i321071; X64-NEXT:    ret i32 [[CONV]]1072;1073  %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16)1074  %cmp = icmp eq i32 %call, 01075  %conv = zext i1 %cmp to i321076  ret i32 %conv1077}1078 1079