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