brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.3 KiB · dc0e3b5 Raw
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