brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.6 KiB · 82b069b Raw
332 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_or_icmp(i32 %x, i32 %y, i32 %z) {5; CHECK-LABEL: @select_or_icmp(6; CHECK-NEXT:    ret i32 [[Z:%.*]]7;8  %A = icmp ne i32 %x, %z9  %B = icmp ne i32 %y, %z10  %C = or i1 %A, %B11  %D = select i1 %C, i32 %z, i32 %x12  ret i32 %D13}14 15define <2 x i8> @select_or_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {16; CHECK-LABEL: @select_or_icmp_vec(17; CHECK-NEXT:    ret <2 x i8> [[Z:%.*]]18;19  %A = icmp ne <2 x i8> %x, %z20  %B = icmp ne <2 x i8> %y, %z21  %C = or <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_or_icmp2(i32 %x, i32 %y, i32 %z) {27; CHECK-LABEL: @select_or_icmp2(28; CHECK-NEXT:    ret i32 [[Z:%.*]]29;30  %A = icmp ne i32 %x, %z31  %B = icmp ne i32 %y, %z32  %C = or i1 %A, %B33  %D = select i1 %C, i32 %z, i32 %y34  ret i32 %D35}36 37define i32 @select_or_icmp_alt(i32 %x, i32 %y, i32 %z) {38; CHECK-LABEL: @select_or_icmp_alt(39; CHECK-NEXT:    ret i32 [[X:%.*]]40;41  %A = icmp ne i32 %x, %z42  %B = icmp ne i32 %y, %z43  %C = or i1 %A, %B44  %D = select i1 %C, i32 %x, i32 %z45  ret i32 %D46}47 48define i32 @select_or_icmp_alt2(i32 %x, i32 %y, i32 %z) {49; CHECK-LABEL: @select_or_icmp_alt2(50; CHECK-NEXT:    ret i32 [[Y:%.*]]51;52  %A = icmp ne i32 %x, %z53  %B = icmp ne i32 %y, %z54  %C = or i1 %A, %B55  %D = select i1 %C, i32 %y, i32 %z56  ret i32 %D57}58 59define i32 @select_or_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {60; CHECK-LABEL: @select_or_icmp_inv_alt(61; CHECK-NEXT:    ret i32 [[X:%.*]]62;63  %A = icmp ne i32 %z, %x64  %B = icmp ne i32 %z, %y65  %C = or i1 %A, %B66  %D = select i1 %C, i32 %x, i32 %z67  ret i32 %D68}69 70define i32 @select_or_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {71; CHECK-LABEL: @select_or_inv_icmp_alt(72; CHECK-NEXT:    ret i32 [[X:%.*]]73;74  %A = icmp ne i32 %z, %x75  %B = icmp ne i32 %z, %y76  %C = or i1 %B, %A77  %D = select i1 %C, i32 %x, i32 %z78  ret i32 %D79}80 81define <2 x i8> @select_or_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {82; CHECK-LABEL: @select_or_icmp_alt_vec(83; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]84;85  %A = icmp ne <2 x i8> %x, %z86  %B = icmp ne <2 x i8> %y, %z87  %C = or <2 x i1> %A, %B88  %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z89  ret <2 x i8> %D90}91 92define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {93; CHECK-LABEL: @select_or_inv_icmp(94; CHECK-NEXT:    ret i32 [[Z:%.*]]95;96  %A = icmp ne i32 %x, %z97  %B = icmp ne i32 %y, %z98  %C = or i1 %B , %A99  %D = select i1 %C, i32 %z, i32 %x100  ret i32 %D101}102 103define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {104; CHECK-LABEL: @select_or_icmp_inv(105; CHECK-NEXT:    ret i32 [[Z:%.*]]106;107  %A = icmp ne i32 %z, %x108  %B = icmp ne i32 %z, %y109  %C = or 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:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]120; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[X:%.*]], i32 [[Z]], !prof [[PROF1:![0-9]+]]121; CHECK-NEXT:    ret i32 [[D]]122;123  %A = icmp eq i32 %x, %z124  %B = icmp ne i32 %y, %z125  %C = or i1 %A, %B126  %D = select i1 %C, i32 %z, i32 %x, !prof !1127  ret i32 %D128}129 130define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) !prof !0 {131; CHECK-LABEL: @select_and_icmp_pred_bad_2(132; CHECK-NEXT:    ret i32 [[Z:%.*]]133;134  %A = icmp ne i32 %x, %z135  %B = icmp eq i32 %y, %z136  %C = or 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) !prof !0 {142; CHECK-LABEL: @select_and_icmp_pred_bad_3(143; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]144; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X:%.*]], !prof [[PROF2:![0-9]+]]145; CHECK-NEXT:    ret i32 [[D]]146;147  %A = icmp eq i32 %x, %z148  %B = icmp eq i32 %y, %z149  %C = or i1 %A, %B150  %D = select i1 %C, i32 %z, i32 %x, !prof !1151  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_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]157; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[X:%.*]], i32 [[Z]]158; CHECK-NEXT:    ret i32 [[D]]159;160  %A = icmp ne i32 %x, %z161  %B = icmp ne i32 %y, %z162  %C = and i1 %A, %B163  %D = select i1 %C, i32 %z, i32 %x164  ret i32 %D165}166 167define i32 @select_or_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {168; CHECK-LABEL: @select_or_icmp_alt_bad_1(169; CHECK-NEXT:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]170; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X:%.*]]171; CHECK-NEXT:    ret i32 [[D]]172;173  %A = icmp eq i32 %x, %z174  %B = icmp ne i32 %y, %z175  %C = or i1 %A, %B176  %D = select i1 %C, i32 %x, i32 %z177  ret i32 %D178}179 180define i32 @select_or_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {181; CHECK-LABEL: @select_or_icmp_alt_bad_2(182; CHECK-NEXT:    ret i32 [[X:%.*]]183;184  %A = icmp ne i32 %x, %z185  %B = icmp eq i32 %y, %z186  %C = or i1 %A, %B187  %D = select i1 %C, i32 %x, i32 %z188  ret i32 %D189}190 191define i32 @select_or_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {192; CHECK-LABEL: @select_or_icmp_alt_bad_3(193; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]194; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[X:%.*]], i32 [[Z]]195; CHECK-NEXT:    ret i32 [[D]]196;197  %A = icmp eq i32 %x, %z198  %B = icmp eq i32 %y, %z199  %C = or i1 %A, %B200  %D = select i1 %C, i32 %x, i32 %z201  ret i32 %D202}203 204define i32 @select_or_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {205; CHECK-LABEL: @select_or_icmp_alt_bad_4(206; CHECK-NEXT:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]207; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X:%.*]]208; CHECK-NEXT:    ret i32 [[D]]209;210  %A = icmp ne i32 %x, %z211  %B = icmp ne i32 %y, %z212  %C = and i1 %A, %B213  %D = select i1 %C, i32 %x, i32 %z214  ret i32 %D215}216 217 218; Negative tests219 220define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {221; CHECK-LABEL: @select_or_icmp_bad_true_val(222; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]223; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]224; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]225; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]226; CHECK-NEXT:    ret i32 [[D]]227;228  %A = icmp ne i32 %x, %z229  %B = icmp ne i32 %y, %z230  %C = or i1 %A, %B231  %D = select i1 %C, i32 %k, i32 %x232  ret i32 %D233}234 235define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {236; CHECK-LABEL: @select_or_icmp_bad_false_val(237; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]238; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]239; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]240; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]241; CHECK-NEXT:    ret i32 [[D]]242;243  %A = icmp ne i32 %x, %z244  %B = icmp ne i32 %y, %z245  %C = or i1 %A, %B246  %D = select i1 %C, i32 %z, i32 %k247  ret i32 %D248}249 250define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {251; CHECK-LABEL: @select_or_icmp_bad_op(252; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]]253; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]254; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]255; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]256; CHECK-NEXT:    ret i32 [[D]]257;258  %A = icmp ne i32 %k, %z259  %B = icmp ne i32 %y, %z260  %C = or i1 %A, %B261  %D = select i1 %C, i32 %z, i32 %x262  ret i32 %D263}264 265define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {266; CHECK-LABEL: @select_or_icmp_bad_op_2(267; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]268; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]269; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]270; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]271; CHECK-NEXT:    ret i32 [[D]]272;273  %A = icmp ne i32 %x, %k274  %B = icmp ne i32 %y, %z275  %C = or i1 %A, %B276  %D = select i1 %C, i32 %z, i32 %x277  ret i32 %D278}279 280define i32 @select_or_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {281; CHECK-LABEL: @select_or_icmp_alt_bad_5(282; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]283; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]284; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]285; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]286; CHECK-NEXT:    ret i32 [[D]]287;288  %A = icmp ne i32 %x, %k289  %B = icmp ne i32 %y, %z290  %C = or i1 %A, %B291  %D = select i1 %C, i32 %x, i32 %z292  ret i32 %D293}294 295define i32 @select_or_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {296; CHECK-LABEL: @select_or_icmp_alt_bad_true_val(297; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]298; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]299; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]300; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]301; CHECK-NEXT:    ret i32 [[D]]302;303  %A = icmp ne i32 %x, %z304  %B = icmp ne i32 %y, %z305  %C = or i1 %A, %B306  %D = select i1 %C, i32 %k, i32 %z307  ret i32 %D308}309 310define i32 @select_or_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {311; CHECK-LABEL: @select_or_icmp_alt_bad_false_val(312; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]313; CHECK-NEXT:    [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]314; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]315; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]316; CHECK-NEXT:    ret i32 [[D]]317;318  %A = icmp ne i32 %x, %z319  %B = icmp ne i32 %y, %z320  %C = or i1 %A, %B321  %D = select i1 %C, i32 %x, i32 %k322  ret i32 %D323}324 325!0 = !{!"function_entry_count", i64 1000}326!1 = !{!"branch_weights", i32 2, i32 3}327;.328; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}329; CHECK: [[PROF1]] = !{!"branch_weights", i32 3, i32 2}330; CHECK: [[PROF2]] = !{!"branch_weights", i32 2, i32 3}331;.332