1871 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4target datalayout = "n8:16:32:64"5 6declare void @use(i8)7declare void @use_vec(<2 x i8>)8 9define i32 @select_icmp_eq_and_1_0_or_2(i32 %x, i32 %y) {10; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2(11; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 112; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 213; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP1]]14; CHECK-NEXT: ret i32 [[SELECT]]15;16 %and = and i32 %x, 117 %cmp = icmp eq i32 %and, 018 %or = or i32 %y, 219 %select = select i1 %cmp, i32 %y, i32 %or20 ret i32 %select21}22 23define i32 @select_icmp_eq_and_1_0_or_2_disjoint(i32 %x, i32 %y) {24; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2_disjoint(25; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 126; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 227; CHECK-NEXT: [[SELECT:%.*]] = or disjoint i32 [[Y:%.*]], [[TMP1]]28; CHECK-NEXT: ret i32 [[SELECT]]29;30 %and = and i32 %x, 131 %cmp = icmp eq i32 %and, 032 %or = or disjoint i32 %y, 233 %select = select i1 %cmp, i32 %y, i32 %or34 ret i32 %select35}36 37define i32 @select_icmp_eq_and_1_0_add_2_nsw_nuw(i32 %x, i32 %y) {38; CHECK-LABEL: @select_icmp_eq_and_1_0_add_2_nsw_nuw(39; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 140; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 241; CHECK-NEXT: [[SELECT:%.*]] = add nuw nsw i32 [[Y:%.*]], [[TMP1]]42; CHECK-NEXT: ret i32 [[SELECT]]43;44 %and = and i32 %x, 145 %cmp = icmp eq i32 %and, 046 %or = add nsw nuw i32 %y, 247 %select = select i1 %cmp, i32 %y, i32 %or48 ret i32 %select49}50 51define <2 x i32> @select_icmp_eq_and_1_0_or_2_vec(<2 x i32> %x, <2 x i32> %y) {52; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2_vec(53; CHECK-NEXT: [[AND:%.*]] = shl <2 x i32> [[X:%.*]], splat (i32 1)54; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 2)55; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]56; CHECK-NEXT: ret <2 x i32> [[SELECT]]57;58 %and = and <2 x i32> %x, <i32 1, i32 1>59 %cmp = icmp eq <2 x i32> %and, zeroinitializer60 %or = or <2 x i32> %y, <i32 2, i32 2>61 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or62 ret <2 x i32> %select63}64 65define <2 x i32> @select_icmp_eq_and_1_0_or_2_vec_poison1(<2 x i32> %x, <2 x i32> %y) {66; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2_vec_poison1(67; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], <i32 1, i32 poison>68; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw <2 x i32> [[AND]], splat (i32 1)69; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]70; CHECK-NEXT: ret <2 x i32> [[SELECT]]71;72 %and = and <2 x i32> %x, <i32 1, i32 poison>73 %cmp = icmp eq <2 x i32> %and, zeroinitializer74 %or = or <2 x i32> %y, <i32 2, i32 2>75 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or76 ret <2 x i32> %select77}78 79define <2 x i32> @select_icmp_eq_and_1_0_or_2_vec_poison2(<2 x i32> %x, <2 x i32> %y) {80; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2_vec_poison2(81; CHECK-NEXT: [[AND:%.*]] = shl <2 x i32> [[X:%.*]], splat (i32 1)82; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 2)83; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]84; CHECK-NEXT: ret <2 x i32> [[SELECT]]85;86 %and = and <2 x i32> %x, <i32 1, i32 1>87 %cmp = icmp eq <2 x i32> %and, <i32 0, i32 poison>88 %or = or <2 x i32> %y, <i32 2, i32 2>89 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or90 ret <2 x i32> %select91}92 93define <2 x i32> @select_icmp_eq_and_1_0_or_2_vec_poison3(<2 x i32> %x, <2 x i32> %y) {94; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2_vec_poison3(95; CHECK-NEXT: [[AND:%.*]] = shl <2 x i32> [[X:%.*]], splat (i32 1)96; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 2)97; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]98; CHECK-NEXT: ret <2 x i32> [[SELECT]]99;100 %and = and <2 x i32> %x, <i32 1, i32 1>101 %cmp = icmp eq <2 x i32> %and, zeroinitializer102 %or = or <2 x i32> %y, <i32 2, i32 poison>103 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or104 ret <2 x i32> %select105}106 107define i32 @select_icmp_eq_and_1_0_xor_2(i32 %x, i32 %y) {108; CHECK-LABEL: @select_icmp_eq_and_1_0_xor_2(109; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1110; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2111; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[TMP1]]112; CHECK-NEXT: ret i32 [[SELECT]]113;114 %and = and i32 %x, 1115 %cmp = icmp eq i32 %and, 0116 %xor = xor i32 %y, 2117 %select = select i1 %cmp, i32 %y, i32 %xor118 ret i32 %select119}120 121define i32 @select_icmp_eq_and_1_0_and_not_2(i32 %x, i32 %y) {122; CHECK-LABEL: @select_icmp_eq_and_1_0_and_not_2(123; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1124; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0125; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3126; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]127; CHECK-NEXT: ret i32 [[SELECT]]128;129 %and = and i32 %x, 1130 %cmp = icmp eq i32 %and, 0131 %and2 = and i32 %y, -3132 %select = select i1 %cmp, i32 %y, i32 %and2133 ret i32 %select134}135 136define i32 @select_icmp_eq_and_32_0_or_8(i32 %x, i32 %y) {137; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8(138; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 2139; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 8140; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP1]]141; CHECK-NEXT: ret i32 [[SELECT]]142;143 %and = and i32 %x, 32144 %cmp = icmp eq i32 %and, 0145 %or = or i32 %y, 8146 %select = select i1 %cmp, i32 %y, i32 %or147 ret i32 %select148}149 150define <2 x i32> @select_icmp_eq_and_32_0_or_8_vec(<2 x i32> %x, <2 x i32> %y) {151; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8_vec(152; CHECK-NEXT: [[AND:%.*]] = lshr <2 x i32> [[X:%.*]], splat (i32 2)153; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 8)154; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]155; CHECK-NEXT: ret <2 x i32> [[SELECT]]156;157 %and = and <2 x i32> %x, <i32 32, i32 32>158 %cmp = icmp eq <2 x i32> %and, zeroinitializer159 %or = or <2 x i32> %y, <i32 8, i32 8>160 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or161 ret <2 x i32> %select162}163 164define i32 @select_icmp_eq_and_32_0_xor_8(i32 %x, i32 %y) {165; CHECK-LABEL: @select_icmp_eq_and_32_0_xor_8(166; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 2167; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 8168; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[TMP1]]169; CHECK-NEXT: ret i32 [[SELECT]]170;171 %and = and i32 %x, 32172 %cmp = icmp eq i32 %and, 0173 %xor = xor i32 %y, 8174 %select = select i1 %cmp, i32 %y, i32 %xor175 ret i32 %select176}177 178define i32 @select_icmp_eq_and_32_0_and_not_8(i32 %x, i32 %y) {179; CHECK-LABEL: @select_icmp_eq_and_32_0_and_not_8(180; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32181; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0182; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -9183; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]184; CHECK-NEXT: ret i32 [[SELECT]]185;186 %and = and i32 %x, 32187 %cmp = icmp eq i32 %and, 0188 %and2 = and i32 %y, -9189 %select = select i1 %cmp, i32 %y, i32 %and2190 ret i32 %select191}192 193define i32 @select_icmp_ne_0_and_4096_or_4096(i32 %x, i32 %y) {194; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096(195; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096196; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 4096197; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP1]]198; CHECK-NEXT: ret i32 [[SELECT]]199;200 %and = and i32 %x, 4096201 %cmp = icmp ne i32 0, %and202 %or = or i32 %y, 4096203 %select = select i1 %cmp, i32 %y, i32 %or204 ret i32 %select205}206 207define <2 x i32> @select_icmp_ne_0_and_4096_or_4096_vec(<2 x i32> %x, <2 x i32> %y) {208; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096_vec(209; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 4096)210; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[AND]], splat (i32 4096)211; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]212; CHECK-NEXT: ret <2 x i32> [[SELECT]]213;214 %and = and <2 x i32> %x, <i32 4096, i32 4096>215 %cmp = icmp ne <2 x i32> zeroinitializer, %and216 %or = or <2 x i32> %y, <i32 4096, i32 4096>217 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or218 ret <2 x i32> %select219}220 221define i32 @select_icmp_ne_0_and_4096_xor_4096(i32 %x, i32 %y) {222; CHECK-LABEL: @select_icmp_ne_0_and_4096_xor_4096(223; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096224; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], [[Y:%.*]]225; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], 4096226; CHECK-NEXT: ret i32 [[SELECT]]227;228 %and = and i32 %x, 4096229 %cmp = icmp ne i32 0, %and230 %xor = xor i32 %y, 4096231 %select = select i1 %cmp, i32 %y, i32 %xor232 ret i32 %select233}234 235define i32 @select_icmp_ne_0_and_4096_and_not_4096(i32 %x, i32 %y) {236; CHECK-LABEL: @select_icmp_ne_0_and_4096_and_not_4096(237; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096238; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0239; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097240; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]241; CHECK-NEXT: ret i32 [[SELECT]]242;243 %and = and i32 %x, 4096244 %cmp = icmp ne i32 0, %and245 %and2 = and i32 %y, -4097246 %select = select i1 %cmp, i32 %y, i32 %and2247 ret i32 %select248}249 250define i32 @select_icmp_eq_and_4096_0_or_4096(i32 %x, i32 %y) {251; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096(252; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096253; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[AND]]254; CHECK-NEXT: ret i32 [[SELECT]]255;256 %and = and i32 %x, 4096257 %cmp = icmp eq i32 %and, 0258 %or = or i32 %y, 4096259 %select = select i1 %cmp, i32 %y, i32 %or260 ret i32 %select261}262 263define <2 x i32> @select_icmp_eq_and_4096_0_or_4096_vec(<2 x i32> %x, <2 x i32> %y) {264; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096_vec(265; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 4096)266; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[AND]]267; CHECK-NEXT: ret <2 x i32> [[SELECT]]268;269 %and = and <2 x i32> %x, <i32 4096, i32 4096>270 %cmp = icmp eq <2 x i32> %and, zeroinitializer271 %or = or <2 x i32> %y, <i32 4096, i32 4096>272 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or273 ret <2 x i32> %select274}275 276define i32 @select_icmp_eq_and_4096_0_xor_4096(i32 %x, i32 %y) {277; CHECK-LABEL: @select_icmp_eq_and_4096_0_xor_4096(278; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096279; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[AND]]280; CHECK-NEXT: ret i32 [[SELECT]]281;282 %and = and i32 %x, 4096283 %cmp = icmp eq i32 %and, 0284 %xor = xor i32 %y, 4096285 %select = select i1 %cmp, i32 %y, i32 %xor286 ret i32 %select287}288 289define i32 @select_icmp_eq_and_4096_0_and_not_4096(i32 %x, i32 %y) {290; CHECK-LABEL: @select_icmp_eq_and_4096_0_and_not_4096(291; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096292; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0293; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097294; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]295; CHECK-NEXT: ret i32 [[SELECT]]296;297 %and = and i32 %x, 4096298 %cmp = icmp eq i32 %and, 0299 %and2 = and i32 %y, -4097300 %select = select i1 %cmp, i32 %y, i32 %and2301 ret i32 %select302}303 304define i32 @select_icmp_eq_0_and_1_or_1(i64 %x, i32 %y) {305; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1(306; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i32307; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 1308; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP2]]309; CHECK-NEXT: ret i32 [[SELECT]]310;311 %and = and i64 %x, 1312 %cmp = icmp eq i64 %and, 0313 %or = or i32 %y, 1314 %select = select i1 %cmp, i32 %y, i32 %or315 ret i32 %select316}317 318define <2 x i32> @select_icmp_eq_0_and_1_or_1_vec(<2 x i64> %x, <2 x i32> %y) {319; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1_vec(320; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i64> [[X:%.*]] to <2 x i32>321; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], splat (i32 1)322; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP2]]323; CHECK-NEXT: ret <2 x i32> [[SELECT]]324;325 %and = and <2 x i64> %x, <i64 1, i64 1>326 %cmp = icmp eq <2 x i64> %and, zeroinitializer327 %or = or <2 x i32> %y, <i32 1, i32 1>328 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or329 ret <2 x i32> %select330}331 332define i32 @select_icmp_eq_0_and_1_xor_1(i64 %x, i32 %y) {333; CHECK-LABEL: @select_icmp_eq_0_and_1_xor_1(334; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i32335; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 1336; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[TMP2]]337; CHECK-NEXT: ret i32 [[SELECT]]338;339 %and = and i64 %x, 1340 %cmp = icmp eq i64 %and, 0341 %xor = xor i32 %y, 1342 %select = select i1 %cmp, i32 %y, i32 %xor343 ret i32 %select344}345 346define i32 @select_icmp_eq_0_and_1_and_not_1(i64 %x, i32 %y) {347; CHECK-LABEL: @select_icmp_eq_0_and_1_and_not_1(348; CHECK-NEXT: [[AND:%.*]] = and i64 [[X:%.*]], 1349; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[AND]], 0350; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -2351; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]352; CHECK-NEXT: ret i32 [[SELECT]]353;354 %and = and i64 %x, 1355 %cmp = icmp eq i64 %and, 0356 %and2 = and i32 %y, -2357 %select = select i1 %cmp, i32 %y, i32 %and2358 ret i32 %select359}360 361define i32 @select_icmp_ne_0_and_4096_or_32(i32 %x, i32 %y) {362; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_32(363; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 7364; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 32365; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 32366; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP2]]367; CHECK-NEXT: ret i32 [[SELECT]]368;369 %and = and i32 %x, 4096370 %cmp = icmp ne i32 0, %and371 %or = or i32 %y, 32372 %select = select i1 %cmp, i32 %y, i32 %or373 ret i32 %select374}375 376define i32 @select_icmp_ne_0_and_4096_xor_32(i32 %x, i32 %y) {377; CHECK-LABEL: @select_icmp_ne_0_and_4096_xor_32(378; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 7379; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 32380; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[Y:%.*]]381; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2]], 32382; CHECK-NEXT: ret i32 [[SELECT]]383;384 %and = and i32 %x, 4096385 %cmp = icmp ne i32 0, %and386 %xor = xor i32 %y, 32387 %select = select i1 %cmp, i32 %y, i32 %xor388 ret i32 %select389}390 391define i32 @select_icmp_ne_0_and_4096_and_not_32(i32 %x, i32 %y) {392; CHECK-LABEL: @select_icmp_ne_0_and_4096_and_not_32(393; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096394; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0395; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -33396; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]397; CHECK-NEXT: ret i32 [[SELECT]]398;399 %and = and i32 %x, 4096400 %cmp = icmp ne i32 0, %and401 %and2 = and i32 %y, -33402 %select = select i1 %cmp, i32 %y, i32 %and2403 ret i32 %select404}405 406define i32 @select_icmp_ne_0_and_32_or_4096(i32 %x, i32 %y) {407; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096(408; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 7409; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 4096410; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 4096411; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP2]]412; CHECK-NEXT: ret i32 [[SELECT]]413;414 %and = and i32 %x, 32415 %cmp = icmp ne i32 0, %and416 %or = or i32 %y, 4096417 %select = select i1 %cmp, i32 %y, i32 %or418 ret i32 %select419}420 421define <2 x i32> @select_icmp_ne_0_and_32_or_4096_vec(<2 x i32> %x, <2 x i32> %y) {422; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096_vec(423; CHECK-NEXT: [[AND:%.*]] = shl <2 x i32> [[X:%.*]], splat (i32 7)424; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 4096)425; CHECK-NEXT: [[TMP2:%.*]] = xor <2 x i32> [[TMP1]], splat (i32 4096)426; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP2]]427; CHECK-NEXT: ret <2 x i32> [[SELECT]]428;429 %and = and <2 x i32> %x, <i32 32, i32 32>430 %cmp = icmp ne <2 x i32> zeroinitializer, %and431 %or = or <2 x i32> %y, <i32 4096, i32 4096>432 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or433 ret <2 x i32> %select434}435 436define i32 @select_icmp_ne_0_and_32_xor_4096(i32 %x, i32 %y) {437; CHECK-LABEL: @select_icmp_ne_0_and_32_xor_4096(438; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 7439; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 4096440; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[Y:%.*]]441; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2]], 4096442; CHECK-NEXT: ret i32 [[SELECT]]443;444 %and = and i32 %x, 32445 %cmp = icmp ne i32 0, %and446 %xor = xor i32 %y, 4096447 %select = select i1 %cmp, i32 %y, i32 %xor448 ret i32 %select449}450 451define i32 @select_icmp_ne_0_and_32_and_not_4096(i32 %x, i32 %y) {452; CHECK-LABEL: @select_icmp_ne_0_and_32_and_not_4096(453; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32454; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0455; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097456; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]457; CHECK-NEXT: ret i32 [[SELECT]]458;459 %and = and i32 %x, 32460 %cmp = icmp ne i32 0, %and461 %and2 = and i32 %y, -4097462 %select = select i1 %cmp, i32 %y, i32 %and2463 ret i32 %select464}465 466define i8 @select_icmp_ne_0_and_1073741824_or_8(i32 %x, i8 %y) {467; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_or_8(468; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1073741824469; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0470; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 8471; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i8 [[OR]], i8 [[Y]]472; CHECK-NEXT: ret i8 [[SELECT]]473;474 %and = and i32 %x, 1073741824475 %cmp = icmp ne i32 0, %and476 %or = or i8 %y, 8477 %select = select i1 %cmp, i8 %y, i8 %or478 ret i8 %select479}480 481define i8 @select_icmp_ne_0_and_1073741824_xor_8(i32 %x, i8 %y) {482; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_xor_8(483; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1073741824484; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0485; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[Y:%.*]], 8486; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i8 [[XOR]], i8 [[Y]]487; CHECK-NEXT: ret i8 [[SELECT]]488;489 %and = and i32 %x, 1073741824490 %cmp = icmp ne i32 0, %and491 %xor = xor i8 %y, 8492 %select = select i1 %cmp, i8 %y, i8 %xor493 ret i8 %select494}495 496define i8 @select_icmp_ne_0_and_1073741824_and_not_8(i32 %x, i8 %y) {497; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_and_not_8(498; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1073741824499; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0500; CHECK-NEXT: [[AND2:%.*]] = and i8 [[Y:%.*]], -9501; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i8 [[AND2]], i8 [[Y]]502; CHECK-NEXT: ret i8 [[SELECT]]503;504 %and = and i32 %x, 1073741824505 %cmp = icmp ne i32 0, %and506 %and2 = and i8 %y, -9507 %select = select i1 %cmp, i8 %y, i8 %and2508 ret i8 %select509}510 511define i32 @select_icmp_ne_0_and_8_or_1073741824(i8 %x, i32 %y) {512; CHECK-LABEL: @select_icmp_ne_0_and_8_or_1073741824(513; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 8514; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[AND]], 0515; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 1073741824516; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[OR]], i32 [[Y]]517; CHECK-NEXT: ret i32 [[SELECT]]518;519 %and = and i8 %x, 8520 %cmp = icmp ne i8 0, %and521 %or = or i32 %y, 1073741824522 %select = select i1 %cmp, i32 %y, i32 %or523 ret i32 %select524}525 526define i32 @select_icmp_ne_0_and_8_xor_1073741824(i8 %x, i32 %y) {527; CHECK-LABEL: @select_icmp_ne_0_and_8_xor_1073741824(528; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 8529; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[AND]], 0530; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 1073741824531; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]532; CHECK-NEXT: ret i32 [[SELECT]]533;534 %and = and i8 %x, 8535 %cmp = icmp ne i8 0, %and536 %xor = xor i32 %y, 1073741824537 %select = select i1 %cmp, i32 %y, i32 %xor538 ret i32 %select539}540 541define i32 @select_icmp_ne_0_and_8_and_not_1073741824(i8 %x, i32 %y) {542; CHECK-LABEL: @select_icmp_ne_0_and_8_and_not_1073741824(543; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 8544; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[AND]], 0545; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -1073741825546; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]547; CHECK-NEXT: ret i32 [[SELECT]]548;549 %and = and i8 %x, 8550 %cmp = icmp ne i8 0, %and551 %and2 = and i32 %y, -1073741825552 %select = select i1 %cmp, i32 %y, i32 %and2553 ret i32 %select554}555 556; We can't combine here, because the cmp is scalar and the or vector.557; Just make sure we don't assert.558define <2 x i32> @select_icmp_eq_and_1_0_or_vector_of_2s(i32 %x, <2 x i32> %y) {559; CHECK-LABEL: @select_icmp_eq_and_1_0_or_vector_of_2s(560; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1561; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0562; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[Y:%.*]], splat (i32 2)563; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x i32> [[Y]], <2 x i32> [[OR]]564; CHECK-NEXT: ret <2 x i32> [[SELECT]]565;566 %and = and i32 %x, 1567 %cmp = icmp eq i32 %and, 0568 %or = or <2 x i32> %y, <i32 2, i32 2>569 %select = select i1 %cmp, <2 x i32> %y, <2 x i32> %or570 ret <2 x i32> %select571}572 573define i32 @select_icmp_and_8_ne_0_xor_8(i32 %x) {574; CHECK-LABEL: @select_icmp_and_8_ne_0_xor_8(575; CHECK-NEXT: [[X_XOR:%.*]] = and i32 [[X:%.*]], -9576; CHECK-NEXT: ret i32 [[X_XOR]]577;578 %and = and i32 %x, 8579 %cmp = icmp eq i32 %and, 0580 %xor = xor i32 %x, 8581 %x.xor = select i1 %cmp, i32 %x, i32 %xor582 ret i32 %x.xor583}584 585define i32 @select_icmp_and_8_eq_0_xor_8(i32 %x) {586; CHECK-LABEL: @select_icmp_and_8_eq_0_xor_8(587; CHECK-NEXT: [[XOR_X:%.*]] = or i32 [[X:%.*]], 8588; CHECK-NEXT: ret i32 [[XOR_X]]589;590 %and = and i32 %x, 8591 %cmp = icmp eq i32 %and, 0592 %xor = xor i32 %x, 8593 %xor.x = select i1 %cmp, i32 %xor, i32 %x594 ret i32 %xor.x595}596 597define i64 @select_icmp_x_and_8_eq_0_y_xor_8(i32 %x, i64 %y) {598; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_xor_8(599; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8600; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i32 [[AND]] to i64601; CHECK-NEXT: [[Y_XOR:%.*]] = xor i64 [[Y:%.*]], [[TMP1]]602; CHECK-NEXT: ret i64 [[Y_XOR]]603;604 %and = and i32 %x, 8605 %cmp = icmp eq i32 %and, 0606 %xor = xor i64 %y, 8607 %y.xor = select i1 %cmp, i64 %y, i64 %xor608 ret i64 %y.xor609}610 611define i64 @select_icmp_x_and_8_ne_0_y_xor_8(i32 %x, i64 %y) {612; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_xor_8(613; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8614; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 8615; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64616; CHECK-NEXT: [[XOR_Y:%.*]] = xor i64 [[Y:%.*]], [[TMP2]]617; CHECK-NEXT: ret i64 [[XOR_Y]]618;619 %and = and i32 %x, 8620 %cmp = icmp eq i32 %and, 0621 %xor = xor i64 %y, 8622 %xor.y = select i1 %cmp, i64 %xor, i64 %y623 ret i64 %xor.y624}625 626define i64 @select_icmp_x_and_8_ne_0_y_or_8(i32 %x, i64 %y) {627; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8(628; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8629; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 8630; CHECK-NEXT: [[TMP2:%.*]] = zext nneg i32 [[TMP1]] to i64631; CHECK-NEXT: [[OR_Y:%.*]] = or i64 [[Y:%.*]], [[TMP2]]632; CHECK-NEXT: ret i64 [[OR_Y]]633;634 %and = and i32 %x, 8635 %cmp = icmp eq i32 %and, 0636 %or = or i64 %y, 8637 %or.y = select i1 %cmp, i64 %or, i64 %y638 ret i64 %or.y639}640 641define <2 x i64> @select_icmp_x_and_8_ne_0_y_or_8_vec(<2 x i32> %x, <2 x i64> %y) {642; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8_vec(643; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 8)644; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[AND]], splat (i32 8)645; CHECK-NEXT: [[TMP2:%.*]] = zext nneg <2 x i32> [[TMP1]] to <2 x i64>646; CHECK-NEXT: [[OR_Y:%.*]] = or <2 x i64> [[Y:%.*]], [[TMP2]]647; CHECK-NEXT: ret <2 x i64> [[OR_Y]]648;649 %and = and <2 x i32> %x, <i32 8, i32 8>650 %cmp = icmp eq <2 x i32> %and, zeroinitializer651 %or = or <2 x i64> %y, <i64 8, i64 8>652 %or.y = select <2 x i1> %cmp, <2 x i64> %or, <2 x i64> %y653 ret <2 x i64> %or.y654}655 656define i64 @select_icmp_x_and_8_ne_0_y_and_not_8(i32 %x, i64 %y) {657; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_and_not_8(658; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8659; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0660; CHECK-NEXT: [[AND2:%.*]] = and i64 [[Y:%.*]], -9661; CHECK-NEXT: [[AND_Y:%.*]] = select i1 [[CMP]], i64 [[AND2]], i64 [[Y]]662; CHECK-NEXT: ret i64 [[AND_Y]]663;664 %and = and i32 %x, 8665 %cmp = icmp eq i32 %and, 0666 %and2 = and i64 %y, -9667 %and.y = select i1 %cmp, i64 %and2, i64 %y668 ret i64 %and.y669}670 671define i32 @select_icmp_and_2147483648_ne_0_xor_2147483648(i32 %x) {672; CHECK-LABEL: @select_icmp_and_2147483648_ne_0_xor_2147483648(673; CHECK-NEXT: [[X_XOR:%.*]] = and i32 [[X:%.*]], 2147483647674; CHECK-NEXT: ret i32 [[X_XOR]]675;676 %and = and i32 %x, 2147483648677 %cmp = icmp eq i32 %and, 0678 %xor = xor i32 %x, 2147483648679 %x.xor = select i1 %cmp, i32 %x, i32 %xor680 ret i32 %x.xor681}682 683define i32 @select_icmp_and_2147483648_eq_0_xor_2147483648(i32 %x) {684; CHECK-LABEL: @select_icmp_and_2147483648_eq_0_xor_2147483648(685; CHECK-NEXT: [[XOR_X:%.*]] = or i32 [[X:%.*]], -2147483648686; CHECK-NEXT: ret i32 [[XOR_X]]687;688 %and = and i32 %x, 2147483648689 %cmp = icmp eq i32 %and, 0690 %xor = xor i32 %x, 2147483648691 %xor.x = select i1 %cmp, i32 %xor, i32 %x692 ret i32 %xor.x693}694 695define i32 @select_icmp_x_and_2147483648_ne_0_or_2147483648(i32 %x) {696; CHECK-LABEL: @select_icmp_x_and_2147483648_ne_0_or_2147483648(697; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], -2147483648698; CHECK-NEXT: ret i32 [[OR]]699;700 %and = and i32 %x, 2147483648701 %cmp = icmp eq i32 %and, 0702 %or = or i32 %x, 2147483648703 %or.x = select i1 %cmp, i32 %or, i32 %x704 ret i32 %or.x705}706 707define i32 @test68(i32 %x, i32 %y) {708; CHECK-LABEL: @test68(709; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 6710; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2711; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP1]]712; CHECK-NEXT: ret i32 [[SELECT]]713;714 %and = and i32 %x, 128715 %cmp = icmp eq i32 %and, 0716 %or = or i32 %y, 2717 %select = select i1 %cmp, i32 %y, i32 %or718 ret i32 %select719}720 721define <2 x i32> @test68vec(<2 x i32> %x, <2 x i32> %y) {722; CHECK-LABEL: @test68vec(723; CHECK-NEXT: [[AND:%.*]] = lshr <2 x i32> [[X:%.*]], splat (i32 6)724; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 2)725; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP1]]726; CHECK-NEXT: ret <2 x i32> [[SELECT]]727;728 %and = and <2 x i32> %x, <i32 128, i32 128>729 %cmp = icmp eq <2 x i32> %and, zeroinitializer730 %or = or <2 x i32> %y, <i32 2, i32 2>731 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or732 ret <2 x i32> %select733}734 735define i32 @test68_xor(i32 %x, i32 %y) {736; CHECK-LABEL: @test68_xor(737; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 6738; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2739; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[TMP1]]740; CHECK-NEXT: ret i32 [[SELECT]]741;742 %and = and i32 %x, 128743 %cmp = icmp eq i32 %and, 0744 %xor = xor i32 %y, 2745 %select = select i1 %cmp, i32 %y, i32 %xor746 ret i32 %select747}748 749define i32 @test68_and(i32 %x, i32 %y) {750; CHECK-LABEL: @test68_and(751; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 128752; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0753; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3754; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]755; CHECK-NEXT: ret i32 [[SELECT]]756;757 %and = and i32 %x, 128758 %cmp = icmp eq i32 %and, 0759 %and2 = and i32 %y, -3760 %select = select i1 %cmp, i32 %y, i32 %and2761 ret i32 %select762}763 764define i32 @test69(i32 %x, i32 %y) {765; CHECK-LABEL: @test69(766; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 6767; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2768; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 2769; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP2]]770; CHECK-NEXT: ret i32 [[SELECT]]771;772 %and = and i32 %x, 128773 %cmp = icmp ne i32 %and, 0774 %or = or i32 %y, 2775 %select = select i1 %cmp, i32 %y, i32 %or776 ret i32 %select777}778 779define <2 x i32> @test69vec(<2 x i32> %x, <2 x i32> %y) {780; CHECK-LABEL: @test69vec(781; CHECK-NEXT: [[AND:%.*]] = lshr <2 x i32> [[X:%.*]], splat (i32 6)782; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], splat (i32 2)783; CHECK-NEXT: [[TMP2:%.*]] = xor <2 x i32> [[TMP1]], splat (i32 2)784; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i32> [[Y:%.*]], [[TMP2]]785; CHECK-NEXT: ret <2 x i32> [[SELECT]]786;787 %and = and <2 x i32> %x, <i32 128, i32 128>788 %cmp = icmp ne <2 x i32> %and, zeroinitializer789 %or = or <2 x i32> %y, <i32 2, i32 2>790 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or791 ret <2 x i32> %select792}793 794define i32 @test69_xor(i32 %x, i32 %y) {795; CHECK-LABEL: @test69_xor(796; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 6797; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2798; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[Y:%.*]]799; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2]], 2800; CHECK-NEXT: ret i32 [[SELECT]]801;802 %and = and i32 %x, 128803 %cmp = icmp ne i32 %and, 0804 %xor = xor i32 %y, 2805 %select = select i1 %cmp, i32 %y, i32 %xor806 ret i32 %select807}808 809define i32 @test69_and(i32 %x, i32 %y) {810; CHECK-LABEL: @test69_and(811; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 128812; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0813; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], 2814; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]815; CHECK-NEXT: ret i32 [[SELECT]]816;817 %and = and i32 %x, 128818 %cmp = icmp ne i32 %and, 0819 %and2 = and i32 %y, 2820 %select = select i1 %cmp, i32 %y, i32 %and2821 ret i32 %select822}823 824define i8 @test70(i8 %x, i8 %y) {825; CHECK-LABEL: @test70(826; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[X:%.*]], 6827; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], 2828; CHECK-NEXT: [[SELECT:%.*]] = or i8 [[Y:%.*]], [[TMP2]]829; CHECK-NEXT: ret i8 [[SELECT]]830;831 %cmp = icmp slt i8 %x, 0832 %or = or i8 %y, 2833 %select = select i1 %cmp, i8 %or, i8 %y834 ret i8 %select835}836 837define i8 @test70_multiuse(i8 %x, i8 %y) {838; CHECK-LABEL: @test70_multiuse(839; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0840; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 2841; CHECK-NEXT: call void @use(i8 [[OR]])842; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i8 [[OR]], i8 [[Y]]843; CHECK-NEXT: ret i8 [[SELECT]]844;845 %cmp = icmp slt i8 %x, 0846 %or = or i8 %y, 2847 call void @use(i8 %or)848 %select = select i1 %cmp, i8 %or, i8 %y849 ret i8 %select850}851 852define i32 @shift_no_xor_multiuse_or(i32 %x, i32 %y) {853; CHECK-LABEL: @shift_no_xor_multiuse_or(854; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 2855; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1856; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2857; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y]], [[TMP1]]858; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[OR]]859; CHECK-NEXT: ret i32 [[RES]]860;861 %and = and i32 %x, 1862 %cmp = icmp eq i32 %and, 0863 %or = or i32 %y, 2864 %select = select i1 %cmp, i32 %y, i32 %or865 %res = mul i32 %select, %or ; to bump up use count of the Or866 ret i32 %res867}868 869define i32 @shift_no_xor_multiuse_xor(i32 %x, i32 %y) {870; CHECK-LABEL: @shift_no_xor_multiuse_xor(871; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2872; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1873; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2874; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y]], [[TMP1]]875; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]876; CHECK-NEXT: ret i32 [[RES]]877;878 %and = and i32 %x, 1879 %cmp = icmp eq i32 %and, 0880 %xor = xor i32 %y, 2881 %select = select i1 %cmp, i32 %y, i32 %xor882 %res = mul i32 %select, %xor ; to bump up use count of the Xor883 ret i32 %res884}885 886define i32 @shift_no_xor_multiuse_and(i32 %x, i32 %y) {887; CHECK-LABEL: @shift_no_xor_multiuse_and(888; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1889; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0890; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3891; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]892; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]]893; CHECK-NEXT: ret i32 [[RES]]894;895 %and = and i32 %x, 1896 %cmp = icmp eq i32 %and, 0897 %and2 = and i32 %y, -3898 %select = select i1 %cmp, i32 %y, i32 %and2899 %res = mul i32 %select, %and2 ; to bump up use count of the And900 ret i32 %res901}902 903define i32 @no_shift_no_xor_multiuse_or(i32 %x, i32 %y) {904; CHECK-LABEL: @no_shift_no_xor_multiuse_or(905; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096906; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 4096907; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y]], [[AND]]908; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[OR]]909; CHECK-NEXT: ret i32 [[RES]]910;911 %and = and i32 %x, 4096912 %cmp = icmp eq i32 %and, 0913 %or = or i32 %y, 4096914 %select = select i1 %cmp, i32 %y, i32 %or915 %res = mul i32 %select, %or ; to bump up use count of the Or916 ret i32 %res917}918 919define i32 @no_shift_no_xor_multiuse_xor(i32 %x, i32 %y) {920; CHECK-LABEL: @no_shift_no_xor_multiuse_xor(921; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096922; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096923; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y]], [[AND]]924; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]925; CHECK-NEXT: ret i32 [[RES]]926;927 %and = and i32 %x, 4096928 %cmp = icmp eq i32 %and, 0929 %xor = xor i32 %y, 4096930 %select = select i1 %cmp, i32 %y, i32 %xor931 %res = mul i32 %select, %xor ; to bump up use count of the Xor932 ret i32 %res933}934 935define i32 @no_shift_no_xor_multiuse_and(i32 %x, i32 %y) {936; CHECK-LABEL: @no_shift_no_xor_multiuse_and(937; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096938; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0939; CHECK-NEXT: [[AND2:%.*]] = add i32 [[Y:%.*]], -4097940; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]941; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]]942; CHECK-NEXT: ret i32 [[RES]]943;944 %and = and i32 %x, 4096945 %cmp = icmp eq i32 %and, 0946 %and2 = add i32 %y, -4097947 %select = select i1 %cmp, i32 %y, i32 %and2948 %res = mul i32 %select, %and2 ; to bump up use count of the And949 ret i32 %res950}951 952define i32 @no_shift_xor_multiuse_or(i32 %x, i32 %y) {953; CHECK-LABEL: @no_shift_xor_multiuse_or(954; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096955; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 4096956; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 4096957; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y]], [[TMP1]]958; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[OR]]959; CHECK-NEXT: ret i32 [[RES]]960;961 %and = and i32 %x, 4096962 %cmp = icmp ne i32 0, %and963 %or = or i32 %y, 4096964 %select = select i1 %cmp, i32 %y, i32 %or965 %res = mul i32 %select, %or ; to bump up use count of the Or966 ret i32 %res967}968 969define i32 @no_shift_xor_multiuse_xor(i32 %x, i32 %y) {970; CHECK-LABEL: @no_shift_xor_multiuse_xor(971; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096972; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096973; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], [[Y]]974; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], 4096975; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]976; CHECK-NEXT: ret i32 [[RES]]977;978 %and = and i32 %x, 4096979 %cmp = icmp ne i32 0, %and980 %xor = xor i32 %y, 4096981 %select = select i1 %cmp, i32 %y, i32 %xor982 %res = mul i32 %select, %xor ; to bump up use count of the Xor983 ret i32 %res984}985 986define i32 @no_shift_xor_multiuse_and(i32 %x, i32 %y) {987; CHECK-LABEL: @no_shift_xor_multiuse_and(988; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096989; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0990; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097991; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]992; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]]993; CHECK-NEXT: ret i32 [[RES]]994;995 %and = and i32 %x, 4096996 %cmp = icmp ne i32 0, %and997 %and2 = and i32 %y, -4097998 %select = select i1 %cmp, i32 %y, i32 %and2999 %res = mul i32 %select, %and2 ; to bump up use count of the And1000 ret i32 %res1001}1002 1003define i32 @shift_xor_multiuse_or(i32 %x, i32 %y) {1004; CHECK-LABEL: @shift_xor_multiuse_or(1005; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961006; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01007; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 20481008; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[OR]], i32 [[Y]]1009; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[OR]]1010; CHECK-NEXT: ret i32 [[RES]]1011;1012 %and = and i32 %x, 40961013 %cmp = icmp ne i32 0, %and1014 %or = or i32 %y, 20481015 %select = select i1 %cmp, i32 %y, i32 %or1016 %res = mul i32 %select, %or ; to bump up use count of the Or1017 ret i32 %res1018}1019 1020define i32 @shift_xor_multiuse_xor(i32 %x, i32 %y) {1021; CHECK-LABEL: @shift_xor_multiuse_xor(1022; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961023; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01024; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 20481025; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]1026; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]1027; CHECK-NEXT: ret i32 [[RES]]1028;1029 %and = and i32 %x, 40961030 %cmp = icmp ne i32 0, %and1031 %xor = xor i32 %y, 20481032 %select = select i1 %cmp, i32 %y, i32 %xor1033 %res = mul i32 %select, %xor ; to bump up use count of the Xor1034 ret i32 %res1035}1036 1037define i32 @shift_xor_multiuse_and(i32 %x, i32 %y) {1038; CHECK-LABEL: @shift_xor_multiuse_and(1039; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961040; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01041; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -20491042; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]1043; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]]1044; CHECK-NEXT: ret i32 [[RES]]1045;1046 %and = and i32 %x, 40961047 %cmp = icmp ne i32 0, %and1048 %and2 = and i32 %y, -20491049 %select = select i1 %cmp, i32 %y, i32 %and21050 %res = mul i32 %select, %and2 ; to bump up use count of the and1051 ret i32 %res1052}1053 1054define i32 @shift_no_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) {1055; CHECK-LABEL: @shift_no_xor_multiuse_cmp(1056; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11057; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01058; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i32 [[AND]], 11059; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP1]]1060; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1061; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1062; CHECK-NEXT: ret i32 [[RES]]1063;1064 %and = and i32 %x, 11065 %cmp = icmp eq i32 %and, 01066 %or = or i32 %y, 21067 %select = select i1 %cmp, i32 %y, i32 %or1068 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1069 %res = mul i32 %select, %select21070 ret i32 %res1071}1072 1073define i32 @shift_no_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1074; CHECK-LABEL: @shift_no_xor_multiuse_cmp_with_xor(1075; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11076; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01077; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i32 [[AND]], 11078; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[TMP1]]1079; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1080; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1081; CHECK-NEXT: ret i32 [[RES]]1082;1083 %and = and i32 %x, 11084 %cmp = icmp eq i32 %and, 01085 %xor = xor i32 %y, 21086 %select = select i1 %cmp, i32 %y, i32 %xor1087 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1088 %res = mul i32 %select, %select21089 ret i32 %res1090}1091 1092define i32 @shift_no_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) {1093; CHECK-LABEL: @shift_no_xor_multiuse_cmp_with_and(1094; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11095; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01096; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -31097; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]1098; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1099; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1100; CHECK-NEXT: ret i32 [[RES]]1101;1102 %and = and i32 %x, 11103 %cmp = icmp eq i32 %and, 01104 %and2 = and i32 %y, -31105 %select = select i1 %cmp, i32 %y, i32 %and21106 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1107 %res = mul i32 %select, %select21108 ret i32 %res1109}1110 1111define i32 @no_shift_no_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) {1112; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp(1113; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961114; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01115; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[AND]]1116; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1117; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1118; CHECK-NEXT: ret i32 [[RES]]1119;1120 %and = and i32 %x, 40961121 %cmp = icmp eq i32 %and, 01122 %or = or i32 %y, 40961123 %select = select i1 %cmp, i32 %y, i32 %or1124 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1125 %res = mul i32 %select, %select21126 ret i32 %res1127}1128 1129define i32 @no_shift_no_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1130; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_with_xor(1131; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961132; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01133; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y:%.*]], [[AND]]1134; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1135; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1136; CHECK-NEXT: ret i32 [[RES]]1137;1138 %and = and i32 %x, 40961139 %cmp = icmp eq i32 %and, 01140 %xor = xor i32 %y, 40961141 %select = select i1 %cmp, i32 %y, i32 %xor1142 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1143 %res = mul i32 %select, %select21144 ret i32 %res1145}1146 1147define i32 @no_shift_no_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) {1148; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_with_and(1149; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961150; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01151; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -40971152; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]1153; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1154; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1155; CHECK-NEXT: ret i32 [[RES]]1156;1157 %and = and i32 %x, 40961158 %cmp = icmp eq i32 %and, 01159 %and2 = and i32 %y, -40971160 %select = select i1 %cmp, i32 %y, i32 %and21161 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1162 %res = mul i32 %select, %select21163 ret i32 %res1164}1165 1166define i32 @no_shift_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) {1167; CHECK-LABEL: @no_shift_xor_multiuse_cmp(1168; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961169; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01170; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 40961171; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y:%.*]], [[TMP1]]1172; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1173; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1174; CHECK-NEXT: ret i32 [[RES]]1175;1176 %and = and i32 %x, 40961177 %cmp = icmp ne i32 0, %and1178 %or = or i32 %y, 40961179 %select = select i1 %cmp, i32 %y, i32 %or1180 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1181 %res = mul i32 %select, %select21182 ret i32 %res1183}1184 1185define i32 @no_shift_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1186; CHECK-LABEL: @no_shift_xor_multiuse_cmp_with_xor(1187; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961188; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01189; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], [[Y:%.*]]1190; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], 40961191; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1192; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1193; CHECK-NEXT: ret i32 [[RES]]1194;1195 %and = and i32 %x, 40961196 %cmp = icmp ne i32 0, %and1197 %xor = xor i32 %y, 40961198 %select = select i1 %cmp, i32 %y, i32 %xor1199 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1200 %res = mul i32 %select, %select21201 ret i32 %res1202}1203 1204define i32 @no_shift_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) {1205; CHECK-LABEL: @no_shift_xor_multiuse_cmp_with_and(1206; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961207; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01208; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -40971209; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]1210; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1211; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1212; CHECK-NEXT: ret i32 [[RES]]1213;1214 %and = and i32 %x, 40961215 %cmp = icmp ne i32 0, %and1216 %and2 = and i32 %y, -40971217 %select = select i1 %cmp, i32 %y, i32 %and21218 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1219 %res = mul i32 %select, %select21220 ret i32 %res1221}1222 1223define i32 @shift_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) {1224; CHECK-LABEL: @shift_xor_multiuse_cmp(1225; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961226; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01227; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 20481228; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[OR]], i32 [[Y]]1229; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1230; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1231; CHECK-NEXT: ret i32 [[RES]]1232;1233 %and = and i32 %x, 40961234 %cmp = icmp ne i32 0, %and1235 %or = or i32 %y, 20481236 %select = select i1 %cmp, i32 %y, i32 %or1237 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1238 %res = mul i32 %select, %select21239 ret i32 %res1240}1241 1242define i32 @shift_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1243; CHECK-LABEL: @shift_xor_multiuse_cmp_with_xor(1244; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961245; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01246; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 20481247; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]1248; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1249; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1250; CHECK-NEXT: ret i32 [[RES]]1251;1252 %and = and i32 %x, 40961253 %cmp = icmp ne i32 0, %and1254 %xor = xor i32 %y, 20481255 %select = select i1 %cmp, i32 %y, i32 %xor1256 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1257 %res = mul i32 %select, %select21258 ret i32 %res1259}1260 1261define i32 @shift_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) {1262; CHECK-LABEL: @shift_xor_multiuse_cmp_with_and(1263; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961264; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01265; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -20491266; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]1267; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1268; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1269; CHECK-NEXT: ret i32 [[RES]]1270;1271 %and = and i32 %x, 40961272 %cmp = icmp ne i32 0, %and1273 %and2 = and i32 %y, -20491274 %select = select i1 %cmp, i32 %y, i32 %and21275 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1276 %res = mul i32 %select, %select21277 ret i32 %res1278}1279 1280define i32 @shift_no_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) {1281; CHECK-LABEL: @shift_no_xor_multiuse_cmp_or(1282; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11283; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01284; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 21285; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[OR]]1286; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1287; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1288; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]]1289; CHECK-NEXT: ret i32 [[RES2]]1290;1291 %and = and i32 %x, 11292 %cmp = icmp eq i32 %and, 01293 %or = or i32 %y, 21294 %select = select i1 %cmp, i32 %y, i32 %or1295 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1296 %res = mul i32 %select, %select21297 %res2 = mul i32 %res, %or ; to bump up the use count of the or1298 ret i32 %res21299}1300 1301define i32 @shift_no_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1302; CHECK-LABEL: @shift_no_xor_multiuse_cmp_xor(1303; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11304; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01305; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 21306; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]1307; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1308; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1309; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]]1310; CHECK-NEXT: ret i32 [[RES2]]1311;1312 %and = and i32 %x, 11313 %cmp = icmp eq i32 %and, 01314 %xor = xor i32 %y, 21315 %select = select i1 %cmp, i32 %y, i32 %xor1316 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1317 %res = mul i32 %select, %select21318 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor1319 ret i32 %res21320}1321 1322define i32 @shift_no_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) {1323; CHECK-LABEL: @shift_no_xor_multiuse_cmp_and(1324; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11325; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01326; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -31327; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]1328; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1329; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1330; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]]1331; CHECK-NEXT: ret i32 [[RES2]]1332;1333 %and = and i32 %x, 11334 %cmp = icmp eq i32 %and, 01335 %and2 = and i32 %y, -31336 %select = select i1 %cmp, i32 %y, i32 %and21337 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1338 %res = mul i32 %select, %select21339 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and1340 ret i32 %res21341}1342 1343define i32 @no_shift_no_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) {1344; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_or(1345; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961346; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01347; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 40961348; CHECK-NEXT: [[SELECT:%.*]] = or i32 [[Y]], [[AND]]1349; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1350; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1351; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]]1352; CHECK-NEXT: ret i32 [[RES2]]1353;1354 %and = and i32 %x, 40961355 %cmp = icmp eq i32 %and, 01356 %or = or i32 %y, 40961357 %select = select i1 %cmp, i32 %y, i32 %or1358 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1359 %res = mul i32 %select, %select21360 %res2 = mul i32 %res, %or ; to bump up the use count of the or1361 ret i32 %res21362}1363 1364define i32 @no_shift_no_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1365; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_xor(1366; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961367; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01368; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 40961369; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[Y]], [[AND]]1370; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1371; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1372; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]]1373; CHECK-NEXT: ret i32 [[RES2]]1374;1375 %and = and i32 %x, 40961376 %cmp = icmp eq i32 %and, 01377 %xor = xor i32 %y, 40961378 %select = select i1 %cmp, i32 %y, i32 %xor1379 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1380 %res = mul i32 %select, %select21381 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor1382 ret i32 %res21383}1384 1385define i32 @no_shift_no_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) {1386; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_and(1387; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961388; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01389; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -40971390; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]]1391; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]1392; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1393; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]]1394; CHECK-NEXT: ret i32 [[RES2]]1395;1396 %and = and i32 %x, 40961397 %cmp = icmp eq i32 %and, 01398 %and2 = and i32 %y, -40971399 %select = select i1 %cmp, i32 %y, i32 %and21400 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1401 %res = mul i32 %select, %select21402 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and1403 ret i32 %res21404}1405 1406define i32 @no_shift_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) {1407; CHECK-LABEL: @no_shift_xor_multiuse_cmp_or(1408; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961409; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01410; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 40961411; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[OR]], i32 [[Y]]1412; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1413; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1414; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]]1415; CHECK-NEXT: ret i32 [[RES2]]1416;1417 %and = and i32 %x, 40961418 %cmp = icmp ne i32 0, %and1419 %or = or i32 %y, 40961420 %select = select i1 %cmp, i32 %y, i32 %or1421 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1422 %res = mul i32 %select, %select21423 %res2 = mul i32 %res, %or ; to bump up the use count of the or1424 ret i32 %res21425}1426 1427define i32 @no_shift_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1428; CHECK-LABEL: @no_shift_xor_multiuse_cmp_xor(1429; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961430; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01431; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 40961432; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]1433; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1434; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1435; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]]1436; CHECK-NEXT: ret i32 [[RES2]]1437;1438 %and = and i32 %x, 40961439 %cmp = icmp ne i32 0, %and1440 %xor = xor i32 %y, 40961441 %select = select i1 %cmp, i32 %y, i32 %xor1442 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1443 %res = mul i32 %select, %select21444 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor1445 ret i32 %res21446}1447 1448define i32 @no_shift_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) {1449; CHECK-LABEL: @no_shift_xor_multiuse_cmp_and(1450; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961451; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01452; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -40971453; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]1454; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1455; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1456; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]]1457; CHECK-NEXT: ret i32 [[RES2]]1458;1459 %and = and i32 %x, 40961460 %cmp = icmp ne i32 0, %and1461 %and2 = and i32 %y, -40971462 %select = select i1 %cmp, i32 %y, i32 %and21463 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1464 %res = mul i32 %select, %select21465 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and1466 ret i32 %res21467}1468 1469define i32 @shift_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) {1470; CHECK-LABEL: @shift_xor_multiuse_cmp_or(1471; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961472; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01473; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 20481474; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[OR]], i32 [[Y]]1475; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1476; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1477; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]]1478; CHECK-NEXT: ret i32 [[RES2]]1479;1480 %and = and i32 %x, 40961481 %cmp = icmp ne i32 0, %and1482 %or = or i32 %y, 20481483 %select = select i1 %cmp, i32 %y, i32 %or1484 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1485 %res = mul i32 %select, %select21486 %res2 = mul i32 %res, %or ; to bump up the use count of the or1487 ret i32 %res21488}1489 1490define i32 @shift_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) {1491; CHECK-LABEL: @shift_xor_multiuse_cmp_xor(1492; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961493; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01494; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 20481495; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]1496; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1497; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1498; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]]1499; CHECK-NEXT: ret i32 [[RES2]]1500;1501 %and = and i32 %x, 40961502 %cmp = icmp ne i32 0, %and1503 %xor = xor i32 %y, 20481504 %select = select i1 %cmp, i32 %y, i32 %xor1505 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1506 %res = mul i32 %select, %select21507 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor1508 ret i32 %res21509}1510 1511define i32 @shift_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) {1512; CHECK-LABEL: @shift_xor_multiuse_cmp_and(1513; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 40961514; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 01515; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], 20481516; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[AND2]], i32 [[Y]]1517; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]1518; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]1519; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]]1520; CHECK-NEXT: ret i32 [[RES2]]1521;1522 %and = and i32 %x, 40961523 %cmp = icmp ne i32 0, %and1524 %and2 = and i32 %y, 20481525 %select = select i1 %cmp, i32 %y, i32 %and21526 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp1527 %res = mul i32 %select, %select21528 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and1529 ret i32 %res21530}1531 1532define i8 @set_bits(i8 %x, i1 %b) {1533; CHECK-LABEL: @set_bits(1534; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], -61535; CHECK-NEXT: [[MASKSEL:%.*]] = select i1 [[B:%.*]], i8 5, i8 01536; CHECK-NEXT: [[COND:%.*]] = or disjoint i8 [[AND]], [[MASKSEL]]1537; CHECK-NEXT: ret i8 [[COND]]1538;1539 %and = and i8 %x, 2501540 %or = or i8 %x, 51541 %cond = select i1 %b, i8 %or, i8 %and1542 ret i8 %cond1543}1544 1545; Negative test1546 1547define i8 @set_bits_not_inverse_constant(i8 %x, i1 %b) {1548; CHECK-LABEL: @set_bits_not_inverse_constant(1549; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], -61550; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], 71551; CHECK-NEXT: [[COND:%.*]] = select i1 [[B:%.*]], i8 [[OR]], i8 [[AND]]1552; CHECK-NEXT: ret i8 [[COND]]1553;1554 %and = and i8 %x, 2501555 %or = or i8 %x, 71556 %cond = select i1 %b, i8 %or, i8 %and1557 ret i8 %cond1558}1559 1560define i8 @set_bits_extra_use1(i8 %x, i1 %b) {1561; CHECK-LABEL: @set_bits_extra_use1(1562; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], -61563; CHECK-NEXT: call void @use(i8 [[AND]])1564; CHECK-NEXT: [[MASKSEL:%.*]] = select i1 [[B:%.*]], i8 5, i8 01565; CHECK-NEXT: [[COND:%.*]] = or disjoint i8 [[AND]], [[MASKSEL]]1566; CHECK-NEXT: ret i8 [[COND]]1567;1568 %and = and i8 %x, 2501569 call void @use(i8 %and)1570 %or = or i8 %x, 51571 %cond = select i1 %b, i8 %or, i8 %and1572 ret i8 %cond1573}1574 1575; Negative test1576 1577define i8 @set_bits_extra_use2(i8 %x, i1 %b) {1578; CHECK-LABEL: @set_bits_extra_use2(1579; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], -61580; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], 51581; CHECK-NEXT: call void @use(i8 [[OR]])1582; CHECK-NEXT: [[COND:%.*]] = select i1 [[B:%.*]], i8 [[OR]], i8 [[AND]]1583; CHECK-NEXT: ret i8 [[COND]]1584;1585 %and = and i8 %x, 2501586 %or = or i8 %x, 51587 call void @use(i8 %or)1588 %cond = select i1 %b, i8 %or, i8 %and1589 ret i8 %cond1590}1591 1592define <2 x i8> @clear_bits(<2 x i8> %x, <2 x i1> %b) {1593; CHECK-LABEL: @clear_bits(1594; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], splat (i8 37)1595; CHECK-NEXT: [[MASKSEL:%.*]] = select <2 x i1> [[B:%.*]], <2 x i8> zeroinitializer, <2 x i8> splat (i8 -38)1596; CHECK-NEXT: [[COND:%.*]] = or disjoint <2 x i8> [[AND]], [[MASKSEL]]1597; CHECK-NEXT: ret <2 x i8> [[COND]]1598;1599 %and = and <2 x i8> %x, <i8 37, i8 37>1600 %or = or <2 x i8> %x, <i8 218, i8 218>1601 %cond = select <2 x i1> %b, <2 x i8> %and, <2 x i8> %or1602 ret <2 x i8> %cond1603}1604 1605; Negative test1606 1607define <2 x i8> @clear_bits_not_inverse_constant(<2 x i8> %x, <2 x i1> %b) {1608; CHECK-LABEL: @clear_bits_not_inverse_constant(1609; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], <i8 undef, i8 37>1610; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[X]], splat (i8 -38)1611; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[B:%.*]], <2 x i8> [[AND]], <2 x i8> [[OR]]1612; CHECK-NEXT: ret <2 x i8> [[COND]]1613;1614 %and = and <2 x i8> %x, <i8 undef, i8 37>1615 %or = or <2 x i8> %x, <i8 218, i8 218>1616 %cond = select <2 x i1> %b, <2 x i8> %and, <2 x i8> %or1617 ret <2 x i8> %cond1618}1619 1620define <2 x i8> @clear_bits_extra_use1(<2 x i8> %x, i1 %b) {1621; CHECK-LABEL: @clear_bits_extra_use1(1622; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], splat (i8 37)1623; CHECK-NEXT: call void @use_vec(<2 x i8> [[AND]])1624; CHECK-NEXT: [[MASKSEL:%.*]] = select i1 [[B:%.*]], <2 x i8> zeroinitializer, <2 x i8> splat (i8 -38)1625; CHECK-NEXT: [[COND:%.*]] = or disjoint <2 x i8> [[AND]], [[MASKSEL]]1626; CHECK-NEXT: ret <2 x i8> [[COND]]1627;1628 %and = and <2 x i8> %x, <i8 37, i8 37>1629 call void @use_vec(<2 x i8> %and)1630 %or = or <2 x i8> %x, <i8 218, i8 218>1631 %cond = select i1 %b, <2 x i8> %and, <2 x i8> %or1632 ret <2 x i8> %cond1633}1634 1635; Negative test1636 1637define i8 @clear_bits_extra_use2(i8 %x, i1 %b) {1638; CHECK-LABEL: @clear_bits_extra_use2(1639; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], -61640; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], 51641; CHECK-NEXT: call void @use(i8 [[OR]])1642; CHECK-NEXT: [[COND:%.*]] = select i1 [[B:%.*]], i8 [[AND]], i8 [[OR]]1643; CHECK-NEXT: ret i8 [[COND]]1644;1645 %and = and i8 %x, 2501646 %or = or i8 %x, 51647 call void @use(i8 %or)1648 %cond = select i1 %b, i8 %and, i8 %or1649 ret i8 %cond1650}1651 1652; Tests factoring in cost of saving the `and`1653define i64 @xor_i8_to_i64_shl_save_and_eq(i8 %x, i64 %y) {1654; CHECK-LABEL: @xor_i8_to_i64_shl_save_and_eq(1655; CHECK-NEXT: [[XX:%.*]] = and i8 [[X:%.*]], 11656; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[XX]], 01657; CHECK-NEXT: [[Z:%.*]] = xor i64 [[Y:%.*]], -92233720368547758081658; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i64 [[Z]], i64 [[Y]]1659; CHECK-NEXT: ret i64 [[R]]1660;1661 %xx = and i8 %x, 11662 %cmp = icmp eq i8 %xx, 01663 %z = xor i64 %y, -92233720368547758081664 %r = select i1 %cmp, i64 %z, i64 %y1665 ret i64 %r1666}1667 1668define i64 @xor_i8_to_i64_shl_save_and_ne(i8 %x, i64 %y) {1669; CHECK-LABEL: @xor_i8_to_i64_shl_save_and_ne(1670; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i641671; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[TMP1]], 631672; CHECK-NEXT: [[R:%.*]] = xor i64 [[Y:%.*]], [[TMP2]]1673; CHECK-NEXT: ret i64 [[R]]1674;1675 %xx = and i8 %x, 11676 %cmp = icmp ne i8 %xx, 01677 %z = xor i64 %y, -92233720368547758081678 %r = select i1 %cmp, i64 %z, i64 %y1679 ret i64 %r1680}1681 1682define i32 @select_icmp_eq_and_1_0_srem_2_fail_null_identity(i32 %x, i32 %y) {1683; CHECK-LABEL: @select_icmp_eq_and_1_0_srem_2_fail_null_identity(1684; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11685; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01686; CHECK-NEXT: [[XOR:%.*]] = srem i32 [[Y:%.*]], 21687; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]1688; CHECK-NEXT: ret i32 [[SELECT]]1689;1690 %and = and i32 %x, 11691 %cmp = icmp eq i32 %and, 01692 %xor = srem i32 %y, 21693 %select = select i1 %cmp, i32 %y, i32 %xor1694 ret i32 %select1695}1696 1697 1698define i32 @select_icmp_eq_and_1_0_sdiv_2_fail_null_1_identity(i32 %x, i32 %y) {1699; CHECK-LABEL: @select_icmp_eq_and_1_0_sdiv_2_fail_null_1_identity(1700; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 11701; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 01702; CHECK-NEXT: [[XOR:%.*]] = sdiv i32 [[Y:%.*]], 21703; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]1704; CHECK-NEXT: ret i32 [[SELECT]]1705;1706 %and = and i32 %x, 11707 %cmp = icmp eq i32 %and, 01708 %xor = sdiv i32 %y, 21709 %select = select i1 %cmp, i32 %y, i32 %xor1710 ret i32 %select1711}1712 1713define i8 @select_icmp_eq_and_1_0_lshr_fv(i8 %x, i8 %y) {1714; CHECK-LABEL: @select_icmp_eq_and_1_0_lshr_fv(1715; CHECK-NEXT: [[AND:%.*]] = shl i8 [[X:%.*]], 11716; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND]], 21717; CHECK-NEXT: [[SELECT:%.*]] = lshr i8 [[Y:%.*]], [[TMP1]]1718; CHECK-NEXT: ret i8 [[SELECT]]1719;1720 %and = and i8 %x, 11721 %cmp = icmp eq i8 %and, 01722 %blshr = lshr i8 %y, 21723 %select = select i1 %cmp, i8 %y, i8 %blshr1724 ret i8 %select1725}1726 1727define i8 @select_icmp_eq_and_1_0_lshr_exact_fv(i8 %x, i8 %y) {1728; CHECK-LABEL: @select_icmp_eq_and_1_0_lshr_exact_fv(1729; CHECK-NEXT: [[AND:%.*]] = shl i8 [[X:%.*]], 11730; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND]], 21731; CHECK-NEXT: [[SELECT:%.*]] = lshr exact i8 [[Y:%.*]], [[TMP1]]1732; CHECK-NEXT: ret i8 [[SELECT]]1733;1734 %and = and i8 %x, 11735 %cmp = icmp eq i8 %and, 01736 %blshr = lshr exact i8 %y, 21737 %select = select i1 %cmp, i8 %y, i8 %blshr1738 ret i8 %select1739}1740 1741define i8 @select_icmp_eq_and_1_0_lshr_tv(i8 %x, i8 %y) {1742; CHECK-LABEL: @select_icmp_eq_and_1_0_lshr_tv(1743; CHECK-NEXT: [[AND:%.*]] = shl i8 [[X:%.*]], 11744; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND]], 21745; CHECK-NEXT: [[SELECT:%.*]] = lshr i8 [[Y:%.*]], [[TMP1]]1746; CHECK-NEXT: ret i8 [[SELECT]]1747;1748 %and = and i8 %x, 11749 %cmp = icmp ne i8 %and, 01750 %blshr = lshr i8 %y, 21751 %select = select i1 %cmp, i8 %blshr, i8 %y1752 ret i8 %select1753}1754 1755define i8 @select_trunc_or_2(i8 %x, i8 %y) {1756; CHECK-LABEL: @select_trunc_or_2(1757; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[X:%.*]], 11758; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], 21759; CHECK-NEXT: [[SELECT:%.*]] = or i8 [[Y:%.*]], [[TMP2]]1760; CHECK-NEXT: ret i8 [[SELECT]]1761;1762 %trunc = trunc i8 %x to i11763 %or = or i8 %y, 21764 %select = select i1 %trunc, i8 %or, i8 %y1765 ret i8 %select1766}1767 1768define i8 @select_not_trunc_or_2(i8 %x, i8 %y) {1769; CHECK-LABEL: @select_not_trunc_or_2(1770; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[X:%.*]], 11771; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], 21772; CHECK-NEXT: [[SELECT:%.*]] = or i8 [[Y:%.*]], [[TMP2]]1773; CHECK-NEXT: ret i8 [[SELECT]]1774;1775 %trunc = trunc i8 %x to i11776 %not = xor i1 %trunc, true1777 %or = or i8 %y, 21778 %select = select i1 %not, i8 %y, i8 %or1779 ret i8 %select1780}1781 1782define i8 @select_trunc_nuw_or_2(i8 %x, i8 %y) {1783; CHECK-LABEL: @select_trunc_nuw_or_2(1784; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[X:%.*]], 11785; CHECK-NEXT: [[SELECT:%.*]] = or i8 [[Y:%.*]], [[TMP1]]1786; CHECK-NEXT: ret i8 [[SELECT]]1787;1788 %trunc = trunc nuw i8 %x to i11789 %or = or i8 %y, 21790 %select = select i1 %trunc, i8 %or, i8 %y1791 ret i8 %select1792}1793 1794define i8 @select_trunc_nsw_or_2(i8 %x, i8 %y) {1795; CHECK-LABEL: @select_trunc_nsw_or_2(1796; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[X:%.*]], 11797; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], 21798; CHECK-NEXT: [[SELECT:%.*]] = or i8 [[Y:%.*]], [[TMP2]]1799; CHECK-NEXT: ret i8 [[SELECT]]1800;1801 %trunc = trunc nsw i8 %x to i11802 %or = or i8 %y, 21803 %select = select i1 %trunc, i8 %or, i8 %y1804 ret i8 %select1805}1806 1807define <2 x i8> @select_trunc_or_2_vec(<2 x i8> %x, <2 x i8> %y) {1808; CHECK-LABEL: @select_trunc_or_2_vec(1809; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i8> [[X:%.*]], splat (i8 1)1810; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], splat (i8 2)1811; CHECK-NEXT: [[SELECT:%.*]] = or <2 x i8> [[Y:%.*]], [[TMP2]]1812; CHECK-NEXT: ret <2 x i8> [[SELECT]]1813;1814 %trunc = trunc <2 x i8> %x to <2 x i1>1815 %or = or <2 x i8> %y, <i8 2, i8 2>1816 %select = select <2 x i1> %trunc, <2 x i8> %or, <2 x i8> %y1817 ret <2 x i8> %select1818}1819 1820define i8 @neg_select_trunc_or_2(i8 %x, i8 %y) {1821; CHECK-LABEL: @neg_select_trunc_or_2(1822; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i11823; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 21824; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[TRUNC]], i8 [[Y]], i8 [[OR]]1825; CHECK-NEXT: ret i8 [[SELECT]]1826;1827 %trunc = trunc i8 %x to i11828 %or = or i8 %y, 21829 %select = select i1 %trunc, i8 %y, i8 %or1830 ret i8 %select1831}1832 1833define i8 @select_icmp_bittest_range(i8 range(i8 0, 64) %a, i8 %y) {1834; CHECK-LABEL: @select_icmp_bittest_range(1835; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[A:%.*]], 41836; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], 21837; CHECK-NEXT: [[RES:%.*]] = or i8 [[Y:%.*]], [[TMP2]]1838; CHECK-NEXT: ret i8 [[RES]]1839;1840 %cmp = icmp ult i8 %a, 321841 %or = or i8 %y, 21842 %res = select i1 %cmp, i8 %y, i8 %or1843 ret i8 %res1844}1845 1846define i8 @neg_select_icmp_bittest_range(i8 range(i8 0, 65) %a, i8 %y) {1847; CHECK-LABEL: @neg_select_icmp_bittest_range(1848; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i8 [[A:%.*]], 321849; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 21850; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[OR]]1851; CHECK-NEXT: ret i8 [[RES]]1852;1853 %cmp = icmp ult i8 %a, 321854 %or = or i8 %y, 21855 %res = select i1 %cmp, i8 %y, i8 %or1856 ret i8 %res1857}1858 1859define i8 @neg_select_icmp_bittest_range_2(i8 range(i8 0, 64) %a, i8 %y) {1860; CHECK-LABEL: @neg_select_icmp_bittest_range_2(1861; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i8 [[A:%.*]], 161862; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 21863; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[OR]]1864; CHECK-NEXT: ret i8 [[RES]]1865;1866 %cmp = icmp ult i8 %a, 161867 %or = or i8 %y, 21868 %res = select i1 %cmp, i8 %y, i8 %or1869 ret i8 %res1870}1871