761 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4declare void @use(i1)5 6define i1 @logic_and_logic_or_1(i1 %c, i1 %a, i1 %b) {7; CHECK-LABEL: @logic_and_logic_or_1(8; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]9; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false10; CHECK-NEXT: ret i1 [[OR]]11;12 %ac = select i1 %c, i1 %a, i1 false13 %bc = select i1 %c, i1 %b, i1 false14 %or = select i1 %ac, i1 true, i1 %bc15 ret i1 %or16}17 18define i1 @logic_and_logic_or_2(i1 %c, i1 %a, i1 %b) {19; CHECK-LABEL: @logic_and_logic_or_2(20; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]21; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false22; CHECK-NEXT: ret i1 [[OR]]23;24 %ac = select i1 %a, i1 %c, i1 false25 %bc = select i1 %c, i1 %b, i1 false26 %or = select i1 %ac, i1 true, i1 %bc27 ret i1 %or28}29 30define i1 @logic_and_logic_or_3(i1 %c, i1 %a, i1 %b) {31; CHECK-LABEL: @logic_and_logic_or_3(32; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]33; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false34; CHECK-NEXT: ret i1 [[OR]]35;36 %ac = select i1 %a, i1 %c, i1 false37 %bc = select i1 %b, i1 %c, i1 false38 %or = select i1 %ac, i1 true, i1 %bc39 ret i1 %or40}41 42define i1 @logic_and_logic_or_4(i1 %c, i1 %a, i1 %b) {43; CHECK-LABEL: @logic_and_logic_or_4(44; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]45; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false46; CHECK-NEXT: ret i1 [[OR]]47;48 %ac = select i1 %c, i1 %a, i1 false49 %bc = select i1 %b, i1 %c, i1 false50 %or = select i1 %ac, i1 true, i1 %bc51 ret i1 %or52}53 54define i1 @logic_and_logic_or_5(i1 %c, i1 %a, i1 %b) {55; CHECK-LABEL: @logic_and_logic_or_5(56; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]57; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false58; CHECK-NEXT: ret i1 [[OR]]59;60 %ac = select i1 %c, i1 %a, i1 false61 %bc = select i1 %c, i1 %b, i1 false62 %or = select i1 %bc, i1 true, i1 %ac63 ret i1 %or64}65 66define i1 @logic_and_logic_or_6(i1 %c, i1 %a, i1 %b) {67; CHECK-LABEL: @logic_and_logic_or_6(68; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]69; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false70; CHECK-NEXT: ret i1 [[OR]]71;72 %ac = select i1 %a, i1 %c, i1 false73 %bc = select i1 %c, i1 %b, i1 false74 %or = select i1 %bc, i1 true, i1 %ac75 ret i1 %or76}77 78define i1 @logic_and_logic_or_7(i1 %c, i1 %a, i1 %b) {79; CHECK-LABEL: @logic_and_logic_or_7(80; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]81; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false82; CHECK-NEXT: ret i1 [[OR]]83;84 %ac = select i1 %a, i1 %c, i1 false85 %bc = select i1 %b, i1 %c, i1 false86 %or = select i1 %bc, i1 true, i1 %ac87 ret i1 %or88}89 90define i1 @logic_and_logic_or_8(i1 %c, i1 %a, i1 %b) {91; CHECK-LABEL: @logic_and_logic_or_8(92; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]93; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false94; CHECK-NEXT: ret i1 [[OR]]95;96 %ac = select i1 %c, i1 %a, i1 false97 %bc = select i1 %b, i1 %c, i1 false98 %or = select i1 %bc, i1 true, i1 %ac99 ret i1 %or100}101 102define <3 x i1> @logic_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {103; CHECK-LABEL: @logic_and_logic_or_vector(104; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]105; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer106; CHECK-NEXT: ret <3 x i1> [[OR]]107;108 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false>109 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>110 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc111 ret <3 x i1> %or112}113 114define <3 x i1> @logic_and_logic_or_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {115; CHECK-LABEL: @logic_and_logic_or_vector_poison1(116; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]117; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer118; CHECK-NEXT: ret <3 x i1> [[OR]]119;120 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false>121 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>122 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 poison>, <3 x i1> %bc123 ret <3 x i1> %or124}125 126define <3 x i1> @logic_and_logic_or_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {127; CHECK-LABEL: @logic_and_logic_or_vector_poison2(128; CHECK-NEXT: [[AC:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[A:%.*]], <3 x i1> <i1 false, i1 poison, i1 false>129; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[C]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer130; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[AC]], <3 x i1> splat (i1 true), <3 x i1> [[BC]]131; CHECK-NEXT: ret <3 x i1> [[OR]]132;133 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 poison, i1 false>134 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>135 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc136 ret <3 x i1> %or137}138 139define <3 x i1> @logic_and_logic_or_vector_poison3(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {140; CHECK-LABEL: @logic_and_logic_or_vector_poison3(141; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]142; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[BC]], <3 x i1> <i1 poison, i1 false, i1 false>143; CHECK-NEXT: ret <3 x i1> [[OR]]144;145 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false>146 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 poison, i1 false, i1 false>147 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc148 ret <3 x i1> %or149}150 151; negative test: not one use for both op152 153define i1 @logic_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) {154; CHECK-LABEL: @logic_and_logic_or_not_one_use(155; CHECK-NEXT: [[AC:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 false156; CHECK-NEXT: [[BC:%.*]] = select i1 [[C]], i1 [[B:%.*]], i1 false157; CHECK-NEXT: [[OR:%.*]] = select i1 [[AC]], i1 true, i1 [[BC]]158; CHECK-NEXT: call void @use(i1 [[AC]])159; CHECK-NEXT: call void @use(i1 [[BC]])160; CHECK-NEXT: ret i1 [[OR]]161;162 %ac = select i1 %c, i1 %a, i1 false163 %bc = select i1 %c, i1 %b, i1 false164 %or = select i1 %ac, i1 true, i1 %bc165 call void @use(i1 %ac)166 call void @use(i1 %bc)167 ret i1 %or168}169 170define i1 @and_logic_and_logic_or_1(i1 %c, i1 %a, i1 %b) {171; CHECK-LABEL: @and_logic_and_logic_or_1(172; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]173; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false174; CHECK-NEXT: ret i1 [[OR]]175;176 %ac = and i1 %c, %a177 %bc = select i1 %c, i1 %b, i1 false178 %or = select i1 %ac, i1 true, i1 %bc179 ret i1 %or180}181 182define i1 @and_logic_and_logic_or_2(i1 %c, i1 %a, i1 %b) {183; CHECK-LABEL: @and_logic_and_logic_or_2(184; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]185; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false186; CHECK-NEXT: ret i1 [[OR]]187;188 %ac = and i1 %c, %a189 %bc = select i1 %b, i1 %c, i1 false190 %or = select i1 %ac, i1 true, i1 %bc191 ret i1 %or192}193 194define i1 @and_logic_and_logic_or_3(i1 %c, i1 %a, i1 %b) {195; CHECK-LABEL: @and_logic_and_logic_or_3(196; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]197; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false198; CHECK-NEXT: ret i1 [[OR]]199;200 %ac = and i1 %a, %c201 %bc = select i1 %c, i1 %b, i1 false202 %or = select i1 %ac, i1 true, i1 %bc203 ret i1 %or204}205 206define i1 @and_logic_and_logic_or_4(i1 %c, i1 %a, i1 %b) {207; CHECK-LABEL: @and_logic_and_logic_or_4(208; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]209; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false210; CHECK-NEXT: ret i1 [[OR]]211;212 %ac = and i1 %a, %c213 %bc = select i1 %b, i1 %c, i1 false214 %or = select i1 %ac, i1 true, i1 %bc215 ret i1 %or216}217 218define i1 @and_logic_and_logic_or_5(i1 %c, i1 %a, i1 %b) {219; CHECK-LABEL: @and_logic_and_logic_or_5(220; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]221; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false222; CHECK-NEXT: ret i1 [[OR]]223;224 %ac = and i1 %c, %a225 %bc = select i1 %c, i1 %b, i1 false226 %or = select i1 %bc, i1 true, i1 %ac227 ret i1 %or228}229 230define i1 @and_logic_and_logic_or_6(i1 %c, i1 %a, i1 %b) {231; CHECK-LABEL: @and_logic_and_logic_or_6(232; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]233; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]234; CHECK-NEXT: ret i1 [[OR]]235;236 %ac = and i1 %c, %a237 %bc = select i1 %b, i1 %c, i1 false238 %or = select i1 %bc, i1 true, i1 %ac239 ret i1 %or240}241 242define i1 @and_logic_and_logic_or_7(i1 %c, i1 %a, i1 %b) {243; CHECK-LABEL: @and_logic_and_logic_or_7(244; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]245; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false246; CHECK-NEXT: ret i1 [[OR]]247;248 %ac = and i1 %a, %c249 %bc = select i1 %c, i1 %b, i1 false250 %or = select i1 %bc, i1 true, i1 %ac251 ret i1 %or252}253 254define i1 @and_logic_and_logic_or_8(i1 %c, i1 %a, i1 %b) {255; CHECK-LABEL: @and_logic_and_logic_or_8(256; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]257; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]258; CHECK-NEXT: ret i1 [[OR]]259;260 %ac = and i1 %a, %c261 %bc = select i1 %b, i1 %c, i1 false262 %or = select i1 %bc, i1 true, i1 %ac263 ret i1 %or264}265 266define <3 x i1> @and_logic_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {267; CHECK-LABEL: @and_logic_and_logic_or_vector(268; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]269; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer270; CHECK-NEXT: ret <3 x i1> [[OR]]271;272 %ac = and <3 x i1> %c, %a273 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>274 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc275 ret <3 x i1> %or276}277 278define <3 x i1> @and_logic_and_logic_or_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {279; CHECK-LABEL: @and_logic_and_logic_or_vector_poison1(280; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]281; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[BC]], <3 x i1> <i1 false, i1 poison, i1 false>282; CHECK-NEXT: ret <3 x i1> [[OR]]283;284 %ac = and <3 x i1> %c, %a285 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 poison, i1 false>286 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc287 ret <3 x i1> %or288}289 290define <3 x i1> @and_logic_and_logic_or_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {291; CHECK-LABEL: @and_logic_and_logic_or_vector_poison2(292; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]293; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer294; CHECK-NEXT: ret <3 x i1> [[OR]]295;296 %ac = and <3 x i1> %c, %a297 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>298 %or = select <3 x i1> %ac, <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> %bc299 ret <3 x i1> %or300}301 302define i1 @and_logic_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) {303; CHECK-LABEL: @and_logic_and_logic_or_not_one_use(304; CHECK-NEXT: [[AC:%.*]] = and i1 [[A:%.*]], [[C:%.*]]305; CHECK-NEXT: [[BC:%.*]] = select i1 [[B:%.*]], i1 [[C]], i1 false306; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[C]], i1 [[AC]]307; CHECK-NEXT: call void @use(i1 [[AC]])308; CHECK-NEXT: call void @use(i1 [[BC]])309; CHECK-NEXT: ret i1 [[OR]]310;311 %ac = and i1 %a, %c312 %bc = select i1 %b, i1 %c, i1 false313 %or = select i1 %bc, i1 true, i1 %ac314 call void @use(i1 %ac)315 call void @use(i1 %bc)316 ret i1 %or317}318 319define i1 @and_and_logic_or_1(i1 %c, i1 %a, i1 %b) {320; CHECK-LABEL: @and_and_logic_or_1(321; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]322; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]323; CHECK-NEXT: ret i1 [[OR]]324;325 %ac = and i1 %c, %a326 %bc = and i1 %c, %b327 %or = select i1 %ac, i1 true, i1 %bc328 ret i1 %or329}330 331define i1 @and_and_logic_or_2(i1 %c, i1 %a, i1 %b) {332; CHECK-LABEL: @and_and_logic_or_2(333; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]334; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]335; CHECK-NEXT: ret i1 [[OR]]336;337 %ac = and i1 %a, %c338 %bc = and i1 %c, %b339 %or = select i1 %bc, i1 true, i1 %ac340 ret i1 %or341}342 343define <3 x i1> @and_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {344; CHECK-LABEL: @and_and_logic_or_vector(345; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]346; CHECK-NEXT: [[OR:%.*]] = and <3 x i1> [[C:%.*]], [[TMP1]]347; CHECK-NEXT: ret <3 x i1> [[OR]]348;349 %ac = and <3 x i1> %c, %a350 %bc = and <3 x i1> %c, %b351 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc352 ret <3 x i1> %or353}354 355define <3 x i1> @and_and_logic_or_vector_poison(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {356; CHECK-LABEL: @and_and_logic_or_vector_poison(357; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]358; CHECK-NEXT: [[OR:%.*]] = and <3 x i1> [[C:%.*]], [[TMP1]]359; CHECK-NEXT: ret <3 x i1> [[OR]]360;361 %ac = and <3 x i1> %c, %a362 %bc = and <3 x i1> %c, %b363 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %bc364 ret <3 x i1> %or365}366 367define i1 @and_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) {368; CHECK-LABEL: @and_and_logic_or_not_one_use(369; CHECK-NEXT: [[AC:%.*]] = and i1 [[A:%.*]], [[C:%.*]]370; CHECK-NEXT: [[BC:%.*]] = and i1 [[C]], [[B:%.*]]371; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[C]], i1 [[AC]]372; CHECK-NEXT: call void @use(i1 [[AC]])373; CHECK-NEXT: call void @use(i1 [[BC]])374; CHECK-NEXT: ret i1 [[OR]]375;376 %ac = and i1 %a, %c377 %bc = and i1 %c, %b378 %or = select i1 %bc, i1 true, i1 %ac379 call void @use(i1 %ac)380 call void @use(i1 %bc)381 ret i1 %or382}383 384define i1 @logic_or_logic_and_1(i1 %c, i1 %a, i1 %b) {385; CHECK-LABEL: @logic_or_logic_and_1(386; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false387; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]388; CHECK-NEXT: ret i1 [[OR]]389;390 %ac = select i1 %c, i1 true, i1 %a391 %bc = select i1 %c, i1 true, i1 %b392 %or = select i1 %ac, i1 %bc, i1 false393 ret i1 %or394}395 396define i1 @logic_or_logic_and_2(i1 %c, i1 %a, i1 %b) {397; CHECK-LABEL: @logic_or_logic_and_2(398; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false399; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]400; CHECK-NEXT: ret i1 [[OR]]401;402 %ac = select i1 %a, i1 true, i1 %c403 %bc = select i1 %c, i1 true, i1 %b404 %or = select i1 %ac, i1 %bc, i1 false405 ret i1 %or406}407 408define i1 @logic_or_logic_and_3(i1 %c, i1 %a, i1 %b) {409; CHECK-LABEL: @logic_or_logic_and_3(410; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false411; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C:%.*]]412; CHECK-NEXT: ret i1 [[OR]]413;414 %ac = select i1 %a, i1 true, i1 %c415 %bc = select i1 %b, i1 true, i1 %c416 %or = select i1 %ac, i1 %bc, i1 false417 ret i1 %or418}419 420define i1 @logic_or_logic_and_4(i1 %c, i1 %a, i1 %b) {421; CHECK-LABEL: @logic_or_logic_and_4(422; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false423; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]424; CHECK-NEXT: ret i1 [[OR]]425;426 %ac = select i1 %c, i1 true, i1 %a427 %bc = select i1 %b, i1 true, i1 %c428 %or = select i1 %ac, i1 %bc, i1 false429 ret i1 %or430}431 432define i1 @logic_or_logic_and_5(i1 %c, i1 %a, i1 %b) {433; CHECK-LABEL: @logic_or_logic_and_5(434; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false435; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]436; CHECK-NEXT: ret i1 [[OR]]437;438 %ac = select i1 %c, i1 true, i1 %a439 %bc = select i1 %c, i1 true, i1 %b440 %or = select i1 %bc, i1 %ac, i1 false441 ret i1 %or442}443 444define i1 @logic_or_logic_and_6(i1 %c, i1 %a, i1 %b) {445; CHECK-LABEL: @logic_or_logic_and_6(446; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false447; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]448; CHECK-NEXT: ret i1 [[OR]]449;450 %ac = select i1 %a, i1 true, i1 %c451 %bc = select i1 %c, i1 true, i1 %b452 %or = select i1 %bc, i1 %ac, i1 false453 ret i1 %or454}455 456define i1 @logic_or_logic_and_7(i1 %c, i1 %a, i1 %b) {457; CHECK-LABEL: @logic_or_logic_and_7(458; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false459; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C:%.*]]460; CHECK-NEXT: ret i1 [[OR]]461;462 %ac = select i1 %a, i1 true, i1 %c463 %bc = select i1 %b, i1 true, i1 %c464 %or = select i1 %bc, i1 %ac, i1 false465 ret i1 %or466}467 468define i1 @logic_or_logic_and_8(i1 %c, i1 %a, i1 %b) {469; CHECK-LABEL: @logic_or_logic_and_8(470; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false471; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]472; CHECK-NEXT: ret i1 [[OR]]473;474 %ac = select i1 %c, i1 true, i1 %a475 %bc = select i1 %b, i1 true, i1 %c476 %or = select i1 %bc, i1 %ac, i1 false477 ret i1 %or478}479 480define <3 x i1> @logic_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {481; CHECK-LABEL: @logic_or_logic_and_vector(482; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer483; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]484; CHECK-NEXT: ret <3 x i1> [[OR]]485;486 %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a487 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b488 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>489 ret <3 x i1> %or490}491 492define <3 x i1> @logic_or_logic_and_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {493; CHECK-LABEL: @logic_or_logic_and_vector_poison1(494; CHECK-NEXT: [[AC:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> [[A:%.*]]495; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[C]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]496; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[AC]], <3 x i1> [[BC]], <3 x i1> zeroinitializer497; CHECK-NEXT: ret <3 x i1> [[OR]]498;499 %ac = select <3 x i1> %c, <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> %a500 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b501 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>502 ret <3 x i1> %or503}504 505define <3 x i1> @logic_or_logic_and_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {506; CHECK-LABEL: @logic_or_logic_and_vector_poison2(507; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer508; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> [[BC]]509; CHECK-NEXT: ret <3 x i1> [[OR]]510;511 %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a512 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %b513 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>514 ret <3 x i1> %or515}516 517define <3 x i1> @logic_or_logic_and_vector_poison3(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {518; CHECK-LABEL: @logic_or_logic_and_vector_poison3(519; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer520; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]521; CHECK-NEXT: ret <3 x i1> [[OR]]522;523 %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a524 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b525 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 poison>526 ret <3 x i1> %or527}528 529; negative test: not one use for both op530 531define i1 @logic_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) {532; CHECK-LABEL: @logic_or_logic_and_not_one_use(533; CHECK-NEXT: [[AC:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[A:%.*]]534; CHECK-NEXT: [[BC:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[C]]535; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]]536; CHECK-NEXT: call void @use(i1 [[AC]])537; CHECK-NEXT: call void @use(i1 [[BC]])538; CHECK-NEXT: ret i1 [[OR]]539;540 %ac = select i1 %c, i1 true, i1 %a541 %bc = select i1 %b, i1 true, i1 %c542 %or = select i1 %bc, i1 %ac, i1 false543 call void @use(i1 %ac)544 call void @use(i1 %bc)545 ret i1 %or546}547 548define i1 @or_logic_or_logic_and_1(i1 %c, i1 %a, i1 %b) {549; CHECK-LABEL: @or_logic_or_logic_and_1(550; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false551; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]552; CHECK-NEXT: ret i1 [[OR]]553;554 %ac = or i1 %c, %a555 %bc = select i1 %c, i1 true, i1 %b556 %or = select i1 %ac, i1 %bc, i1 false557 ret i1 %or558}559 560define i1 @or_logic_or_logic_and_2(i1 %c, i1 %a, i1 %b) {561; CHECK-LABEL: @or_logic_or_logic_and_2(562; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false563; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]564; CHECK-NEXT: ret i1 [[OR]]565;566 %ac = or i1 %c, %a567 %bc = select i1 %b, i1 true, i1 %c568 %or = select i1 %ac, i1 %bc, i1 false569 ret i1 %or570}571 572define i1 @or_logic_or_logic_and_3(i1 %c, i1 %a, i1 %b) {573; CHECK-LABEL: @or_logic_or_logic_and_3(574; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false575; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]576; CHECK-NEXT: ret i1 [[OR]]577;578 %ac = or i1 %c, %a579 %bc = select i1 %c, i1 true, i1 %b580 %or = select i1 %bc, i1 %ac, i1 false581 ret i1 %or582}583 584define i1 @or_logic_or_logic_and_4(i1 %c, i1 %a, i1 %b) {585; CHECK-LABEL: @or_logic_or_logic_and_4(586; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false587; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]588; CHECK-NEXT: ret i1 [[OR]]589;590 %ac = or i1 %c, %a591 %bc = select i1 %b, i1 true, i1 %c592 %or = select i1 %bc, i1 %ac, i1 false593 ret i1 %or594}595 596define i1 @or_logic_or_logic_and_5(i1 %c, i1 %a, i1 %b) {597; CHECK-LABEL: @or_logic_or_logic_and_5(598; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false599; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]600; CHECK-NEXT: ret i1 [[OR]]601;602 %ac = or i1 %a, %c603 %bc = select i1 %c, i1 true, i1 %b604 %or = select i1 %ac, i1 %bc, i1 false605 ret i1 %or606}607 608define i1 @or_logic_or_logic_and_6(i1 %c, i1 %a, i1 %b) {609; CHECK-LABEL: @or_logic_or_logic_and_6(610; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false611; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]612; CHECK-NEXT: ret i1 [[OR]]613;614 %ac = or i1 %a, %c615 %bc = select i1 %b, i1 true, i1 %c616 %or = select i1 %ac, i1 %bc, i1 false617 ret i1 %or618}619 620define i1 @or_logic_or_logic_and_7(i1 %c, i1 %a, i1 %b) {621; CHECK-LABEL: @or_logic_or_logic_and_7(622; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false623; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]624; CHECK-NEXT: ret i1 [[OR]]625;626 %ac = or i1 %a, %c627 %bc = select i1 %c, i1 true, i1 %b628 %or = select i1 %bc, i1 %ac, i1 false629 ret i1 %or630}631 632define i1 @or_logic_or_logic_and_8(i1 %c, i1 %a, i1 %b) {633; CHECK-LABEL: @or_logic_or_logic_and_8(634; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false635; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]636; CHECK-NEXT: ret i1 [[OR]]637;638 %ac = or i1 %a, %c639 %bc = select i1 %b, i1 true, i1 %c640 %or = select i1 %bc, i1 %ac, i1 false641 ret i1 %or642}643 644define <3 x i1> @or_logic_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {645; CHECK-LABEL: @or_logic_or_logic_and_vector(646; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer647; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]648; CHECK-NEXT: ret <3 x i1> [[OR]]649;650 %ac = or <3 x i1> %c, %a651 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b652 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>653 ret <3 x i1> %or654}655 656define <3 x i1> @or_logic_or_logic_and_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {657; CHECK-LABEL: @or_logic_or_logic_and_vector_poison1(658; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer659; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> [[BC]]660; CHECK-NEXT: ret <3 x i1> [[OR]]661;662 %ac = or <3 x i1> %c, %a663 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %b664 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>665 ret <3 x i1> %or666}667 668define <3 x i1> @or_logic_or_logic_and_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {669; CHECK-LABEL: @or_logic_or_logic_and_vector_poison2(670; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer671; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]672; CHECK-NEXT: ret <3 x i1> [[OR]]673;674 %ac = or <3 x i1> %c, %a675 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b676 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 poison>677 ret <3 x i1> %or678}679 680define i1 @or_logic_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) {681; CHECK-LABEL: @or_logic_or_logic_and_not_one_use(682; CHECK-NEXT: [[AC:%.*]] = or i1 [[C:%.*]], [[A:%.*]]683; CHECK-NEXT: [[BC:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[C]]684; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]]685; CHECK-NEXT: call void @use(i1 [[AC]])686; CHECK-NEXT: call void @use(i1 [[BC]])687; CHECK-NEXT: ret i1 [[OR]]688;689 %ac = or i1 %c, %a690 %bc = select i1 %b, i1 true, i1 %c691 %or = select i1 %bc, i1 %ac, i1 false692 call void @use(i1 %ac)693 call void @use(i1 %bc)694 ret i1 %or695}696 697define i1 @or_or_logic_and_1(i1 %c, i1 %a, i1 %b) {698; CHECK-LABEL: @or_or_logic_and_1(699; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false700; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]701; CHECK-NEXT: ret i1 [[OR]]702;703 %ac = or i1 %c, %a704 %bc = or i1 %b, %c705 %or = select i1 %ac, i1 %bc, i1 false706 ret i1 %or707}708 709define i1 @or_or_logic_and_2(i1 %c, i1 %a, i1 %b) {710; CHECK-LABEL: @or_or_logic_and_2(711; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false712; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]713; CHECK-NEXT: ret i1 [[OR]]714;715 %ac = or i1 %c, %a716 %bc = or i1 %b, %c717 %or = select i1 %bc, i1 %ac, i1 false718 ret i1 %or719}720 721define <3 x i1> @or_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {722; CHECK-LABEL: @or_or_logic_and_vector(723; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer724; CHECK-NEXT: [[OR:%.*]] = or <3 x i1> [[C:%.*]], [[TMP1]]725; CHECK-NEXT: ret <3 x i1> [[OR]]726;727 %ac = or <3 x i1> %c, %a728 %bc = or <3 x i1> %b, %c729 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>730 ret <3 x i1> %or731}732 733define <3 x i1> @or_or_logic_and_vector_poison(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {734; CHECK-LABEL: @or_or_logic_and_vector_poison(735; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer736; CHECK-NEXT: [[OR:%.*]] = or <3 x i1> [[C:%.*]], [[TMP1]]737; CHECK-NEXT: ret <3 x i1> [[OR]]738;739 %ac = or <3 x i1> %c, %a740 %bc = or <3 x i1> %b, %c741 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 poison, i1 false, i1 false>742 ret <3 x i1> %or743}744 745define i1 @or_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) {746; CHECK-LABEL: @or_or_logic_and_not_one_use(747; CHECK-NEXT: [[AC:%.*]] = or i1 [[C:%.*]], [[A:%.*]]748; CHECK-NEXT: [[BC:%.*]] = or i1 [[B:%.*]], [[C]]749; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]]750; CHECK-NEXT: call void @use(i1 [[AC]])751; CHECK-NEXT: call void @use(i1 [[BC]])752; CHECK-NEXT: ret i1 [[OR]]753;754 %ac = or i1 %c, %a755 %bc = or i1 %b, %c756 %or = select i1 %bc, i1 %ac, i1 false757 call void @use(i1 %ac)758 call void @use(i1 %bc)759 ret i1 %or760}761