1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 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]], 64 8; 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 %ret 14} 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]], 64 20; 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 %ret 26} 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]], 64 32; 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 %ret 38} 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 %ret 49} 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]], 64 55; 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 %ret 61} 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]], 64 67; 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 %ret 73} 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]], 64 79; 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 %ret 85} 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 false 91; 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 %ret 95} 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]], true 101; 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 %ret 106} 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> %ret 118} 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> %ret 130} 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> %ret 142} 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> %ret 154} 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> %ret 166} 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 %ret 178} 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, %op0 191 ret i16 %ret 192} 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]], 2 198; 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 %ret 204} 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]], 2 210; 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 %ret 216} 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]], 2 222; 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 %ret 228} 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 %ret 239} 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]], 512 245; 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 %ret 251} 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]], 33554432 257; 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 %ret 263} 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]], 144115188075855872 269; 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 %ret 275} 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 false 281; 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 %ret 285} 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]], true 291; 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 %ret 296} 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> %ret 308} 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> %ret 320} 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> %ret 332} 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> %ret 344} 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> %ret 356} 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 %ret 368} 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, %op0 381 ret i16 %ret 382} 383