brintos

brintos / llvm-project-archived public Read only

0
0
Text · 68.2 KiB · 771fad6 Raw
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