brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.7 KiB · 19c4cc9 Raw
978 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare i16 @llvm.bswap.i16(i16)5declare i32 @llvm.bswap.i32(i32)6declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)7declare i32 @llvm.cttz.i32(i32, i1)8declare i33 @llvm.cttz.i33(i33, i1)9declare i32 @llvm.ctlz.i32(i32, i1)10declare i8 @llvm.umax.i8(i8, i8)11declare i8 @llvm.uadd.sat.i8(i8, i8)12declare i8 @llvm.ssub.sat.i8(i8, i8)13declare i33 @llvm.ctlz.i33(i33, i1)14declare i8 @llvm.ctpop.i8(i8)15declare i11 @llvm.ctpop.i11(i11)16declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)17declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)18declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)19declare i8 @llvm.bitreverse.i8(i8)20declare <2 x i8> @llvm.bitreverse.v2i8(<2 x i8>)21declare void @use6(i6)22declare void @use8(i8)23 24define i1 @bswap_eq_i16(i16 %x) {25; CHECK-LABEL: @bswap_eq_i16(26; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[X:%.*]], 25627; CHECK-NEXT:    ret i1 [[CMP]]28;29  %bs = call i16 @llvm.bswap.i16(i16 %x)30  %cmp = icmp eq i16 %bs, 131  ret i1 %cmp32}33 34define i1 @bswap_ne_i32(i32 %x) {35; CHECK-LABEL: @bswap_ne_i32(36; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 3355443237; CHECK-NEXT:    ret i1 [[CMP]]38;39  %bs = tail call i32 @llvm.bswap.i32(i32 %x)40  %cmp = icmp ne i32 %bs, 241  ret i1 %cmp42}43 44define <2 x i1> @bswap_eq_v2i64(<2 x i64> %x) {45; CHECK-LABEL: @bswap_eq_v2i64(46; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 216172782113783808)47; CHECK-NEXT:    ret <2 x i1> [[CMP]]48;49  %bs = tail call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %x)50  %cmp = icmp eq <2 x i64> %bs, <i64 3, i64 3>51  ret <2 x i1> %cmp52}53 54define i1 @ctlz_eq_bitwidth_i32(i32 %x) {55; CHECK-LABEL: @ctlz_eq_bitwidth_i32(56; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 057; CHECK-NEXT:    ret i1 [[CMP]]58;59  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)60  %cmp = icmp eq i32 %lz, 3261  ret i1 %cmp62}63 64define i1 @ctlz_eq_zero_i32(i32 %x) {65; CHECK-LABEL: @ctlz_eq_zero_i32(66; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 067; CHECK-NEXT:    ret i1 [[CMP]]68;69  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)70  %cmp = icmp eq i32 %lz, 071  ret i1 %cmp72}73 74define <2 x i1> @ctlz_ne_zero_v2i32(<2 x i32> %a) {75; CHECK-LABEL: @ctlz_ne_zero_v2i32(76; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt <2 x i32> [[A:%.*]], splat (i32 -1)77; CHECK-NEXT:    ret <2 x i1> [[CMP]]78;79  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)80  %cmp = icmp ne <2 x i32> %x, zeroinitializer81  ret <2 x i1> %cmp82}83 84define i1 @ctlz_eq_bw_minus_1_i32(i32 %x) {85; CHECK-LABEL: @ctlz_eq_bw_minus_1_i32(86; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 187; CHECK-NEXT:    ret i1 [[CMP]]88;89  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)90  %cmp = icmp eq i32 %lz, 3191  ret i1 %cmp92}93 94define <2 x i1> @ctlz_ne_bw_minus_1_v2i32(<2 x i32> %a) {95; CHECK-LABEL: @ctlz_ne_bw_minus_1_v2i32(96; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], splat (i32 1)97; CHECK-NEXT:    ret <2 x i1> [[CMP]]98;99  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)100  %cmp = icmp ne <2 x i32> %x, <i32 31, i32 31>101  ret <2 x i1> %cmp102}103 104define i1 @ctlz_eq_other_i32(i32 %x) {105; CHECK-LABEL: @ctlz_eq_other_i32(106; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], -128107; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[TMP1]], 128108; CHECK-NEXT:    ret i1 [[CMP]]109;110  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)111  %cmp = icmp eq i32 %lz, 24112  ret i1 %cmp113}114 115define <2 x i1> @ctlz_ne_other_v2i32(<2 x i32> %a) {116; CHECK-LABEL: @ctlz_ne_other_v2i32(117; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 -128)118; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], splat (i32 128)119; CHECK-NEXT:    ret <2 x i1> [[CMP]]120;121  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)122  %cmp = icmp ne <2 x i32> %x, <i32 24, i32 24>123  ret <2 x i1> %cmp124}125 126define i1 @ctlz_eq_other_i32_multiuse(i32 %x, ptr %p) {127; CHECK-LABEL: @ctlz_eq_other_i32_multiuse(128; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)129; CHECK-NEXT:    store i32 [[LZ]], ptr [[P:%.*]], align 4130; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[LZ]], 24131; CHECK-NEXT:    ret i1 [[CMP]]132;133  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)134  store i32 %lz, ptr %p135  %cmp = icmp eq i32 %lz, 24136  ret i1 %cmp137}138 139define <2 x i1> @ctlz_ne_bitwidth_v2i32(<2 x i32> %a) {140; CHECK-LABEL: @ctlz_ne_bitwidth_v2i32(141; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer142; CHECK-NEXT:    ret <2 x i1> [[CMP]]143;144  %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)145  %cmp = icmp ne <2 x i32> %x, <i32 32, i32 32>146  ret <2 x i1> %cmp147}148 149define i1 @ctlz_ugt_zero_i32(i32 %x) {150; CHECK-LABEL: @ctlz_ugt_zero_i32(151; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1152; CHECK-NEXT:    ret i1 [[CMP]]153;154  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)155  %cmp = icmp ugt i32 %lz, 0156  ret i1 %cmp157}158 159define i1 @ctlz_ugt_one_i32(i32 %x) {160; CHECK-LABEL: @ctlz_ugt_one_i32(161; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 1073741824162; CHECK-NEXT:    ret i1 [[CMP]]163;164  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)165  %cmp = icmp ugt i32 %lz, 1166  ret i1 %cmp167}168 169define i1 @ctlz_ugt_other_i32(i32 %x) {170; CHECK-LABEL: @ctlz_ugt_other_i32(171; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 32768172; CHECK-NEXT:    ret i1 [[CMP]]173;174  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)175  %cmp = icmp ugt i32 %lz, 16176  ret i1 %cmp177}178 179define i1 @ctlz_ugt_other_multiuse_i32(i32 %x, ptr %p) {180; CHECK-LABEL: @ctlz_ugt_other_multiuse_i32(181; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)182; CHECK-NEXT:    store i32 [[LZ]], ptr [[P:%.*]], align 4183; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X]], 32768184; CHECK-NEXT:    ret i1 [[CMP]]185;186  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)187  store i32 %lz, ptr %p188  %cmp = icmp ugt i32 %lz, 16189  ret i1 %cmp190}191 192define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) {193; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32(194; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0195; CHECK-NEXT:    ret i1 [[CMP]]196;197  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)198  %cmp = icmp ugt i32 %lz, 31199  ret i1 %cmp200}201 202define <2 x i1> @ctlz_ult_one_v2i32(<2 x i32> %x) {203; CHECK-LABEL: @ctlz_ult_one_v2i32(204; CHECK-NEXT:    [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer205; CHECK-NEXT:    ret <2 x i1> [[CMP]]206;207  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)208  %cmp = icmp ult <2 x i32> %lz, <i32 1, i32 1>209  ret <2 x i1> %cmp210}211 212define <2 x i1> @ctlz_ult_other_v2i32(<2 x i32> %x) {213; CHECK-LABEL: @ctlz_ult_other_v2i32(214; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt <2 x i32> [[X:%.*]], splat (i32 65535)215; CHECK-NEXT:    ret <2 x i1> [[CMP]]216;217  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)218  %cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16>219  ret <2 x i1> %cmp220}221 222define <2 x i1> @ctlz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) {223; CHECK-LABEL: @ctlz_ult_other_multiuse_v2i32(224; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)225; CHECK-NEXT:    store <2 x i32> [[LZ]], ptr [[P:%.*]], align 8226; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt <2 x i32> [[X]], splat (i32 65535)227; CHECK-NEXT:    ret <2 x i1> [[CMP]]228;229  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)230  store <2 x i32> %lz, ptr %p231  %cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16>232  ret <2 x i1> %cmp233}234 235define <2 x i1> @ctlz_ult_bw_minus_one_v2i32(<2 x i32> %x) {236; CHECK-LABEL: @ctlz_ult_bw_minus_one_v2i32(237; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt <2 x i32> [[X:%.*]], splat (i32 1)238; CHECK-NEXT:    ret <2 x i1> [[CMP]]239;240  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)241  %cmp = icmp ult <2 x i32> %lz, <i32 31, i32 31>242  ret <2 x i1> %cmp243}244 245define <2 x i1> @ctlz_ult_bitwidth_v2i32(<2 x i32> %x) {246; CHECK-LABEL: @ctlz_ult_bitwidth_v2i32(247; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer248; CHECK-NEXT:    ret <2 x i1> [[CMP]]249;250  %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)251  %cmp = icmp ult <2 x i32> %lz, <i32 32, i32 32>252  ret <2 x i1> %cmp253}254 255define i1 @cttz_ne_bitwidth_i33(i33 %x) {256; CHECK-LABEL: @cttz_ne_bitwidth_i33(257; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i33 [[X:%.*]], 0258; CHECK-NEXT:    ret i1 [[CMP]]259;260  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)261  %cmp = icmp ne i33 %tz, 33262  ret i1 %cmp263}264 265define <2 x i1> @cttz_eq_bitwidth_v2i32(<2 x i32> %a) {266; CHECK-LABEL: @cttz_eq_bitwidth_v2i32(267; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer268; CHECK-NEXT:    ret <2 x i1> [[CMP]]269;270  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)271  %cmp = icmp eq <2 x i32> %x, <i32 32, i32 32>272  ret <2 x i1> %cmp273}274 275define i1 @cttz_eq_zero_i33(i33 %x) {276; CHECK-LABEL: @cttz_eq_zero_i33(277; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 1278; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0279; CHECK-NEXT:    ret i1 [[CMP]]280;281  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)282  %cmp = icmp eq i33 %tz, 0283  ret i1 %cmp284}285 286define <2 x i1> @cttz_ne_zero_v2i32(<2 x i32> %a) {287; CHECK-LABEL: @cttz_ne_zero_v2i32(288; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 1)289; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <2 x i32> [[TMP1]], zeroinitializer290; CHECK-NEXT:    ret <2 x i1> [[CMP]]291;292  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)293  %cmp = icmp ne <2 x i32> %x, zeroinitializer294  ret <2 x i1> %cmp295}296 297define i1 @cttz_eq_bw_minus_1_i33(i33 %x) {298; CHECK-LABEL: @cttz_eq_bw_minus_1_i33(299; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[X:%.*]], -4294967296300; CHECK-NEXT:    ret i1 [[CMP]]301;302  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)303  %cmp = icmp eq i33 %tz, 32304  ret i1 %cmp305}306 307define <2 x i1> @cttz_ne_bw_minus_1_v2i32(<2 x i32> %a) {308; CHECK-LABEL: @cttz_ne_bw_minus_1_v2i32(309; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], splat (i32 -2147483648)310; CHECK-NEXT:    ret <2 x i1> [[CMP]]311;312  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)313  %cmp = icmp ne <2 x i32> %x, <i32 31, i32 31>314  ret <2 x i1> %cmp315}316 317define i1 @cttz_eq_other_i33(i33 %x) {318; CHECK-LABEL: @cttz_eq_other_i33(319; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 31320; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 16321; CHECK-NEXT:    ret i1 [[CMP]]322;323  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)324  %cmp = icmp eq i33 %tz, 4325  ret i1 %cmp326}327 328define <2 x i1> @cttz_ne_other_v2i32(<2 x i32> %a) {329; CHECK-LABEL: @cttz_ne_other_v2i32(330; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 31)331; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], splat (i32 16)332; CHECK-NEXT:    ret <2 x i1> [[CMP]]333;334  %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)335  %cmp = icmp ne <2 x i32> %x, <i32 4, i32 4>336  ret <2 x i1> %cmp337}338 339define i1 @cttz_eq_other_i33_multiuse(i33 %x, ptr %p) {340; CHECK-LABEL: @cttz_eq_other_i33_multiuse(341; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)342; CHECK-NEXT:    store i33 [[TZ]], ptr [[P:%.*]], align 4343; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TZ]], 4344; CHECK-NEXT:    ret i1 [[CMP]]345;346  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)347  store i33 %tz, ptr %p348  %cmp = icmp eq i33 %tz, 4349  ret i1 %cmp350}351 352define i1 @cttz_ugt_zero_i33(i33 %x) {353; CHECK-LABEL: @cttz_ugt_zero_i33(354; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 1355; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0356; CHECK-NEXT:    ret i1 [[CMP]]357;358  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)359  %cmp = icmp ugt i33 %tz, 0360  ret i1 %cmp361}362 363define i1 @cttz_ugt_one_i33(i33 %x) {364; CHECK-LABEL: @cttz_ugt_one_i33(365; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 3366; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0367; CHECK-NEXT:    ret i1 [[CMP]]368;369  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)370  %cmp = icmp ugt i33 %tz, 1371  ret i1 %cmp372}373 374define i1 @cttz_ugt_other_i33(i33 %x) {375; CHECK-LABEL: @cttz_ugt_other_i33(376; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 131071377; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0378; CHECK-NEXT:    ret i1 [[CMP]]379;380  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)381  %cmp = icmp ugt i33 %tz, 16382  ret i1 %cmp383}384 385define i1 @cttz_ugt_other_multiuse_i33(i33 %x, ptr %p) {386; CHECK-LABEL: @cttz_ugt_other_multiuse_i33(387; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)388; CHECK-NEXT:    store i33 [[TZ]], ptr [[P:%.*]], align 4389; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ugt i33 [[TZ]], 16390; CHECK-NEXT:    ret i1 [[CMP]]391;392  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)393  store i33 %tz, ptr %p394  %cmp = icmp ugt i33 %tz, 16395  ret i1 %cmp396}397 398define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) {399; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33(400; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[X:%.*]], 0401; CHECK-NEXT:    ret i1 [[CMP]]402;403  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)404  %cmp = icmp ugt i33 %tz, 32405  ret i1 %cmp406}407 408define <2 x i1> @cttz_ult_one_v2i32(<2 x i32> %x) {409; CHECK-LABEL: @cttz_ult_one_v2i32(410; CHECK-NEXT:    [[CMP:%.*]] = trunc <2 x i32> [[X:%.*]] to <2 x i1>411; CHECK-NEXT:    ret <2 x i1> [[CMP]]412;413  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)414  %cmp = icmp ult <2 x i32> %tz, <i32 1, i32 1>415  ret <2 x i1> %cmp416}417 418define <2 x i1> @cttz_ult_other_v2i32(<2 x i32> %x) {419; CHECK-LABEL: @cttz_ult_other_v2i32(420; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 65535)421; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], zeroinitializer422; CHECK-NEXT:    ret <2 x i1> [[CMP]]423;424  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)425  %cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16>426  ret <2 x i1> %cmp427}428 429define <2 x i1> @cttz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) {430; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32(431; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)432; CHECK-NEXT:    store <2 x i32> [[TZ]], ptr [[P:%.*]], align 8433; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult <2 x i32> [[TZ]], splat (i32 16)434; CHECK-NEXT:    ret <2 x i1> [[CMP]]435;436  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)437  store <2 x i32> %tz, ptr %p438  %cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16>439  ret <2 x i1> %cmp440}441 442define <2 x i1> @cttz_ult_bw_minus_one_v2i32(<2 x i32> %x) {443; CHECK-LABEL: @cttz_ult_bw_minus_one_v2i32(444; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 2147483647)445; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], zeroinitializer446; CHECK-NEXT:    ret <2 x i1> [[CMP]]447;448  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)449  %cmp = icmp ult <2 x i32> %tz, <i32 31, i32 31>450  ret <2 x i1> %cmp451}452 453define <2 x i1> @cttz_ult_bitwidth_v2i32(<2 x i32> %x) {454; CHECK-LABEL: @cttz_ult_bitwidth_v2i32(455; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer456; CHECK-NEXT:    ret <2 x i1> [[CMP]]457;458  %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)459  %cmp = icmp ult <2 x i32> %tz, <i32 32, i32 32>460  ret <2 x i1> %cmp461}462 463define i1 @ctpop_eq_zero_i11(i11 %x) {464; CHECK-LABEL: @ctpop_eq_zero_i11(465; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0466; CHECK-NEXT:    ret i1 [[CMP]]467;468  %pop = tail call i11 @llvm.ctpop.i11(i11 %x)469  %cmp = icmp eq i11 %pop, 0470  ret i1 %cmp471}472 473define <2 x i1> @ctpop_ne_zero_v2i32(<2 x i32> %x) {474; CHECK-LABEL: @ctpop_ne_zero_v2i32(475; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer476; CHECK-NEXT:    ret <2 x i1> [[CMP]]477;478  %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x)479  %cmp = icmp ne <2 x i32> %pop, zeroinitializer480  ret <2 x i1> %cmp481}482 483define i1 @ctpop_eq_bitwidth_i8(i8 %x) {484; CHECK-LABEL: @ctpop_eq_bitwidth_i8(485; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1486; CHECK-NEXT:    ret i1 [[CMP]]487;488  %pop = tail call i8 @llvm.ctpop.i8(i8 %x)489  %cmp = icmp eq i8 %pop, 8490  ret i1 %cmp491}492 493define <2 x i1> @ctpop_ne_bitwidth_v2i32(<2 x i32> %x) {494; CHECK-LABEL: @ctpop_ne_bitwidth_v2i32(495; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], splat (i32 -1)496; CHECK-NEXT:    ret <2 x i1> [[CMP]]497;498  %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x)499  %cmp = icmp ne <2 x i32> %pop, <i32 32, i32 32>500  ret <2 x i1> %cmp501}502 503define i1 @ctpop_ugt_bitwidth_minus_one_i8(i8 %x, ptr %p) {504; CHECK-LABEL: @ctpop_ugt_bitwidth_minus_one_i8(505; CHECK-NEXT:    [[POP:%.*]] = tail call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[X:%.*]])506; CHECK-NEXT:    store i8 [[POP]], ptr [[P:%.*]], align 1507; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X]], -1508; CHECK-NEXT:    ret i1 [[CMP]]509;510  %pop = tail call i8 @llvm.ctpop.i8(i8 %x)511  store i8 %pop, ptr %p512  %cmp = icmp ugt i8 %pop, 7513  ret i1 %cmp514}515 516define <2 x i1> @ctpop_ult_bitwidth_v2i32(<2 x i32> %x) {517; CHECK-LABEL: @ctpop_ult_bitwidth_v2i32(518; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], splat (i32 -1)519; CHECK-NEXT:    ret <2 x i1> [[CMP]]520;521  %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x)522  %cmp = icmp ult <2 x i32> %pop, <i32 32, i32 32>523  ret <2 x i1> %cmp524}525 526define i1 @trunc_cttz_eq_other_i33_i15(i33 %x) {527; CHECK-LABEL: @trunc_cttz_eq_other_i33_i15(528; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 31529; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 16530; CHECK-NEXT:    ret i1 [[CMP]]531;532  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)533  %trunc = trunc i33 %tz to i15534  %cmp = icmp eq i15 %trunc, 4535  ret i1 %cmp536}537 538define i1 @trunc_cttz_ugt_other_i33_i15(i33 %x) {539; CHECK-LABEL: @trunc_cttz_ugt_other_i33_i15(540; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 15541; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0542; CHECK-NEXT:    ret i1 [[CMP]]543;544  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)545  %trunc = trunc i33 %tz to i15546  %cmp = icmp ugt i15 %trunc, 3547  ret i1 %cmp548}549 550define i1 @trunc_cttz_ult_other_i33_i6(i33 %x) {551; CHECK-LABEL: @trunc_cttz_ult_other_i33_i6(552; CHECK-NEXT:    [[TMP1:%.*]] = and i33 [[X:%.*]], 127553; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0554; CHECK-NEXT:    ret i1 [[CMP]]555;556  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 true)557  %trunc = trunc i33 %tz to i6558  %cmp = icmp ult i6 %trunc, 7559  ret i1 %cmp560}561 562; negative case: log2(33 - is_zero_poison ? 1 : 0) + 1 > 5563 564define i1 @trunc_cttz_ult_other_i33_i5(i33 %x) {565; CHECK-LABEL: @trunc_cttz_ult_other_i33_i5(566; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 true)567; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i33 [[TZ]] to i5568; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i5 [[TRUNC]], 7569; CHECK-NEXT:    ret i1 [[CMP]]570;571  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 true)572  %trunc = trunc i33 %tz to i5573  %cmp = icmp ult i5 %trunc, 7574  ret i1 %cmp575}576 577define i1 @trunc_cttz_true_ult_other_i32_i5(i32 %x) {578; CHECK-LABEL: @trunc_cttz_true_ult_other_i32_i5(579; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 127580; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0581; CHECK-NEXT:    ret i1 [[CMP]]582;583  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)584  %trunc = trunc i32 %tz to i5585  %cmp = icmp ult i5 %trunc, 7586  ret i1 %cmp587}588 589; negative case, is_zero_poison == false && log2(src bitwidth) == dest bitwidth590 591define i1 @trunc_cttz_false_ult_other_i32_i5(i32 %x) {592; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i5(593; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false)594; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[TZ]] to i5595; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i5 [[TRUNC]], 7596; CHECK-NEXT:    ret i1 [[CMP]]597;598  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)599  %trunc = trunc i32 %tz to i5600  %cmp = icmp ult i5 %trunc, 7601  ret i1 %cmp602}603 604define i1 @trunc_cttz_false_ult_other_i32_i6(i32 %x) {605; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i6(606; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 127607; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0608; CHECK-NEXT:    ret i1 [[CMP]]609;610  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)611  %trunc = trunc i32 %tz to i6612  %cmp = icmp ult i6 %trunc, 7613  ret i1 %cmp614}615 616; negative case, trunc is not one use617 618define i1 @trunc_cttz_false_ult_other_i32_i6_extra_use(i32 %x) {619; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i6_extra_use(620; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false)621; CHECK-NEXT:    [[TRUNC:%.*]] = trunc nuw i32 [[TZ]] to i6622; CHECK-NEXT:    call void @use6(i6 [[TRUNC]])623; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i6 [[TRUNC]], 7624; CHECK-NEXT:    ret i1 [[CMP]]625;626  %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)627  %trunc = trunc i32 %tz to i6628  call void @use6(i6 %trunc)629  %cmp = icmp ult i6 %trunc, 7630  ret i1 %cmp631}632 633define i1 @trunc_ctlz_ugt_zero_i32(i32 %x) {634; CHECK-LABEL: @trunc_ctlz_ugt_zero_i32(635; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1636; CHECK-NEXT:    ret i1 [[CMP]]637;638  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)639  %trunc = trunc i32 %lz to i15640  %cmp = icmp ugt i15 %trunc, 0641  ret i1 %cmp642}643 644define i1 @trunc_ctlz_ugt_one_i32(i32 %x) {645; CHECK-LABEL: @trunc_ctlz_ugt_one_i32(646; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 1073741824647; CHECK-NEXT:    ret i1 [[CMP]]648;649  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)650  %trunc = trunc i32 %lz to i15651  %cmp = icmp ugt i15 %trunc, 1652  ret i1 %cmp653}654 655define i1 @trunc_ctlz_ugt_other_i33_i6(i33 %x) {656; CHECK-LABEL: @trunc_ctlz_ugt_other_i33_i6(657; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i33 [[X:%.*]], 268435456658; CHECK-NEXT:    ret i1 [[CMP]]659;660  %lz = tail call i33 @llvm.ctlz.i33(i33 %x, i1 true)661  %trunc = trunc i33 %lz to i6662  %cmp = icmp ugt i6 %trunc, 4663  ret i1 %cmp664}665 666; negative case: log2(33 - is_zero_poison ? 1 : 0) + 1 > 5667 668define i1 @trunc_ctlz_ugt_other_i33_i5(i33 %x) {669; CHECK-LABEL: @trunc_ctlz_ugt_other_i33_i5(670; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.ctlz.i33(i33 [[X:%.*]], i1 true)671; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i33 [[LZ]] to i5672; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i5 [[TRUNC]], 4673; CHECK-NEXT:    ret i1 [[CMP]]674;675  %lz = tail call i33 @llvm.ctlz.i33(i33 %x, i1 true)676  %trunc = trunc i33 %lz to i5677  %cmp = icmp ugt i5 %trunc, 4678  ret i1 %cmp679}680 681define i1 @trunc_ctlz_true_ugt_other_i32_i5(i32 %x) {682; CHECK-LABEL: @trunc_ctlz_true_ugt_other_i32_i5(683; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 134217728684; CHECK-NEXT:    ret i1 [[CMP]]685;686  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)687  %trunc = trunc i32 %lz to i5688  %cmp = icmp ugt i5 %trunc, 4689  ret i1 %cmp690}691 692; negative case, is_zero_poison == false && log2(src bitwidth) == dest bitwidth693 694define i1 @trunc_ctlz_false_ugt_other_i32_i5(i32 %x) {695; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i5(696; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)697; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[LZ]] to i5698; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i5 [[TRUNC]], 4699; CHECK-NEXT:    ret i1 [[CMP]]700;701  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)702  %trunc = trunc i32 %lz to i5703  %cmp = icmp ugt i5 %trunc, 4704  ret i1 %cmp705}706 707define i1 @trunc_ctlz_false_ugt_other_i32_i6(i32 %x) {708; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i6(709; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 134217728710; CHECK-NEXT:    ret i1 [[CMP]]711;712  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)713  %trunc = trunc i32 %lz to i6714  %cmp = icmp ugt i6 %trunc, 4715  ret i1 %cmp716}717 718; negative case, trunc is not one use719 720define i1 @trunc_ctlz_false_ugt_other_i32_i6_extra_use(i32 %x) {721; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i6_extra_use(722; CHECK-NEXT:    [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false)723; CHECK-NEXT:    [[TRUNC:%.*]] = trunc nuw i32 [[LZ]] to i6724; CHECK-NEXT:    call void @use6(i6 [[TRUNC]])725; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i6 [[TRUNC]], 4726; CHECK-NEXT:    ret i1 [[CMP]]727;728  %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)729  %trunc = trunc i32 %lz to i6730  call void @use6(i6 %trunc)731  %cmp = icmp ugt i6 %trunc, 4732  ret i1 %cmp733}734 735define i1 @trunc_ctpop_eq_zero_i11(i11 %x) {736; CHECK-LABEL: @trunc_ctpop_eq_zero_i11(737; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0738; CHECK-NEXT:    ret i1 [[CMP]]739;740  %pop = tail call i11 @llvm.ctpop.i11(i11 %x)741  %trunc = trunc i11 %pop to i5742  %cmp = icmp eq i5 %trunc, 0743  ret i1 %cmp744}745 746define i1 @trunc_ctpop_eq_bitwidth_i8(i8 %x) {747; CHECK-LABEL: @trunc_ctpop_eq_bitwidth_i8(748; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1749; CHECK-NEXT:    ret i1 [[CMP]]750;751  %pop = tail call i8 @llvm.ctpop.i8(i8 %x)752  %trunc = trunc i8 %pop to i5753  %cmp = icmp eq i5 %trunc, 8754  ret i1 %cmp755}756 757; negative case: log2(33) + 1 > 4758 759define i1 @trunc_negative_destbits_not_enough(i33 %x) {760; CHECK-LABEL: @trunc_negative_destbits_not_enough(761; CHECK-NEXT:    [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)762; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i33 [[TZ]] to i4763; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i4 [[TRUNC]], 7764; CHECK-NEXT:    ret i1 [[CMP]]765;766  %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)767  %trunc = trunc i33 %tz to i4768  %cmp = icmp ult i4 %trunc, 7769  ret i1 %cmp770}771 772define i1 @bitreverse_ne_22(i8 %x) {773; CHECK-LABEL: @bitreverse_ne_22(774; CHECK-NEXT:    [[Z:%.*]] = icmp ne i8 [[X:%.*]], 104775; CHECK-NEXT:    ret i1 [[Z]]776;777  %y = call i8 @llvm.bitreverse.i8(i8 %x)778  %z = icmp ne i8 %y, 22779  ret i1 %z780}781 782define i1 @bitreverse_ult_22_fail_not_equality_pred(i8 %x) {783; CHECK-LABEL: @bitreverse_ult_22_fail_not_equality_pred(784; CHECK-NEXT:    [[Y:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[X:%.*]])785; CHECK-NEXT:    [[Z:%.*]] = icmp ult i8 [[Y]], 22786; CHECK-NEXT:    ret i1 [[Z]]787;788  %y = call i8 @llvm.bitreverse.i8(i8 %x)789  %z = icmp ult i8 %y, 22790  ret i1 %z791}792 793define <2 x i1> @bitreverse_vec_eq_2_2(<2 x i8> %x) {794; CHECK-LABEL: @bitreverse_vec_eq_2_2(795; CHECK-NEXT:    [[Z:%.*]] = icmp eq <2 x i8> [[X:%.*]], splat (i8 64)796; CHECK-NEXT:    ret <2 x i1> [[Z]]797;798  %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x)799  %z = icmp eq <2 x i8> %y, <i8 2, i8 2>800  ret <2 x i1> %z801}802 803define <2 x i1> @bitreverse_vec_eq_1_2_todo_no_splat(<2 x i8> %x) {804; CHECK-LABEL: @bitreverse_vec_eq_1_2_todo_no_splat(805; CHECK-NEXT:    [[Y:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[X:%.*]])806; CHECK-NEXT:    [[Z:%.*]] = icmp eq <2 x i8> [[Y]], <i8 1, i8 2>807; CHECK-NEXT:    ret <2 x i1> [[Z]]808;809  %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x)810  %z = icmp eq <2 x i8> %y, <i8 1, i8 2>811  ret <2 x i1> %z812}813 814define i1 @umax_eq_zero(i8 %x, i8 %y) {815; CHECK-LABEL: @umax_eq_zero(816; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]817; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[TMP1]], 0818; CHECK-NEXT:    ret i1 [[R]]819;820  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)821  %r = icmp eq i8 %m, 0822  ret i1 %r823}824 825define i1 @umax_eq_1_fail(i8 %x, i8 %y) {826; CHECK-LABEL: @umax_eq_1_fail(827; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])828; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[M]], 1829; CHECK-NEXT:    ret i1 [[R]]830;831  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)832  %r = icmp eq i8 %m, 1833  ret i1 %r834}835 836define i1 @umax_sle_zero_fail(i8 %x, i8 %y) {837; CHECK-LABEL: @umax_sle_zero_fail(838; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])839; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[M]], 1840; CHECK-NEXT:    ret i1 [[R]]841;842  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)843  %r = icmp sle i8 %m, 0844  ret i1 %r845}846 847define i1 @umax_ne_zero(i8 %x, i8 %y) {848; CHECK-LABEL: @umax_ne_zero(849; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]850; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[TMP1]], 0851; CHECK-NEXT:    ret i1 [[R]]852;853  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)854  %r = icmp ne i8 %m, 0855  ret i1 %r856}857 858define i1 @umax_ne_zero_fail_multiuse(i8 %x, i8 %y) {859; CHECK-LABEL: @umax_ne_zero_fail_multiuse(860; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])861; CHECK-NEXT:    call void @use8(i8 [[M]])862; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[M]], 0863; CHECK-NEXT:    ret i1 [[R]]864;865  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)866  call void @use8(i8 %m)867  %r = icmp ne i8 %m, 0868  ret i1 %r869}870 871 872define i1 @uadd_sat_ne_zero_fail_multiuse(i8 %x, i8 %y) {873; CHECK-LABEL: @uadd_sat_ne_zero_fail_multiuse(874; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])875; CHECK-NEXT:    call void @use8(i8 [[M]])876; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[M]], 0877; CHECK-NEXT:    ret i1 [[R]]878;879  %m = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y)880  call void @use8(i8 %m)881  %r = icmp ne i8 %m, 0882  ret i1 %r883}884 885 886define i1 @ssub_sat_ne_zero(i8 %x, i8 %y) {887; CHECK-LABEL: @ssub_sat_ne_zero(888; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]889; CHECK-NEXT:    ret i1 [[R]]890;891  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)892  %r = icmp ne i8 %m, 0893  ret i1 %r894}895 896define i1 @ssub_sat_ne_fail_nonzero(i8 %x, i8 %y) {897; CHECK-LABEL: @ssub_sat_ne_fail_nonzero(898; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])899; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[M]], 4900; CHECK-NEXT:    ret i1 [[R]]901;902  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)903  %r = icmp ne i8 %m, 4904  ret i1 %r905}906 907define i1 @ssub_sat_eq_zero(i8 %x, i8 %y) {908; CHECK-LABEL: @ssub_sat_eq_zero(909; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]910; CHECK-NEXT:    ret i1 [[R]]911;912  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)913  %r = icmp eq i8 %m, 0914  ret i1 %r915}916 917define i1 @ssub_sat_sle_zero(i8 %x, i8 %y) {918; CHECK-LABEL: @ssub_sat_sle_zero(919; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]920; CHECK-NEXT:    ret i1 [[R]]921;922  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)923  %r = icmp sle i8 %m, 0924  ret i1 %r925}926 927define i1 @ssub_sat_sge_zero(i8 %x, i8 %y) {928; CHECK-LABEL: @ssub_sat_sge_zero(929; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]930; CHECK-NEXT:    ret i1 [[R]]931;932  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)933  %r = icmp sge i8 %m, 0934  ret i1 %r935}936 937define i1 @ssub_sat_slt_zero(i8 %x, i8 %y) {938; CHECK-LABEL: @ssub_sat_slt_zero(939; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]940; CHECK-NEXT:    ret i1 [[R]]941;942  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)943  %r = icmp slt i8 %m, 0944  ret i1 %r945}946 947define i1 @ssub_sat_slt_neg1_fail(i8 %x, i8 %y) {948; CHECK-LABEL: @ssub_sat_slt_neg1_fail(949; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])950; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[M]], -1951; CHECK-NEXT:    ret i1 [[R]]952;953  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)954  %r = icmp slt i8 %m, -1955  ret i1 %r956}957 958define i1 @ssub_sat_sgt_zero(i8 %x, i8 %y) {959; CHECK-LABEL: @ssub_sat_sgt_zero(960; CHECK-NEXT:    [[R:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]961; CHECK-NEXT:    ret i1 [[R]]962;963  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)964  %r = icmp sgt i8 %m, 0965  ret i1 %r966}967 968define i1 @ssub_sat_sgt_one_fail(i8 %x, i8 %y) {969; CHECK-LABEL: @ssub_sat_sgt_one_fail(970; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]])971; CHECK-NEXT:    [[R:%.*]] = icmp sgt i8 [[M]], 1972; CHECK-NEXT:    ret i1 [[R]]973;974  %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y)975  %r = icmp sgt i8 %m, 1976  ret i1 %r977}978