brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.0 KiB · 0507ec9 Raw
567 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -expand-memcmp -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=X323; RUN: opt -S -passes=expand-memcmp -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=X324 5declare i32 @memcmp(ptr nocapture, ptr nocapture, i32)6 7define i32 @cmp2(ptr nocapture readonly %x, ptr nocapture readonly %y)  {8; X32-LABEL: @cmp2(9; X32-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 110; X32-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 111; X32-NEXT:    [[TMP5:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP3]])12; X32-NEXT:    [[TMP6:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP4]])13; X32-NEXT:    [[TMP7:%.*]] = zext i16 [[TMP5]] to i3214; X32-NEXT:    [[TMP8:%.*]] = zext i16 [[TMP6]] to i3215; X32-NEXT:    [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]16; X32-NEXT:    ret i32 [[TMP9]]17;18  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 2)19  ret i32 %call20}21 22define i32 @cmp2_align2(ptr nocapture readonly align 2 %x, ptr nocapture readonly align 2 %y)  {23; X32-LABEL: @cmp2_align2(24; X32-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 225; X32-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 226; X32-NEXT:    [[TMP5:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP3]])27; X32-NEXT:    [[TMP6:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP4]])28; X32-NEXT:    [[TMP7:%.*]] = zext i16 [[TMP5]] to i3229; X32-NEXT:    [[TMP8:%.*]] = zext i16 [[TMP6]] to i3230; X32-NEXT:    [[TMP9:%.*]] = sub i32 [[TMP7]], [[TMP8]]31; X32-NEXT:    ret i32 [[TMP9]]32;33  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 2)34  ret i32 %call35}36 37define i32 @cmp3(ptr nocapture readonly %x, ptr nocapture readonly %y)  {38; X32-LABEL: @cmp3(39; X32-NEXT:    br label [[LOADBB:%.*]]40; X32:       res_block:41; X32-NEXT:    [[TMP1:%.*]] = icmp ult i16 [[TMP7:%.*]], [[TMP8:%.*]]42; X32-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 143; X32-NEXT:    br label [[ENDBLOCK:%.*]]44; X32:       loadbb:45; X32-NEXT:    [[TMP5:%.*]] = load i16, ptr [[X:%.*]], align 146; X32-NEXT:    [[TMP6:%.*]] = load i16, ptr [[Y:%.*]], align 147; X32-NEXT:    [[TMP7]] = call i16 @llvm.bswap.i16(i16 [[TMP5]])48; X32-NEXT:    [[TMP8]] = call i16 @llvm.bswap.i16(i16 [[TMP6]])49; X32-NEXT:    [[TMP9:%.*]] = icmp eq i16 [[TMP7]], [[TMP8]]50; X32-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]51; X32:       loadbb1:52; X32-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 253; X32-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 254; X32-NEXT:    [[TMP12:%.*]] = load i8, ptr [[TMP10]], align 155; X32-NEXT:    [[TMP13:%.*]] = load i8, ptr [[TMP11]], align 156; X32-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i3257; X32-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i3258; X32-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]59; X32-NEXT:    br label [[ENDBLOCK]]60; X32:       endblock:61; X32-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]62; X32-NEXT:    ret i32 [[PHI_RES]]63;64  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 3)65  ret i32 %call66}67 68define i32 @cmp4(ptr nocapture readonly %x, ptr nocapture readonly %y)  {69; X32-LABEL: @cmp4(70; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 171; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 172; X32-NEXT:    [[TMP5:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP3]])73; X32-NEXT:    [[TMP6:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP4]])74; X32-NEXT:    [[TMP11:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[TMP5]], i32 [[TMP6]])75; X32-NEXT:    ret i32 [[TMP11]]76;77  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 4)78  ret i32 %call79}80 81define i32 @cmp5(ptr nocapture readonly %x, ptr nocapture readonly %y)  {82; X32-LABEL: @cmp5(83; X32-NEXT:    br label [[LOADBB:%.*]]84; X32:       res_block:85; X32-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[TMP7:%.*]], [[TMP8:%.*]]86; X32-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 187; X32-NEXT:    br label [[ENDBLOCK:%.*]]88; X32:       loadbb:89; X32-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 190; X32-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 191; X32-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])92; X32-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])93; X32-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]94; X32-NEXT:    br i1 [[TMP9]], label [[LOADBB1:%.*]], label [[RES_BLOCK:%.*]]95; X32:       loadbb1:96; X32-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 497; X32-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 498; X32-NEXT:    [[TMP12:%.*]] = load i8, ptr [[TMP10]], align 199; X32-NEXT:    [[TMP13:%.*]] = load i8, ptr [[TMP11]], align 1100; X32-NEXT:    [[TMP14:%.*]] = zext i8 [[TMP12]] to i32101; X32-NEXT:    [[TMP15:%.*]] = zext i8 [[TMP13]] to i32102; X32-NEXT:    [[TMP16:%.*]] = sub i32 [[TMP14]], [[TMP15]]103; X32-NEXT:    br label [[ENDBLOCK]]104; X32:       endblock:105; X32-NEXT:    [[PHI_RES:%.*]] = phi i32 [ [[TMP16]], [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]106; X32-NEXT:    ret i32 [[PHI_RES]]107;108  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 5)109  ret i32 %call110}111 112define i32 @cmp6(ptr nocapture readonly %x, ptr nocapture readonly %y)  {113; X32-LABEL: @cmp6(114; X32-NEXT:    br label [[LOADBB:%.*]]115; X32:       res_block:116; X32-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP18:%.*]], [[LOADBB1:%.*]] ]117; X32-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP19:%.*]], [[LOADBB1]] ]118; X32-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]119; X32-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1120; X32-NEXT:    br label [[ENDBLOCK:%.*]]121; X32:       loadbb:122; X32-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 1123; X32-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 1124; X32-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])125; X32-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])126; X32-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]127; X32-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]128; X32:       loadbb1:129; X32-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 4130; X32-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 4131; X32-NEXT:    [[TMP14:%.*]] = load i16, ptr [[TMP10]], align 1132; X32-NEXT:    [[TMP15:%.*]] = load i16, ptr [[TMP11]], align 1133; X32-NEXT:    [[TMP16:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP14]])134; X32-NEXT:    [[TMP17:%.*]] = call i16 @llvm.bswap.i16(i16 [[TMP15]])135; X32-NEXT:    [[TMP18]] = zext i16 [[TMP16]] to i32136; X32-NEXT:    [[TMP19]] = zext i16 [[TMP17]] to i32137; X32-NEXT:    [[TMP20:%.*]] = icmp eq i32 [[TMP18]], [[TMP19]]138; X32-NEXT:    br i1 [[TMP20]], label [[ENDBLOCK]], label [[RES_BLOCK]]139; X32:       endblock:140; X32-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]141; X32-NEXT:    ret i32 [[PHI_RES]]142;143  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 6)144  ret i32 %call145}146 147define i32 @cmp7(ptr nocapture readonly %x, ptr nocapture readonly %y)  {148; X32-LABEL: @cmp7(149; X32-NEXT:    br label [[LOADBB:%.*]]150; X32:       res_block:151; X32-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]152; X32-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]153; X32-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]154; X32-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1155; X32-NEXT:    br label [[ENDBLOCK:%.*]]156; X32:       loadbb:157; X32-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 1158; X32-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 1159; X32-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])160; X32-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])161; X32-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]162; X32-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]163; X32:       loadbb1:164; X32-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 3165; X32-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 3166; X32-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP10]], align 1167; X32-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP11]], align 1168; X32-NEXT:    [[TMP16]] = call i32 @llvm.bswap.i32(i32 [[TMP14]])169; X32-NEXT:    [[TMP17]] = call i32 @llvm.bswap.i32(i32 [[TMP15]])170; X32-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[TMP16]], [[TMP17]]171; X32-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]172; X32:       endblock:173; X32-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]174; X32-NEXT:    ret i32 [[PHI_RES]]175;176  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 7)177  ret i32 %call178}179 180define i32 @cmp8(ptr nocapture readonly %x, ptr nocapture readonly %y)  {181; X32-LABEL: @cmp8(182; X32-NEXT:    br label [[LOADBB:%.*]]183; X32:       res_block:184; X32-NEXT:    [[PHI_SRC1:%.*]] = phi i32 [ [[TMP7:%.*]], [[LOADBB]] ], [ [[TMP16:%.*]], [[LOADBB1:%.*]] ]185; X32-NEXT:    [[PHI_SRC2:%.*]] = phi i32 [ [[TMP8:%.*]], [[LOADBB]] ], [ [[TMP17:%.*]], [[LOADBB1]] ]186; X32-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[PHI_SRC1]], [[PHI_SRC2]]187; X32-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 1188; X32-NEXT:    br label [[ENDBLOCK:%.*]]189; X32:       loadbb:190; X32-NEXT:    [[TMP5:%.*]] = load i32, ptr [[X:%.*]], align 1191; X32-NEXT:    [[TMP6:%.*]] = load i32, ptr [[Y:%.*]], align 1192; X32-NEXT:    [[TMP7]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])193; X32-NEXT:    [[TMP8]] = call i32 @llvm.bswap.i32(i32 [[TMP6]])194; X32-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP7]], [[TMP8]]195; X32-NEXT:    br i1 [[TMP9]], label [[LOADBB1]], label [[RES_BLOCK:%.*]]196; X32:       loadbb1:197; X32-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[X]], i64 4198; X32-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[Y]], i64 4199; X32-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP10]], align 1200; X32-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP11]], align 1201; X32-NEXT:    [[TMP16]] = call i32 @llvm.bswap.i32(i32 [[TMP14]])202; X32-NEXT:    [[TMP17]] = call i32 @llvm.bswap.i32(i32 [[TMP15]])203; X32-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[TMP16]], [[TMP17]]204; X32-NEXT:    br i1 [[TMP18]], label [[ENDBLOCK]], label [[RES_BLOCK]]205; X32:       endblock:206; X32-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 0, [[LOADBB1]] ], [ [[TMP2]], [[RES_BLOCK]] ]207; X32-NEXT:    ret i32 [[PHI_RES]]208;209  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 8)210  ret i32 %call211}212 213define i32 @cmp9(ptr nocapture readonly %x, ptr nocapture readonly %y)  {214; X32-LABEL: @cmp9(215; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 9)216; X32-NEXT:    ret i32 [[CALL]]217;218  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 9)219  ret i32 %call220}221 222define i32 @cmp10(ptr nocapture readonly %x, ptr nocapture readonly %y)  {223; X32-LABEL: @cmp10(224; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 10)225; X32-NEXT:    ret i32 [[CALL]]226;227  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 10)228  ret i32 %call229}230 231define i32 @cmp11(ptr nocapture readonly %x, ptr nocapture readonly %y)  {232; X32-LABEL: @cmp11(233; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 11)234; X32-NEXT:    ret i32 [[CALL]]235;236  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 11)237  ret i32 %call238}239 240define i32 @cmp12(ptr nocapture readonly %x, ptr nocapture readonly %y)  {241; X32-LABEL: @cmp12(242; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 12)243; X32-NEXT:    ret i32 [[CALL]]244;245  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 12)246  ret i32 %call247}248 249define i32 @cmp13(ptr nocapture readonly %x, ptr nocapture readonly %y)  {250; X32-LABEL: @cmp13(251; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 13)252; X32-NEXT:    ret i32 [[CALL]]253;254  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 13)255  ret i32 %call256}257 258define i32 @cmp14(ptr nocapture readonly %x, ptr nocapture readonly %y)  {259; X32-LABEL: @cmp14(260; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 14)261; X32-NEXT:    ret i32 [[CALL]]262;263  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 14)264  ret i32 %call265}266 267define i32 @cmp15(ptr nocapture readonly %x, ptr nocapture readonly %y)  {268; X32-LABEL: @cmp15(269; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 15)270; X32-NEXT:    ret i32 [[CALL]]271;272  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 15)273  ret i32 %call274}275 276define i32 @cmp16(ptr nocapture readonly %x, ptr nocapture readonly %y)  {277; X32-LABEL: @cmp16(278; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 16)279; X32-NEXT:    ret i32 [[CALL]]280;281  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16)282  ret i32 %call283}284 285define i32 @cmp_eq2(ptr nocapture readonly %x, ptr nocapture readonly %y)  {286; X32-LABEL: @cmp_eq2(287; X32-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 1288; X32-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 1289; X32-NEXT:    [[TMP5:%.*]] = icmp ne i16 [[TMP3]], [[TMP4]]290; X32-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32291; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0292; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32293; X32-NEXT:    ret i32 [[CONV]]294;295  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 2)296  %cmp = icmp eq i32 %call, 0297  %conv = zext i1 %cmp to i32298  ret i32 %conv299}300 301define i32 @cmp_eq3(ptr nocapture readonly %x, ptr nocapture readonly %y)  {302; X32-LABEL: @cmp_eq3(303; X32-NEXT:    [[TMP3:%.*]] = load i16, ptr [[X:%.*]], align 1304; X32-NEXT:    [[TMP4:%.*]] = load i16, ptr [[Y:%.*]], align 1305; X32-NEXT:    [[TMP5:%.*]] = xor i16 [[TMP3]], [[TMP4]]306; X32-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 2307; X32-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 2308; X32-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1309; X32-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1310; X32-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i16311; X32-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i16312; X32-NEXT:    [[TMP12:%.*]] = xor i16 [[TMP10]], [[TMP11]]313; X32-NEXT:    [[TMP13:%.*]] = or i16 [[TMP5]], [[TMP12]]314; X32-NEXT:    [[TMP14:%.*]] = icmp ne i16 [[TMP13]], 0315; X32-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32316; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0317; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32318; X32-NEXT:    ret i32 [[CONV]]319;320  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 3)321  %cmp = icmp eq i32 %call, 0322  %conv = zext i1 %cmp to i32323  ret i32 %conv324}325 326define i32 @cmp_eq4(ptr nocapture readonly %x, ptr nocapture readonly %y)  {327; X32-LABEL: @cmp_eq4(328; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1329; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1330; X32-NEXT:    [[TMP5:%.*]] = icmp ne i32 [[TMP3]], [[TMP4]]331; X32-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32332; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP6]], 0333; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32334; X32-NEXT:    ret i32 [[CONV]]335;336  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 4)337  %cmp = icmp eq i32 %call, 0338  %conv = zext i1 %cmp to i32339  ret i32 %conv340}341 342define i32 @cmp_eq5(ptr nocapture readonly %x, ptr nocapture readonly %y)  {343; X32-LABEL: @cmp_eq5(344; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1345; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1346; X32-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]347; X32-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4348; X32-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4349; X32-NEXT:    [[TMP8:%.*]] = load i8, ptr [[TMP6]], align 1350; X32-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1351; X32-NEXT:    [[TMP10:%.*]] = zext i8 [[TMP8]] to i32352; X32-NEXT:    [[TMP11:%.*]] = zext i8 [[TMP9]] to i32353; X32-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]354; X32-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]355; X32-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0356; X32-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32357; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0358; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32359; X32-NEXT:    ret i32 [[CONV]]360;361  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 5)362  %cmp = icmp eq i32 %call, 0363  %conv = zext i1 %cmp to i32364  ret i32 %conv365}366 367define i32 @cmp_eq6(ptr nocapture readonly %x, ptr nocapture readonly %y)  {368; X32-LABEL: @cmp_eq6(369; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1370; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1371; X32-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]372; X32-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4373; X32-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4374; X32-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 1375; X32-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 1376; X32-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i32377; X32-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i32378; X32-NEXT:    [[TMP14:%.*]] = xor i32 [[TMP12]], [[TMP13]]379; X32-NEXT:    [[TMP15:%.*]] = or i32 [[TMP5]], [[TMP14]]380; X32-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0381; X32-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32382; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0383; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32384; X32-NEXT:    ret i32 [[CONV]]385;386  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 6)387  %cmp = icmp eq i32 %call, 0388  %conv = zext i1 %cmp to i32389  ret i32 %conv390}391 392define i32 @cmp_eq6_align4(ptr nocapture readonly align 4 %x, ptr nocapture readonly align 4 %y)  {393; X32-LABEL: @cmp_eq6_align4(394; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 4395; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 4396; X32-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]397; X32-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4398; X32-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4399; X32-NEXT:    [[TMP10:%.*]] = load i16, ptr [[TMP6]], align 4400; X32-NEXT:    [[TMP11:%.*]] = load i16, ptr [[TMP7]], align 4401; X32-NEXT:    [[TMP12:%.*]] = zext i16 [[TMP10]] to i32402; X32-NEXT:    [[TMP13:%.*]] = zext i16 [[TMP11]] to i32403; X32-NEXT:    [[TMP14:%.*]] = xor i32 [[TMP12]], [[TMP13]]404; X32-NEXT:    [[TMP15:%.*]] = or i32 [[TMP5]], [[TMP14]]405; X32-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0406; X32-NEXT:    [[TMP17:%.*]] = zext i1 [[TMP16]] to i32407; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP17]], 0408; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32409; X32-NEXT:    ret i32 [[CONV]]410;411  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 6)412  %cmp = icmp eq i32 %call, 0413  %conv = zext i1 %cmp to i32414  ret i32 %conv415}416 417define i32 @cmp_eq7(ptr nocapture readonly %x, ptr nocapture readonly %y)  {418; X32-LABEL: @cmp_eq7(419; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1420; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1421; X32-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]422; X32-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 3423; X32-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 3424; X32-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP6]], align 1425; X32-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP7]], align 1426; X32-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]427; X32-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]428; X32-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0429; X32-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32430; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0431; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32432; X32-NEXT:    ret i32 [[CONV]]433;434  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 7)435  %cmp = icmp eq i32 %call, 0436  %conv = zext i1 %cmp to i32437  ret i32 %conv438}439 440define i32 @cmp_eq8(ptr nocapture readonly %x, ptr nocapture readonly %y)  {441; X32-LABEL: @cmp_eq8(442; X32-NEXT:    [[TMP3:%.*]] = load i32, ptr [[X:%.*]], align 1443; X32-NEXT:    [[TMP4:%.*]] = load i32, ptr [[Y:%.*]], align 1444; X32-NEXT:    [[TMP5:%.*]] = xor i32 [[TMP3]], [[TMP4]]445; X32-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[X]], i64 4446; X32-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[Y]], i64 4447; X32-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP6]], align 1448; X32-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP7]], align 1449; X32-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], [[TMP11]]450; X32-NEXT:    [[TMP13:%.*]] = or i32 [[TMP5]], [[TMP12]]451; X32-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0452; X32-NEXT:    [[TMP15:%.*]] = zext i1 [[TMP14]] to i32453; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP15]], 0454; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32455; X32-NEXT:    ret i32 [[CONV]]456;457  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 8)458  %cmp = icmp eq i32 %call, 0459  %conv = zext i1 %cmp to i32460  ret i32 %conv461}462 463define i32 @cmp_eq9(ptr nocapture readonly %x, ptr nocapture readonly %y)  {464; X32-LABEL: @cmp_eq9(465; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 9)466; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0467; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32468; X32-NEXT:    ret i32 [[CONV]]469;470  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 9)471  %cmp = icmp eq i32 %call, 0472  %conv = zext i1 %cmp to i32473  ret i32 %conv474}475 476define i32 @cmp_eq10(ptr nocapture readonly %x, ptr nocapture readonly %y)  {477; X32-LABEL: @cmp_eq10(478; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 10)479; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0480; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32481; X32-NEXT:    ret i32 [[CONV]]482;483  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 10)484  %cmp = icmp eq i32 %call, 0485  %conv = zext i1 %cmp to i32486  ret i32 %conv487}488 489define i32 @cmp_eq11(ptr nocapture readonly %x, ptr nocapture readonly %y)  {490; X32-LABEL: @cmp_eq11(491; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 11)492; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0493; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32494; X32-NEXT:    ret i32 [[CONV]]495;496  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 11)497  %cmp = icmp eq i32 %call, 0498  %conv = zext i1 %cmp to i32499  ret i32 %conv500}501 502define i32 @cmp_eq12(ptr nocapture readonly %x, ptr nocapture readonly %y)  {503; X32-LABEL: @cmp_eq12(504; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 12)505; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0506; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32507; X32-NEXT:    ret i32 [[CONV]]508;509  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 12)510  %cmp = icmp eq i32 %call, 0511  %conv = zext i1 %cmp to i32512  ret i32 %conv513}514 515define i32 @cmp_eq13(ptr nocapture readonly %x, ptr nocapture readonly %y)  {516; X32-LABEL: @cmp_eq13(517; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 13)518; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0519; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32520; X32-NEXT:    ret i32 [[CONV]]521;522  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 13)523  %cmp = icmp eq i32 %call, 0524  %conv = zext i1 %cmp to i32525  ret i32 %conv526}527 528define i32 @cmp_eq14(ptr nocapture readonly %x, ptr nocapture readonly %y)  {529; X32-LABEL: @cmp_eq14(530; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 14)531; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0532; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32533; X32-NEXT:    ret i32 [[CONV]]534;535  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 14)536  %cmp = icmp eq i32 %call, 0537  %conv = zext i1 %cmp to i32538  ret i32 %conv539}540 541define i32 @cmp_eq15(ptr nocapture readonly %x, ptr nocapture readonly %y)  {542; X32-LABEL: @cmp_eq15(543; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 15)544; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0545; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32546; X32-NEXT:    ret i32 [[CONV]]547;548  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 15)549  %cmp = icmp eq i32 %call, 0550  %conv = zext i1 %cmp to i32551  ret i32 %conv552}553 554define i32 @cmp_eq16(ptr nocapture readonly %x, ptr nocapture readonly %y)  {555; X32-LABEL: @cmp_eq16(556; X32-NEXT:    [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X:%.*]], ptr [[Y:%.*]], i32 16)557; X32-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0558; X32-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32559; X32-NEXT:    ret i32 [[CONV]]560;561  %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16)562  %cmp = icmp eq i32 %call, 0563  %conv = zext i1 %cmp to i32564  ret i32 %conv565}566 567