383 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i8 @umin_cttz_i8_zero_undefined(i8 %X) {5; CHECK-LABEL: define i8 @umin_cttz_i8_zero_undefined(6; CHECK-SAME: i8 [[X:%.*]]) {7; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], 648; CHECK-NEXT: [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.cttz.i8(i8 [[TMP1]], i1 true)9; CHECK-NEXT: ret i8 [[RET]]10;11 %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 true)12 %ret = call i8 @llvm.umin.i8(i8 %cttz, i8 6)13 ret i8 %ret14}15 16define i8 @umin_cttz_i8_zero_defined(i8 %X) {17; CHECK-LABEL: define i8 @umin_cttz_i8_zero_defined(18; CHECK-SAME: i8 [[X:%.*]]) {19; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], 6420; CHECK-NEXT: [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.cttz.i8(i8 [[TMP1]], i1 true)21; CHECK-NEXT: ret i8 [[RET]]22;23 %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 false)24 %ret = call i8 @llvm.umin.i8(i8 %cttz, i8 6)25 ret i8 %ret26}27 28define i8 @umin_cttz_i8_commuted_zero_undefined(i8 %X) {29; CHECK-LABEL: define i8 @umin_cttz_i8_commuted_zero_undefined(30; CHECK-SAME: i8 [[X:%.*]]) {31; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], 6432; CHECK-NEXT: [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.cttz.i8(i8 [[TMP1]], i1 true)33; CHECK-NEXT: ret i8 [[RET]]34;35 %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 true)36 %ret = call i8 @llvm.umin.i8(i8 6, i8 %cttz)37 ret i8 %ret38}39 40define i8 @umin_cttz_i8_negative_ge_bitwidth_zero_undefined(i8 %X) {41; CHECK-LABEL: define i8 @umin_cttz_i8_negative_ge_bitwidth_zero_undefined(42; CHECK-SAME: i8 [[X:%.*]]) {43; CHECK-NEXT: [[CTTZ:%.*]] = call range(i8 0, 9) i8 @llvm.cttz.i8(i8 [[X]], i1 true)44; CHECK-NEXT: ret i8 [[CTTZ]]45;46 %cttz = call i8 @llvm.cttz.i8(i8 %X, i1 true)47 %ret = call i8 @llvm.umin.i8(i8 %cttz, i8 10)48 ret i8 %ret49}50 51define i16 @umin_cttz_i16_zero_undefined(i16 %X) {52; CHECK-LABEL: define i16 @umin_cttz_i16_zero_undefined(53; CHECK-SAME: i16 [[X:%.*]]) {54; CHECK-NEXT: [[TMP1:%.*]] = or i16 [[X]], 6455; CHECK-NEXT: [[RET:%.*]] = call range(i16 0, 7) i16 @llvm.cttz.i16(i16 [[TMP1]], i1 true)56; CHECK-NEXT: ret i16 [[RET]]57;58 %cttz = call i16 @llvm.cttz.i16(i16 %X, i1 true)59 %ret = call i16 @llvm.umin.i16(i16 %cttz, i16 6)60 ret i16 %ret61}62 63define i32 @umin_cttz_i32_zero_undefined(i32 %X) {64; CHECK-LABEL: define i32 @umin_cttz_i32_zero_undefined(65; CHECK-SAME: i32 [[X:%.*]]) {66; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[X]], 6467; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 7) i32 @llvm.cttz.i32(i32 [[TMP1]], i1 true)68; CHECK-NEXT: ret i32 [[RET]]69;70 %cttz = call i32 @llvm.cttz.i32(i32 %X, i1 true)71 %ret = call i32 @llvm.umin.i32(i32 %cttz, i32 6)72 ret i32 %ret73}74 75define i64 @umin_cttz_i64_zero_undefined(i64 %X) {76; CHECK-LABEL: define i64 @umin_cttz_i64_zero_undefined(77; CHECK-SAME: i64 [[X:%.*]]) {78; CHECK-NEXT: [[TMP1:%.*]] = or i64 [[X]], 6479; CHECK-NEXT: [[RET:%.*]] = call range(i64 0, 7) i64 @llvm.cttz.i64(i64 [[TMP1]], i1 true)80; CHECK-NEXT: ret i64 [[RET]]81;82 %cttz = call i64 @llvm.cttz.i64(i64 %X, i1 true)83 %ret = call i64 @llvm.umin.i64(i64 %cttz, i64 6)84 ret i64 %ret85}86 87define i1 @umin_cttz_i1_zero_undefined(i1 %X) {88; CHECK-LABEL: define i1 @umin_cttz_i1_zero_undefined(89; CHECK-SAME: i1 [[X:%.*]]) {90; CHECK-NEXT: ret i1 false91;92 %cttz = call i1 @llvm.cttz.i1(i1 %X, i1 true)93 %ret = call i1 @llvm.umin.i1(i1 %cttz, i1 1)94 ret i1 %ret95}96 97define i1 @umin_cttz_i1_zero_defined(i1 %X) {98; CHECK-LABEL: define i1 @umin_cttz_i1_zero_defined(99; CHECK-SAME: i1 [[X:%.*]]) {100; CHECK-NEXT: [[CTTZ:%.*]] = xor i1 [[X]], true101; CHECK-NEXT: ret i1 [[CTTZ]]102;103 %cttz = call i1 @llvm.cttz.i1(i1 %X, i1 false)104 %ret = call i1 @llvm.umin.i1(i1 %cttz, i1 1)105 ret i1 %ret106}107 108define <2 x i32> @umin_cttz_2xi32_splat_zero_undefined(<2 x i32> %X) {109; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_splat_zero_undefined(110; CHECK-SAME: <2 x i32> [[X:%.*]]) {111; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[X]], splat (i32 64)112; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[TMP1]], i1 true)113; CHECK-NEXT: ret <2 x i32> [[RET]]114;115 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)116 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 6>)117 ret <2 x i32> %ret118}119 120define <2 x i32> @umin_cttz_2xi32_splat_poison_zero_undefined(<2 x i32> %X) {121; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_splat_poison_zero_undefined(122; CHECK-SAME: <2 x i32> [[X:%.*]]) {123; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 64, i32 poison>124; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[TMP1]], i1 true)125; CHECK-NEXT: ret <2 x i32> [[RET]]126;127 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)128 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 poison>)129 ret <2 x i32> %ret130}131 132define <2 x i32> @umin_cttz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(<2 x i32> %X) {133; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(134; CHECK-SAME: <2 x i32> [[X:%.*]]) {135; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 64, i32 1>136; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[TMP1]], i1 true)137; CHECK-NEXT: ret <2 x i32> [[RET]]138;139 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)140 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 0>)141 ret <2 x i32> %ret142}143 144define <2 x i32> @umin_cttz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(<2 x i32> %X) {145; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(146; CHECK-SAME: <2 x i32> [[X:%.*]]) {147; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X]], i1 true)148; CHECK-NEXT: [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 6, i32 64>)149; CHECK-NEXT: ret <2 x i32> [[RET1]]150;151 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)152 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 6, i32 64>)153 ret <2 x i32> %ret154}155 156define <2 x i32> @umin_cttz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(<2 x i32> %X) {157; CHECK-LABEL: define <2 x i32> @umin_cttz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(158; CHECK-SAME: <2 x i32> [[X:%.*]]) {159; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X]], i1 true)160; CHECK-NEXT: [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 32, i32 64>)161; CHECK-NEXT: ret <2 x i32> [[RET1]]162;163 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %X, i1 true)164 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %cttz, <2 x i32> <i32 32, i32 64>)165 ret <2 x i32> %ret166}167 168define i16 @umin_cttz_i16_negative_non_constant(i16 %X, i16 %Y) {169; CHECK-LABEL: define i16 @umin_cttz_i16_negative_non_constant(170; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]]) {171; CHECK-NEXT: [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.cttz.i16(i16 [[X]], i1 true)172; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.umin.i16(i16 [[CTTZ]], i16 [[Y]])173; CHECK-NEXT: ret i16 [[RET]]174;175 %cttz = call i16 @llvm.cttz.i16(i16 %X, i1 true)176 %ret = call i16 @llvm.umin.i16(i16 %cttz, i16 %Y)177 ret i16 %ret178}179 180define i16 @umin_cttz_i16_negative_two_uses(i16 %X) {181; CHECK-LABEL: define i16 @umin_cttz_i16_negative_two_uses(182; CHECK-SAME: i16 [[X:%.*]]) {183; CHECK-NEXT: [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.cttz.i16(i16 [[X]], i1 true)184; CHECK-NEXT: [[OP0:%.*]] = call i16 @llvm.umin.i16(i16 [[CTTZ]], i16 6)185; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i16 [[CTTZ]], [[OP0]]186; CHECK-NEXT: ret i16 [[RET]]187;188 %cttz = call i16 @llvm.cttz.i16(i16 %X, i1 true)189 %op0 = call i16 @llvm.umin.i16(i16 %cttz, i16 6)190 %ret = add i16 %cttz, %op0191 ret i16 %ret192}193 194define i8 @umin_ctlz_i8_zero_undefined(i8 %X) {195; CHECK-LABEL: define i8 @umin_ctlz_i8_zero_undefined(196; CHECK-SAME: i8 [[X:%.*]]) {197; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], 2198; CHECK-NEXT: [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.ctlz.i8(i8 [[TMP1]], i1 true)199; CHECK-NEXT: ret i8 [[RET]]200;201 %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 true)202 %ret = call i8 @llvm.umin.i8(i8 %ctlz, i8 6)203 ret i8 %ret204}205 206define i8 @umin_ctlz_i8_zero_defined(i8 %X) {207; CHECK-LABEL: define i8 @umin_ctlz_i8_zero_defined(208; CHECK-SAME: i8 [[X:%.*]]) {209; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], 2210; CHECK-NEXT: [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.ctlz.i8(i8 [[TMP1]], i1 true)211; CHECK-NEXT: ret i8 [[RET]]212;213 %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 false)214 %ret = call i8 @llvm.umin.i8(i8 %ctlz, i8 6)215 ret i8 %ret216}217 218define i8 @umin_ctlz_i8_commuted_zero_undefined(i8 %X) {219; CHECK-LABEL: define i8 @umin_ctlz_i8_commuted_zero_undefined(220; CHECK-SAME: i8 [[X:%.*]]) {221; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], 2222; CHECK-NEXT: [[RET:%.*]] = call range(i8 0, 7) i8 @llvm.ctlz.i8(i8 [[TMP1]], i1 true)223; CHECK-NEXT: ret i8 [[RET]]224;225 %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 true)226 %ret = call i8 @llvm.umin.i8(i8 6, i8 %ctlz)227 ret i8 %ret228}229 230define i8 @umin_ctlz_i8_negative_ge_bitwidth_zero_undefined(i8 %X) {231; CHECK-LABEL: define i8 @umin_ctlz_i8_negative_ge_bitwidth_zero_undefined(232; CHECK-SAME: i8 [[X:%.*]]) {233; CHECK-NEXT: [[CTLZ:%.*]] = call range(i8 0, 9) i8 @llvm.ctlz.i8(i8 [[X]], i1 true)234; CHECK-NEXT: ret i8 [[CTLZ]]235;236 %ctlz = call i8 @llvm.ctlz.i8(i8 %X, i1 true)237 %ret = call i8 @llvm.umin.i8(i8 %ctlz, i8 10)238 ret i8 %ret239}240 241define i16 @umin_ctlz_i16_zero_undefined(i16 %X) {242; CHECK-LABEL: define i16 @umin_ctlz_i16_zero_undefined(243; CHECK-SAME: i16 [[X:%.*]]) {244; CHECK-NEXT: [[TMP1:%.*]] = or i16 [[X]], 512245; CHECK-NEXT: [[RET:%.*]] = call range(i16 0, 7) i16 @llvm.ctlz.i16(i16 [[TMP1]], i1 true)246; CHECK-NEXT: ret i16 [[RET]]247;248 %ctlz = call i16 @llvm.ctlz.i16(i16 %X, i1 true)249 %ret = call i16 @llvm.umin.i16(i16 %ctlz, i16 6)250 ret i16 %ret251}252 253define i32 @umin_ctlz_i32_zero_undefined(i32 %X) {254; CHECK-LABEL: define i32 @umin_ctlz_i32_zero_undefined(255; CHECK-SAME: i32 [[X:%.*]]) {256; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[X]], 33554432257; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 7) i32 @llvm.ctlz.i32(i32 [[TMP1]], i1 true)258; CHECK-NEXT: ret i32 [[RET]]259;260 %ctlz = call i32 @llvm.ctlz.i32(i32 %X, i1 true)261 %ret = call i32 @llvm.umin.i32(i32 %ctlz, i32 6)262 ret i32 %ret263}264 265define i64 @umin_ctlz_i64_zero_undefined(i64 %X) {266; CHECK-LABEL: define i64 @umin_ctlz_i64_zero_undefined(267; CHECK-SAME: i64 [[X:%.*]]) {268; CHECK-NEXT: [[TMP1:%.*]] = or i64 [[X]], 144115188075855872269; CHECK-NEXT: [[RET:%.*]] = call range(i64 0, 7) i64 @llvm.ctlz.i64(i64 [[TMP1]], i1 true)270; CHECK-NEXT: ret i64 [[RET]]271;272 %ctlz = call i64 @llvm.ctlz.i64(i64 %X, i1 true)273 %ret = call i64 @llvm.umin.i64(i64 %ctlz, i64 6)274 ret i64 %ret275}276 277define i1 @umin_ctlz_i1_zero_undefined(i1 %X) {278; CHECK-LABEL: define i1 @umin_ctlz_i1_zero_undefined(279; CHECK-SAME: i1 [[X:%.*]]) {280; CHECK-NEXT: ret i1 false281;282 %ctlz = call i1 @llvm.ctlz.i1(i1 %X, i1 true)283 %ret = call i1 @llvm.umin.i1(i1 %ctlz, i1 1)284 ret i1 %ret285}286 287define i1 @umin_ctlz_i1_zero_defined(i1 %X) {288; CHECK-LABEL: define i1 @umin_ctlz_i1_zero_defined(289; CHECK-SAME: i1 [[X:%.*]]) {290; CHECK-NEXT: [[CTLZ:%.*]] = xor i1 [[X]], true291; CHECK-NEXT: ret i1 [[CTLZ]]292;293 %ctlz = call i1 @llvm.ctlz.i1(i1 %X, i1 false)294 %ret = call i1 @llvm.umin.i1(i1 %ctlz, i1 1)295 ret i1 %ret296}297 298define <2 x i32> @umin_ctlz_2xi32_splat_zero_undefined(<2 x i32> %X) {299; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_splat_zero_undefined(300; CHECK-SAME: <2 x i32> [[X:%.*]]) {301; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[X]], splat (i32 33554432)302; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[TMP1]], i1 true)303; CHECK-NEXT: ret <2 x i32> [[RET]]304;305 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)306 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 6>)307 ret <2 x i32> %ret308}309 310define <2 x i32> @umin_ctlz_2xi32_splat_poison_zero_undefined(<2 x i32> %X) {311; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_splat_poison_zero_undefined(312; CHECK-SAME: <2 x i32> [[X:%.*]]) {313; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 33554432, i32 poison>314; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 7) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[TMP1]], i1 true)315; CHECK-NEXT: ret <2 x i32> [[RET]]316;317 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)318 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 poison>)319 ret <2 x i32> %ret320}321 322define <2 x i32> @umin_ctlz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(<2 x i32> %X) {323; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_no_splat_all_lt_bitwidth_zero_undefined(324; CHECK-SAME: <2 x i32> [[X:%.*]]) {325; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[X]], <i32 33554432, i32 -2147483648>326; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[TMP1]], i1 true)327; CHECK-NEXT: ret <2 x i32> [[RET]]328;329 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)330 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 0>)331 ret <2 x i32> %ret332}333 334define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(<2 x i32> %X) {335; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_some_lt_bitwidth_zero_undefined(336; CHECK-SAME: <2 x i32> [[X:%.*]]) {337; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X]], i1 true)338; CHECK-NEXT: [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 6, i32 64>)339; CHECK-NEXT: ret <2 x i32> [[RET1]]340;341 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)342 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 6, i32 64>)343 ret <2 x i32> %ret344}345 346define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(<2 x i32> %X) {347; CHECK-LABEL: define <2 x i32> @umin_ctlz_2xi32_negative_no_splat_none_lt_bitwidth_zero_undefined(348; CHECK-SAME: <2 x i32> [[X:%.*]]) {349; CHECK-NEXT: [[RET:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X]], i1 true)350; CHECK-NEXT: [[RET1:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[RET]], <2 x i32> <i32 32, i32 64>)351; CHECK-NEXT: ret <2 x i32> [[RET1]]352;353 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %X, i1 true)354 %ret = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %ctlz, <2 x i32> <i32 32, i32 64>)355 ret <2 x i32> %ret356}357 358define i16 @umin_ctlz_i16_negative_non_constant(i16 %X, i16 %Y) {359; CHECK-LABEL: define i16 @umin_ctlz_i16_negative_non_constant(360; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]]) {361; CHECK-NEXT: [[CTLZ:%.*]] = call range(i16 0, 17) i16 @llvm.ctlz.i16(i16 [[X]], i1 true)362; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.umin.i16(i16 [[CTLZ]], i16 [[Y]])363; CHECK-NEXT: ret i16 [[RET]]364;365 %ctlz = call i16 @llvm.ctlz.i16(i16 %X, i1 true)366 %ret = call i16 @llvm.umin.i16(i16 %ctlz, i16 %Y)367 ret i16 %ret368}369 370define i16 @umin_ctlz_i16_negative_two_uses(i16 %X) {371; CHECK-LABEL: define i16 @umin_ctlz_i16_negative_two_uses(372; CHECK-SAME: i16 [[X:%.*]]) {373; CHECK-NEXT: [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.ctlz.i16(i16 [[X]], i1 true)374; CHECK-NEXT: [[OP0:%.*]] = call i16 @llvm.umin.i16(i16 [[CTTZ]], i16 6)375; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i16 [[CTTZ]], [[OP0]]376; CHECK-NEXT: ret i16 [[RET]]377;378 %ctlz = call i16 @llvm.ctlz.i16(i16 %X, i1 true)379 %op0 = call i16 @llvm.umin.i16(i16 %ctlz, i16 6)380 %ret = add i16 %ctlz, %op0381 ret i16 %ret382}383