191 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=instcombine -S %s | FileCheck %s3 4define i8 @select_icmp_eq_pow2(i8 %x) {5; CHECK-LABEL: define i8 @select_icmp_eq_pow2(6; CHECK-SAME: i8 [[X:%.*]]) {7; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], -58; CHECK-NEXT: ret i8 [[SEL]]9;10 %and = and i8 %x, 411 %icmp = icmp eq i8 %and, 012 %xor = xor i8 %x, 413 %sel = select i1 %icmp, i8 %x, i8 %xor14 ret i8 %sel15}16 17define i8 @select_icmp_eq_pow2_flipped(i8 %x) {18; CHECK-LABEL: define i8 @select_icmp_eq_pow2_flipped(19; CHECK-SAME: i8 [[X:%.*]]) {20; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], 421; CHECK-NEXT: ret i8 [[SEL]]22;23 %and = and i8 %x, 424 %icmp = icmp eq i8 %and, 025 %xor = xor i8 %x, 426 %sel = select i1 %icmp, i8 %xor, i8 %x27 ret i8 %sel28}29 30define i8 @select_icmp_eq_not_pow2(i8 %x) {31; CHECK-LABEL: define i8 @select_icmp_eq_not_pow2(32; CHECK-SAME: i8 [[X:%.*]]) {33; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 534; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i8 [[AND]], 035; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 536; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]]37; CHECK-NEXT: ret i8 [[SEL]]38;39 %and = and i8 %x, 540 %icmp = icmp eq i8 %and, 041 %xor = xor i8 %x, 542 %sel = select i1 %icmp, i8 %x, i8 %xor43 ret i8 %sel44}45 46define i8 @select_icmp_ne_pow2(i8 %x) {47; CHECK-LABEL: define i8 @select_icmp_ne_pow2(48; CHECK-SAME: i8 [[X:%.*]]) {49; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], -550; CHECK-NEXT: ret i8 [[SEL]]51;52 %and = and i8 %x, 453 %icmp = icmp ne i8 %and, 054 %xor = xor i8 %x, 455 %sel = select i1 %icmp, i8 %xor, i8 %x56 ret i8 %sel57}58 59define i8 @select_icmp_ne_pow2_flipped(i8 %x) {60; CHECK-LABEL: define i8 @select_icmp_ne_pow2_flipped(61; CHECK-SAME: i8 [[X:%.*]]) {62; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], 463; CHECK-NEXT: ret i8 [[SEL]]64;65 %and = and i8 %x, 466 %icmp = icmp ne i8 %and, 067 %xor = xor i8 %x, 468 %sel = select i1 %icmp, i8 %x, i8 %xor69 ret i8 %sel70}71 72define i8 @select_icmp_ne_not_pow2(i8 %x) {73; CHECK-LABEL: define i8 @select_icmp_ne_not_pow2(74; CHECK-SAME: i8 [[X:%.*]]) {75; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 576; CHECK-NEXT: [[ICMP_NOT:%.*]] = icmp eq i8 [[AND]], 077; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 578; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP_NOT]], i8 [[X]], i8 [[XOR]]79; CHECK-NEXT: ret i8 [[SEL]]80;81 %and = and i8 %x, 582 %icmp = icmp ne i8 %and, 083 %xor = xor i8 %x, 584 %sel = select i1 %icmp, i8 %xor, i8 %x85 ret i8 %sel86}87 88define i8 @select_icmp_slt_zero_smin(i8 %x) {89; CHECK-LABEL: define i8 @select_icmp_slt_zero_smin(90; CHECK-SAME: i8 [[X:%.*]]) {91; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], -12892; CHECK-NEXT: ret i8 [[SEL]]93;94 %icmp = icmp slt i8 %x, 095 %xor = xor i8 %x, -12896 %sel = select i1 %icmp, i8 %x, i8 %xor97 ret i8 %sel98}99 100define i8 @select_icmp_slt_zero_smin_flipped(i8 %x) {101; CHECK-LABEL: define i8 @select_icmp_slt_zero_smin_flipped(102; CHECK-SAME: i8 [[X:%.*]]) {103; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], 127104; CHECK-NEXT: ret i8 [[SEL]]105;106 %icmp = icmp slt i8 %x, 0107 %xor = xor i8 %x, -128108 %sel = select i1 %icmp, i8 %xor, i8 %x109 ret i8 %sel110}111 112define i8 @select_icmp_slt_not_zero(i8 %x) {113; CHECK-LABEL: define i8 @select_icmp_slt_not_zero(114; CHECK-SAME: i8 [[X:%.*]]) {115; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i8 [[X]], 1116; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -128117; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]]118; CHECK-NEXT: ret i8 [[SEL]]119;120 %icmp = icmp slt i8 %x, 1121 %xor = xor i8 %x, -128122 %sel = select i1 %icmp, i8 %x, i8 %xor123 ret i8 %sel124}125 126define i8 @select_icmp_slt_not_smin(i8 %x) {127; CHECK-LABEL: define i8 @select_icmp_slt_not_smin(128; CHECK-SAME: i8 [[X:%.*]]) {129; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i8 [[X]], 0130; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -127131; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]]132; CHECK-NEXT: ret i8 [[SEL]]133;134 %icmp = icmp slt i8 %x, 0135 %xor = xor i8 %x, -127136 %sel = select i1 %icmp, i8 %x, i8 %xor137 ret i8 %sel138}139 140define i8 @select_icmp_sgt_allones_smin(i8 %x) {141; CHECK-LABEL: define i8 @select_icmp_sgt_allones_smin(142; CHECK-SAME: i8 [[X:%.*]]) {143; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], 127144; CHECK-NEXT: ret i8 [[SEL]]145;146 %icmp = icmp sgt i8 %x, 255147 %xor = xor i8 %x, -128148 %sel = select i1 %icmp, i8 %x, i8 %xor149 ret i8 %sel150}151 152define i8 @select_icmp_sgt_allones_smin_flipped(i8 %x) {153; CHECK-LABEL: define i8 @select_icmp_sgt_allones_smin_flipped(154; CHECK-SAME: i8 [[X:%.*]]) {155; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], -128156; CHECK-NEXT: ret i8 [[SEL]]157;158 %icmp = icmp sgt i8 %x, 255159 %xor = xor i8 %x, -128160 %sel = select i1 %icmp, i8 %xor, i8 %x161 ret i8 %sel162}163 164define i8 @select_icmp_sgt_not_allones(i8 %x) {165; CHECK-LABEL: define i8 @select_icmp_sgt_not_allones(166; CHECK-SAME: i8 [[X:%.*]]) {167; CHECK-NEXT: [[ICMP:%.*]] = icmp sgt i8 [[X]], -2168; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -128169; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]]170; CHECK-NEXT: ret i8 [[SEL]]171;172 %icmp = icmp sgt i8 %x, 254173 %xor = xor i8 %x, -128174 %sel = select i1 %icmp, i8 %x, i8 %xor175 ret i8 %sel176}177 178define i8 @select_icmp_sgt_not_smin(i8 %x) {179; CHECK-LABEL: define i8 @select_icmp_sgt_not_smin(180; CHECK-SAME: i8 [[X:%.*]]) {181; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -127182; CHECK-NEXT: [[ICMP1:%.*]] = icmp slt i8 [[X]], 0183; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP1]], i8 [[XOR]], i8 [[X]]184; CHECK-NEXT: ret i8 [[SEL]]185;186 %icmp = icmp sgt i8 %x, 255187 %xor = xor i8 %x, -127188 %sel = select i1 %icmp, i8 %x, i8 %xor189 ret i8 %sel190}191