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