blob: c8ce114a683eeef62aa70a4f05117190e8ed88ac [file] [log] [blame]
; 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
}