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