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