brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.6 KiB · 26c04ad Raw
333 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 4define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {5; CHECK-LABEL: @select_and_icmp(6; CHECK-NEXT:    ret i32 [[X:%.*]]7;8  %A = icmp eq i32 %x, %z9  %B = icmp eq i32 %y, %z10  %C = and i1 %A, %B11  %D = select i1 %C, i32 %z, i32 %x12  ret i32 %D13}14 15define <2 x i8> @select_and_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {16; CHECK-LABEL: @select_and_icmp_vec(17; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]18;19  %A = icmp eq <2 x i8> %x, %z20  %B = icmp eq <2 x i8> %y, %z21  %C = and <2 x i1> %A, %B22  %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x23  ret <2 x i8> %D24}25 26define i32 @select_and_icmp2(i32 %x, i32 %y, i32 %z) {27; CHECK-LABEL: @select_and_icmp2(28; CHECK-NEXT:    ret i32 [[Y:%.*]]29;30  %A = icmp eq i32 %x, %z31  %B = icmp eq i32 %y, %z32  %C = and i1 %A, %B33  %D = select i1 %C, i32 %z, i32 %y34  ret i32 %D35}36 37define i32 @select_and_icmp_alt(i32 %x, i32 %y, i32 %z) {38; CHECK-LABEL: @select_and_icmp_alt(39; CHECK-NEXT:    ret i32 [[Z:%.*]]40;41  %A = icmp eq i32 %x, %z42  %B = icmp eq i32 %y, %z43  %C = and i1 %A, %B44  %D = select i1 %C, i32 %x, i32 %z45  ret i32 %D46}47 48define i32 @select_and_icmp_alt2(i32 %x, i32 %y, i32 %z) {49; CHECK-LABEL: @select_and_icmp_alt2(50; CHECK-NEXT:    ret i32 [[Z:%.*]]51;52  %A = icmp eq i32 %x, %z53  %B = icmp eq i32 %y, %z54  %C = and i1 %A, %B55  %D = select i1 %C, i32 %y, i32 %z56  ret i32 %D57}58 59define i32 @select_and_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {60; CHECK-LABEL: @select_and_icmp_inv_alt(61; CHECK-NEXT:    ret i32 [[Z:%.*]]62;63  %A = icmp eq i32 %z, %x64  %B = icmp eq i32 %z, %y65  %C = and i1 %A, %B66  %D = select i1 %C, i32 %x, i32 %z67  ret i32 %D68}69 70define i32 @select_and_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {71; CHECK-LABEL: @select_and_inv_icmp_alt(72; CHECK-NEXT:    ret i32 [[Z:%.*]]73;74  %A = icmp eq i32 %x, %z75  %B = icmp eq i32 %y, %z76  %C = and i1 %B, %A77  %D = select i1 %C, i32 %x, i32 %z78  ret i32 %D79}80 81define i32 @select_and_inv_icmp(i32 %x, i32 %y, i32 %z) {82; CHECK-LABEL: @select_and_inv_icmp(83; CHECK-NEXT:    ret i32 [[X:%.*]]84;85  %A = icmp eq i32 %x, %z86  %B = icmp eq i32 %y, %z87  %C = and i1 %B , %A88  %D = select i1 %C, i32 %z, i32 %x89  ret i32 %D90}91 92define <2 x i8> @select_and_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {93; CHECK-LABEL: @select_and_icmp_alt_vec(94; CHECK-NEXT:    ret <2 x i8> [[Z:%.*]]95;96  %A = icmp eq <2 x i8> %x, %z97  %B = icmp eq <2 x i8> %y, %z98  %C = and <2 x i1> %A, %B99  %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z100  ret <2 x i8> %D101}102 103define i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {104; CHECK-LABEL: @select_and_icmp_inv(105; CHECK-NEXT:    ret i32 [[X:%.*]]106;107  %A = icmp eq i32 %z, %x108  %B = icmp eq i32 %z, %y109  %C = and i1 %A, %B110  %D = select i1 %C, i32 %z, i32 %x111  ret i32 %D112}113 114 115; Below used to be negative tests in InstSimplify, but are no more negative cases here116 117define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) !prof !0 {118; CHECK-LABEL: @select_and_icmp_pred_bad_1(119; CHECK-NEXT:    ret i32 [[X:%.*]]120;121  %A = icmp eq i32 %x, %z122  %B = icmp ne i32 %y, %z123  %C = and i1 %A, %B124  %D = select i1 %C, i32 %z, i32 %x, !prof !1125  ret i32 %D126}127 128define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) !prof !0 {129; CHECK-LABEL: @select_and_icmp_pred_bad_2(130; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]131; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X:%.*]], !prof [[PROF1:![0-9]+]]132; CHECK-NEXT:    ret i32 [[D]]133;134  %A = icmp ne i32 %x, %z135  %B = icmp eq i32 %y, %z136  %C = and i1 %A, %B137  %D = select i1 %C, i32 %z, i32 %x, !prof !1138  ret i32 %D139}140 141define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {142; CHECK-LABEL: @select_and_icmp_pred_bad_3(143; CHECK-NEXT:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]144; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[X:%.*]], i32 [[Z]]145; CHECK-NEXT:    ret i32 [[D]]146;147  %A = icmp ne i32 %x, %z148  %B = icmp ne i32 %y, %z149  %C = and i1 %A, %B150  %D = select i1 %C, i32 %z, i32 %x151  ret i32 %D152}153 154define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {155; CHECK-LABEL: @select_and_icmp_pred_bad_4(156; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]157; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X:%.*]]158; CHECK-NEXT:    ret i32 [[D]]159;160  %A = icmp eq i32 %x, %z161  %B = icmp eq i32 %y, %z162  %C = or i1 %A, %B163  %D = select i1 %C, i32 %z, i32 %x164  ret i32 %D165}166 167define i32 @select_and_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {168; CHECK-LABEL: @select_and_icmp_alt_bad_1(169; CHECK-NEXT:    ret i32 [[Z:%.*]]170;171  %A = icmp eq i32 %x, %z172  %B = icmp ne i32 %y, %z173  %C = and i1 %A, %B174  %D = select i1 %C, i32 %x, i32 %z175  ret i32 %D176}177 178define i32 @select_and_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {179; CHECK-LABEL: @select_and_icmp_alt_bad_2(180; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]181; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[X:%.*]], i32 [[Z]]182; CHECK-NEXT:    ret i32 [[D]]183;184  %A = icmp ne i32 %x, %z185  %B = icmp eq i32 %y, %z186  %C = and i1 %A, %B187  %D = select i1 %C, i32 %x, i32 %z188  ret i32 %D189}190 191 192define i32 @select_and_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {193; CHECK-LABEL: @select_and_icmp_alt_bad_3(194; CHECK-NEXT:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]195; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X:%.*]]196; CHECK-NEXT:    ret i32 [[D]]197;198  %A = icmp ne i32 %x, %z199  %B = icmp ne i32 %y, %z200  %C = and i1 %A, %B201  %D = select i1 %C, i32 %x, i32 %z202  ret i32 %D203}204 205define i32 @select_and_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {206; CHECK-LABEL: @select_and_icmp_alt_bad_4(207; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]208; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[X:%.*]], i32 [[Z]]209; CHECK-NEXT:    ret i32 [[D]]210;211  %A = icmp eq i32 %x, %z212  %B = icmp eq i32 %y, %z213  %C = or i1 %A, %B214  %D = select i1 %C, i32 %x, i32 %z215  ret i32 %D216}217 218 219; Negative tests220 221define i32 @select_and_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {222; CHECK-LABEL: @select_and_icmp_bad_true_val(223; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]224; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]225; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]226; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]227; CHECK-NEXT:    ret i32 [[D]]228;229  %A = icmp eq i32 %x, %z230  %B = icmp eq i32 %y, %z231  %C = and i1 %A, %B232  %D = select i1 %C, i32 %k, i32 %x233  ret i32 %D234}235 236define i32 @select_and_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {237; CHECK-LABEL: @select_and_icmp_bad_false_val(238; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]239; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]240; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]241; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]242; CHECK-NEXT:    ret i32 [[D]]243;244  %A = icmp eq i32 %x, %z245  %B = icmp eq i32 %y, %z246  %C = and i1 %A, %B247  %D = select i1 %C, i32 %z, i32 %k248  ret i32 %D249}250 251define i32 @select_and_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {252; CHECK-LABEL: @select_and_icmp_bad_op(253; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[K:%.*]], [[Z:%.*]]254; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]255; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]256; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]257; CHECK-NEXT:    ret i32 [[D]]258;259  %A = icmp eq i32 %k, %z260  %B = icmp eq i32 %y, %z261  %C = and i1 %A, %B262  %D = select i1 %C, i32 %z, i32 %x263  ret i32 %D264}265 266define i32 @select_and_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {267; CHECK-LABEL: @select_and_icmp_bad_op_2(268; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]269; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]270; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]271; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]272; CHECK-NEXT:    ret i32 [[D]]273;274  %A = icmp eq i32 %x, %k275  %B = icmp eq i32 %y, %z276  %C = and i1 %A, %B277  %D = select i1 %C, i32 %z, i32 %x278  ret i32 %D279}280 281define i32 @select_and_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {282; CHECK-LABEL: @select_and_icmp_alt_bad_5(283; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]284; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]285; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]286; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]287; CHECK-NEXT:    ret i32 [[D]]288;289  %A = icmp eq i32 %x, %k290  %B = icmp eq i32 %y, %z291  %C = or i1 %A, %B292  %D = select i1 %C, i32 %x, i32 %z293  ret i32 %D294}295 296define i32 @select_and_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {297; CHECK-LABEL: @select_and_icmp_alt_bad_true_val(298; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]299; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]300; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]301; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]302; CHECK-NEXT:    ret i32 [[D]]303;304  %A = icmp eq i32 %x, %z305  %B = icmp eq i32 %y, %z306  %C = and i1 %A, %B307  %D = select i1 %C, i32 %k, i32 %z308  ret i32 %D309}310 311define i32 @select_and_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {312; CHECK-LABEL: @select_and_icmp_alt_bad_false_val(313; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]314; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]315; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]316; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]317; CHECK-NEXT:    ret i32 [[D]]318;319  %A = icmp eq i32 %x, %z320  %B = icmp eq i32 %y, %z321  %C = and i1 %A, %B322  %D = select i1 %C, i32 %x, i32 %k323  ret i32 %D324}325 326!0 = !{!"function_entry_count", i64 1000}327!1 = !{!"branch_weights", i32 2, i32 3}328 329;.330; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}331; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}332;.333