| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: opt -passes=instcombine -S %s | FileCheck %s |
| |
| define i8 @select_icmp_eq_pow2(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_eq_pow2( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], -5 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %and = and i8 %x, 4 |
| %icmp = icmp eq i8 %and, 0 |
| %xor = xor i8 %x, 4 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_eq_pow2_flipped(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_eq_pow2_flipped( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], 4 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %and = and i8 %x, 4 |
| %icmp = icmp eq i8 %and, 0 |
| %xor = xor i8 %x, 4 |
| %sel = select i1 %icmp, i8 %xor, i8 %x |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_eq_not_pow2(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_eq_not_pow2( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 5 |
| ; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i8 [[AND]], 0 |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 5 |
| ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]] |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %and = and i8 %x, 5 |
| %icmp = icmp eq i8 %and, 0 |
| %xor = xor i8 %x, 5 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_ne_pow2(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_ne_pow2( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], -5 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %and = and i8 %x, 4 |
| %icmp = icmp ne i8 %and, 0 |
| %xor = xor i8 %x, 4 |
| %sel = select i1 %icmp, i8 %xor, i8 %x |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_ne_pow2_flipped(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_ne_pow2_flipped( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], 4 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %and = and i8 %x, 4 |
| %icmp = icmp ne i8 %and, 0 |
| %xor = xor i8 %x, 4 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_ne_not_pow2(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_ne_not_pow2( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 5 |
| ; CHECK-NEXT: [[ICMP_NOT:%.*]] = icmp eq i8 [[AND]], 0 |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 5 |
| ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP_NOT]], i8 [[X]], i8 [[XOR]] |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %and = and i8 %x, 5 |
| %icmp = icmp ne i8 %and, 0 |
| %xor = xor i8 %x, 5 |
| %sel = select i1 %icmp, i8 %xor, i8 %x |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_slt_zero_smin(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_slt_zero_smin( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], -128 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp slt i8 %x, 0 |
| %xor = xor i8 %x, -128 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_slt_zero_smin_flipped(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_slt_zero_smin_flipped( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], 127 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp slt i8 %x, 0 |
| %xor = xor i8 %x, -128 |
| %sel = select i1 %icmp, i8 %xor, i8 %x |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_slt_not_zero(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_slt_not_zero( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i8 [[X]], 1 |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -128 |
| ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]] |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp slt i8 %x, 1 |
| %xor = xor i8 %x, -128 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_slt_not_smin(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_slt_not_smin( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i8 [[X]], 0 |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -127 |
| ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]] |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp slt i8 %x, 0 |
| %xor = xor i8 %x, -127 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_sgt_allones_smin(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_sgt_allones_smin( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = and i8 [[X]], 127 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp sgt i8 %x, 255 |
| %xor = xor i8 %x, -128 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_sgt_allones_smin_flipped(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_sgt_allones_smin_flipped( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[SEL:%.*]] = or i8 [[X]], -128 |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp sgt i8 %x, 255 |
| %xor = xor i8 %x, -128 |
| %sel = select i1 %icmp, i8 %xor, i8 %x |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_sgt_not_allones(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_sgt_not_allones( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[ICMP:%.*]] = icmp sgt i8 [[X]], -2 |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -128 |
| ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP]], i8 [[X]], i8 [[XOR]] |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp sgt i8 %x, 254 |
| %xor = xor i8 %x, -128 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |
| |
| define i8 @select_icmp_sgt_not_smin(i8 %x) { |
| ; CHECK-LABEL: define i8 @select_icmp_sgt_not_smin( |
| ; CHECK-SAME: i8 [[X:%.*]]) { |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], -127 |
| ; CHECK-NEXT: [[ICMP1:%.*]] = icmp slt i8 [[X]], 0 |
| ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[ICMP1]], i8 [[XOR]], i8 [[X]] |
| ; CHECK-NEXT: ret i8 [[SEL]] |
| ; |
| %icmp = icmp sgt i8 %x, 255 |
| %xor = xor i8 %x, -127 |
| %sel = select i1 %icmp, i8 %x, i8 %xor |
| ret i8 %sel |
| } |