518 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; TODO: All of these should be optimized to less than or equal to a single5; instruction of select/and/or.6 7; --- (A op B) op' A / (B op A) op' A ---8 9; (A land B) land A10define i1 @land_land_left1(i1 %A, i1 %B) !prof !0 {11; CHECK-LABEL: @land_land_left1(12; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false, !prof [[PROF1:![0-9]+]]13; CHECK-NEXT: ret i1 [[C]]14;15 %c = select i1 %A, i1 %B, i1 false, !prof !116 %res = select i1 %c, i1 %A, i1 false, !prof !217 ret i1 %res18}19define i1 @land_land_left2(i1 %A, i1 %B) {20; CHECK-LABEL: @land_land_left2(21; CHECK-NEXT: [[RES:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false22; CHECK-NEXT: ret i1 [[RES]]23;24 %c = select i1 %B, i1 %A, i1 false25 %res = select i1 %c, i1 %A, i1 false26 ret i1 %res27}28 29; (A land B) band A30define i1 @land_band_left1(i1 %A, i1 %B) {31; CHECK-LABEL: @land_band_left1(32; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false33; CHECK-NEXT: ret i1 [[C]]34;35 %c = select i1 %A, i1 %B, i1 false36 %res = and i1 %c, %A37 ret i1 %res38}39define i1 @land_band_left2(i1 %A, i1 %B) {40; CHECK-LABEL: @land_band_left2(41; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false42; CHECK-NEXT: ret i1 [[C]]43;44 %c = select i1 %B, i1 %A, i1 false45 %res = and i1 %c, %A46 ret i1 %res47}48 49; (A land B) lor A50define i1 @land_lor_left1(i1 %A, i1 %B) {51; CHECK-LABEL: @land_lor_left1(52; CHECK-NEXT: ret i1 [[A:%.*]]53;54 %c = select i1 %A, i1 %B, i1 false55 %res = select i1 %c, i1 true, i1 %A56 ret i1 %res57}58define i1 @land_lor_left2(i1 %A, i1 %B) {59; CHECK-LABEL: @land_lor_left2(60; CHECK-NEXT: ret i1 [[A:%.*]]61;62 %c = select i1 %B, i1 %A, i1 false63 %res = select i1 %c, i1 true, i1 %A64 ret i1 %res65}66 67; (A land B) bor A68define i1 @land_bor_left1(i1 %A, i1 %B) {69; CHECK-LABEL: @land_bor_left1(70; CHECK-NEXT: ret i1 [[A:%.*]]71;72 %c = select i1 %A, i1 %B, i1 false73 %res = or i1 %c, %A74 ret i1 %res75}76define i1 @land_bor_left2(i1 %A, i1 %B) {77; CHECK-LABEL: @land_bor_left2(78; CHECK-NEXT: ret i1 [[A:%.*]]79;80 %c = select i1 %B, i1 %A, i1 false81 %res = or i1 %c, %A82 ret i1 %res83}84 85; (A band B) land A86define i1 @band_land_left1(i1 %A, i1 %B) {87; CHECK-LABEL: @band_land_left1(88; CHECK-NEXT: [[C:%.*]] = and i1 [[A:%.*]], [[B:%.*]]89; CHECK-NEXT: ret i1 [[C]]90;91 %c = and i1 %A, %B92 %res = select i1 %c, i1 %A, i1 false93 ret i1 %res94}95define i1 @band_land_left2(i1 %A, i1 %B) {96; CHECK-LABEL: @band_land_left2(97; CHECK-NEXT: [[C:%.*]] = and i1 [[B:%.*]], [[A:%.*]]98; CHECK-NEXT: ret i1 [[C]]99;100 %c = and i1 %B, %A101 %res = select i1 %c, i1 %A, i1 false102 ret i1 %res103}104 105; (A band B) lor A106define i1 @band_lor_left1(i1 %A, i1 %B) {107; CHECK-LABEL: @band_lor_left1(108; CHECK-NEXT: ret i1 [[A:%.*]]109;110 %c = and i1 %A, %B111 %res = select i1 %c, i1 true, i1 %A112 ret i1 %res113}114define i1 @band_lor_left2(i1 %A, i1 %B) {115; CHECK-LABEL: @band_lor_left2(116; CHECK-NEXT: ret i1 [[A:%.*]]117;118 %c = and i1 %B, %A119 %res = select i1 %c, i1 true, i1 %A120 ret i1 %res121}122 123; (A lor B) land A124define i1 @lor_land_left1(i1 %A, i1 %B) {125; CHECK-LABEL: @lor_land_left1(126; CHECK-NEXT: ret i1 [[A:%.*]]127;128 %c = select i1 %A, i1 true, i1 %B129 %res = select i1 %c, i1 %A, i1 false130 ret i1 %res131}132define i1 @lor_land_left2(i1 %A, i1 %B) {133; CHECK-LABEL: @lor_land_left2(134; CHECK-NEXT: ret i1 [[A:%.*]]135;136 %c = select i1 %B, i1 true, i1 %A137 %res = select i1 %c, i1 %A, i1 false138 ret i1 %res139}140 141; (A lor B) band A142define i1 @lor_band_left1(i1 %A, i1 %B) {143; CHECK-LABEL: @lor_band_left1(144; CHECK-NEXT: ret i1 [[A:%.*]]145;146 %c = select i1 %A, i1 true, i1 %B147 %res = and i1 %c, %A148 ret i1 %res149}150define i1 @lor_band_left2(i1 %A, i1 %B) {151; CHECK-LABEL: @lor_band_left2(152; CHECK-NEXT: ret i1 [[A:%.*]]153;154 %c = select i1 %B, i1 true, i1 %A155 %res = and i1 %c, %A156 ret i1 %res157}158 159; (A lor B) lor A160define i1 @lor_lor_left1(i1 %A, i1 %B) !prof !0 {161; CHECK-LABEL: @lor_lor_left1(162; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]], !prof [[PROF1]]163; CHECK-NEXT: ret i1 [[C]]164;165 %c = select i1 %A, i1 true, i1 %B, !prof !1166 %res = select i1 %c, i1 true, i1 %A, !prof !2167 ret i1 %res168}169define i1 @lor_lor_left2(i1 %A, i1 %B) {170; CHECK-LABEL: @lor_lor_left2(171; CHECK-NEXT: [[RES:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]172; CHECK-NEXT: ret i1 [[RES]]173;174 %c = select i1 %B, i1 true, i1 %A175 %res = select i1 %c, i1 true, i1 %A176 ret i1 %res177}178 179; (A lor B) bor A180define i1 @lor_bor_left1(i1 %A, i1 %B) {181; CHECK-LABEL: @lor_bor_left1(182; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]183; CHECK-NEXT: ret i1 [[C]]184;185 %c = select i1 %A, i1 true, i1 %B186 %res = or i1 %c, %A187 ret i1 %res188}189define i1 @lor_bor_left2(i1 %A, i1 %B) {190; CHECK-LABEL: @lor_bor_left2(191; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]192; CHECK-NEXT: ret i1 [[C]]193;194 %c = select i1 %B, i1 true, i1 %A195 %res = or i1 %c, %A196 ret i1 %res197}198 199; (A bor B) land A200define i1 @bor_land_left1(i1 %A, i1 %B) {201; CHECK-LABEL: @bor_land_left1(202; CHECK-NEXT: ret i1 [[A:%.*]]203;204 %c = or i1 %A, %B205 %res = select i1 %c, i1 %A, i1 false206 ret i1 %res207}208define i1 @bor_land_left2(i1 %A, i1 %B) {209; CHECK-LABEL: @bor_land_left2(210; CHECK-NEXT: ret i1 [[A:%.*]]211;212 %c = or i1 %B, %A213 %res = select i1 %c, i1 %A, i1 false214 ret i1 %res215}216 217; (A bor B) lor A218define i1 @bor_lor_left1(i1 %A, i1 %B) {219; CHECK-LABEL: @bor_lor_left1(220; CHECK-NEXT: [[C:%.*]] = or i1 [[A:%.*]], [[B:%.*]]221; CHECK-NEXT: ret i1 [[C]]222;223 %c = or i1 %A, %B224 %res = select i1 %c, i1 true, i1 %A225 ret i1 %res226}227define i1 @bor_lor_left2(i1 %A, i1 %B) {228; CHECK-LABEL: @bor_lor_left2(229; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], [[A:%.*]]230; CHECK-NEXT: ret i1 [[C]]231;232 %c = or i1 %B, %A233 %res = select i1 %c, i1 true, i1 %A234 ret i1 %res235}236 237; --- A op (A op' B) / A op (B op' A) ---238 239; A land (A land B)240define i1 @land_land_right1(i1 %A, i1 %B) {241; CHECK-LABEL: @land_land_right1(242; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false243; CHECK-NEXT: ret i1 [[RES]]244;245 %c = select i1 %A, i1 %B, i1 false246 %res = select i1 %A, i1 %c, i1 false247 ret i1 %res248}249define i1 @land_land_right2(i1 %A, i1 %B) {250; CHECK-LABEL: @land_land_right2(251; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false252; CHECK-NEXT: ret i1 [[RES]]253;254 %c = select i1 %B, i1 %A, i1 false255 %res = select i1 %A, i1 %c, i1 false256 ret i1 %res257}258 259; A band (A land B)260define i1 @land_band_right1(i1 %A, i1 %B) {261; CHECK-LABEL: @land_band_right1(262; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false263; CHECK-NEXT: ret i1 [[C]]264;265 %c = select i1 %A, i1 %B, i1 false266 %res = and i1 %A, %c267 ret i1 %res268}269define i1 @land_band_right2(i1 %A, i1 %B) {270; CHECK-LABEL: @land_band_right2(271; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false272; CHECK-NEXT: ret i1 [[C]]273;274 %c = select i1 %B, i1 %A, i1 false275 %res = and i1 %A, %c276 ret i1 %res277}278 279; A lor (A land B)280define i1 @land_lor_right1(i1 %A, i1 %B) {281; CHECK-LABEL: @land_lor_right1(282; CHECK-NEXT: ret i1 [[A:%.*]]283;284 %c = select i1 %A, i1 %B, i1 false285 %res = select i1 %A, i1 true, i1 %c286 ret i1 %res287}288define i1 @land_lor_right2(i1 %A, i1 %B) {289; CHECK-LABEL: @land_lor_right2(290; CHECK-NEXT: ret i1 [[A:%.*]]291;292 %c = select i1 %B, i1 %A, i1 false293 %res = select i1 %A, i1 true, i1 %c294 ret i1 %res295}296 297define <2 x i1> @land_lor_right1_vec(<2 x i1> %A, <2 x i1> %B) {298; CHECK-LABEL: @land_lor_right1_vec(299; CHECK-NEXT: ret <2 x i1> [[A:%.*]]300;301 %c = select <2 x i1> %A, <2 x i1> %B, <2 x i1> zeroinitializer302 %res = select <2 x i1> %A, <2 x i1> <i1 true, i1 true>, <2 x i1> %c303 ret <2 x i1> %res304}305define <2 x i1> @land_lor_right2_vec(<2 x i1> %A, <2 x i1> %B) {306; CHECK-LABEL: @land_lor_right2_vec(307; CHECK-NEXT: ret <2 x i1> [[A:%.*]]308;309 %c = select <2 x i1> %B, <2 x i1> %A, <2 x i1> zeroinitializer310 %res = select <2 x i1> %A, <2 x i1> <i1 true, i1 true>, <2 x i1> %c311 ret <2 x i1> %res312}313 314; A bor (A land B)315define i1 @land_bor_right1(i1 %A, i1 %B) {316; CHECK-LABEL: @land_bor_right1(317; CHECK-NEXT: ret i1 [[A:%.*]]318;319 %c = select i1 %A, i1 %B, i1 false320 %res = or i1 %A, %c321 ret i1 %res322}323define i1 @land_bor_right2(i1 %A, i1 %B) {324; CHECK-LABEL: @land_bor_right2(325; CHECK-NEXT: ret i1 [[A:%.*]]326;327 %c = select i1 %B, i1 %A, i1 false328 %res = or i1 %A, %c329 ret i1 %res330}331 332; A land (A band B)333define i1 @band_land_right1(i1 %A, i1 %B) {334; CHECK-LABEL: @band_land_right1(335; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false336; CHECK-NEXT: ret i1 [[RES]]337;338 %c = and i1 %A, %B339 %res = select i1 %A, i1 %c, i1 false340 ret i1 %res341}342define i1 @band_land_right2(i1 %A, i1 %B) {343; CHECK-LABEL: @band_land_right2(344; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false345; CHECK-NEXT: ret i1 [[RES]]346;347 %c = and i1 %B, %A348 %res = select i1 %A, i1 %c, i1 false349 ret i1 %res350}351 352; A lor (A band B)353define i1 @band_lor_right1(i1 %A, i1 %B) {354; CHECK-LABEL: @band_lor_right1(355; CHECK-NEXT: ret i1 [[A:%.*]]356;357 %c = and i1 %A, %B358 %res = select i1 %A, i1 true, i1 %c359 ret i1 %res360}361define i1 @band_lor_right2(i1 %A, i1 %B) {362; CHECK-LABEL: @band_lor_right2(363; CHECK-NEXT: ret i1 [[A:%.*]]364;365 %c = and i1 %B, %A366 %res = select i1 %A, i1 true, i1 %c367 ret i1 %res368}369 370; A land (A lor B)371define i1 @lor_land_right1(i1 %A, i1 %B) {372; CHECK-LABEL: @lor_land_right1(373; CHECK-NEXT: ret i1 [[A:%.*]]374;375 %c = select i1 %A, i1 true, i1 %B376 %res = select i1 %A, i1 %c, i1 false377 ret i1 %res378}379define i1 @lor_land_right2(i1 %A, i1 %B) {380; CHECK-LABEL: @lor_land_right2(381; CHECK-NEXT: ret i1 [[A:%.*]]382;383 %c = select i1 %B, i1 true, i1 %A384 %res = select i1 %A, i1 %c, i1 false385 ret i1 %res386}387 388; A band (A lor B)389define i1 @lor_band_right1(i1 %A, i1 %B) {390; CHECK-LABEL: @lor_band_right1(391; CHECK-NEXT: ret i1 [[A:%.*]]392;393 %c = select i1 %A, i1 true, i1 %B394 %res = and i1 %A, %c395 ret i1 %res396}397define i1 @lor_band_right2(i1 %A, i1 %B) {398; CHECK-LABEL: @lor_band_right2(399; CHECK-NEXT: ret i1 [[A:%.*]]400;401 %c = select i1 %B, i1 true, i1 %A402 %res = and i1 %A, %c403 ret i1 %res404}405 406; A lor (A lor B)407define i1 @lor_lor_right1(i1 %A, i1 %B) {408; CHECK-LABEL: @lor_lor_right1(409; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]410; CHECK-NEXT: ret i1 [[RES]]411;412 %c = select i1 %A, i1 true, i1 %B413 %res = select i1 %A, i1 true, i1 %c414 ret i1 %res415}416define i1 @lor_lor_right2(i1 %A, i1 %B) {417; CHECK-LABEL: @lor_lor_right2(418; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]419; CHECK-NEXT: ret i1 [[RES]]420;421 %c = select i1 %B, i1 true, i1 %A422 %res = select i1 %A, i1 true, i1 %c423 ret i1 %res424}425 426; A bor (A lor B)427define i1 @lor_bor_right1(i1 %A, i1 %B) {428; CHECK-LABEL: @lor_bor_right1(429; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]430; CHECK-NEXT: ret i1 [[C]]431;432 %c = select i1 %A, i1 true, i1 %B433 %res = or i1 %A, %c434 ret i1 %res435}436define i1 @lor_bor_right2(i1 %A, i1 %B) {437; CHECK-LABEL: @lor_bor_right2(438; CHECK-NEXT: [[C:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]439; CHECK-NEXT: ret i1 [[C]]440;441 %c = select i1 %B, i1 true, i1 %A442 %res = or i1 %A, %c443 ret i1 %res444}445 446; A land (A bor B)447define i1 @bor_land_right1(i1 %A, i1 %B) {448; CHECK-LABEL: @bor_land_right1(449; CHECK-NEXT: ret i1 [[A:%.*]]450;451 %c = or i1 %A, %B452 %res = select i1 %A, i1 %c, i1 false453 ret i1 %res454}455define i1 @bor_land_right2(i1 %A, i1 %B) {456; CHECK-LABEL: @bor_land_right2(457; CHECK-NEXT: ret i1 [[A:%.*]]458;459 %c = or i1 %B, %A460 %res = select i1 %A, i1 %c, i1 false461 ret i1 %res462}463 464; A lor (A bor B)465define i1 @bor_lor_right1(i1 %A, i1 %B) {466; CHECK-LABEL: @bor_lor_right1(467; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]468; CHECK-NEXT: ret i1 [[RES]]469;470 %c = or i1 %A, %B471 %res = select i1 %A, i1 true, i1 %c472 ret i1 %res473}474define i1 @bor_lor_right2(i1 %A, i1 %B) {475; CHECK-LABEL: @bor_lor_right2(476; CHECK-NEXT: [[RES:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]477; CHECK-NEXT: ret i1 [[RES]]478;479 %c = or i1 %B, %A480 %res = select i1 %A, i1 true, i1 %c481 ret i1 %res482}483 484; Value equivalence substitution does not account for vector485; transforms, so it needs a scalar condition operand.486; For example, this would miscompile if %a = {1, 0}.487 488define <2 x i1> @PR50500_trueval(<2 x i1> %a, <2 x i1> %b) {489; CHECK-LABEL: @PR50500_trueval(490; CHECK-NEXT: [[S:%.*]] = shufflevector <2 x i1> [[A:%.*]], <2 x i1> poison, <2 x i32> <i32 1, i32 0>491; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[A]], <2 x i1> [[S]], <2 x i1> [[B:%.*]]492; CHECK-NEXT: ret <2 x i1> [[R]]493;494 %s = shufflevector <2 x i1> %a, <2 x i1> poison, <2 x i32> <i32 1, i32 0>495 %r = select <2 x i1> %a, <2 x i1> %s, <2 x i1> %b496 ret <2 x i1> %r497}498 499define <2 x i1> @PR50500_falseval(<2 x i1> %a, <2 x i1> %b) {500; CHECK-LABEL: @PR50500_falseval(501; CHECK-NEXT: [[S:%.*]] = shufflevector <2 x i1> [[A:%.*]], <2 x i1> poison, <2 x i32> <i32 1, i32 0>502; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[A]], <2 x i1> [[B:%.*]], <2 x i1> [[S]]503; CHECK-NEXT: ret <2 x i1> [[R]]504;505 %s = shufflevector <2 x i1> %a, <2 x i1> poison, <2 x i32> <i32 1, i32 0>506 %r = select <2 x i1> %a, <2 x i1> %b, <2 x i1> %s507 ret <2 x i1> %r508}509 510!0 = !{!"function_entry_count", i64 1000}511!1 = !{!"branch_weights", i32 2, i32 3}512!2 = !{!"branch_weights", i32 5, i32 7}513 514;.515; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}516; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}517;.518