mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-05 18:27:59 +00:00
a12bf57077
As Eli noted in the post-commit thread for r288833, the use of swapOperands() may not be allowed in InstSimplify, so I'm removing those calls here pending further review. The swap mutates the icmp, and there doesn't appear to be precedent for instruction mutation in InstSimplify. I didn't actually have any tests for those cases, so I'm adding a few here. llvm-svn: 288855
1240 lines
29 KiB
LLVM
1240 lines
29 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
|
|
|
; There are 10 * 10 combinations of icmp predicates that can be AND'd together.
|
|
; The majority of these can be simplified to always false or just one of the icmps.
|
|
|
|
define i1 @eq_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_eq(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_ne(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_sgt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_slt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_ugt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @eq_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @eq_ult(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp eq i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @ne_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_eq(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_sgt(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_slt(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_ugt(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ne_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ne_ult(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp ne i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @sge_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_eq(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_sgt(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_slt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_ugt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sge_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sge_ult(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sge i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @sgt_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_eq(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_sgt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_sle(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_slt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_ugt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sgt_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sgt_ult(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sgt i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @sle_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_eq(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_sgt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_slt(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_ugt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @sle_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @sle_ult(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp sle i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @slt_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_eq(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_sge(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_sgt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_slt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_ugt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @slt_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @slt_ult(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp slt i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @uge_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_eq(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_sgt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_slt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_ugt(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @uge_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @uge_ult(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp uge i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @ugt_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_eq(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_sgt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_slt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_ugt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_ule(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ugt_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ugt_ult(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ugt i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @ule_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_eq(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_sgt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_slt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_uge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_ugt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ule_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ule_ult(
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP2]]
|
|
;
|
|
%cmp1 = icmp ule i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
;
|
|
|
|
define i1 @ult_eq(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_eq(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp eq i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_ne(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_ne(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp ne i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_sge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_sge(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp sge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_sgt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_sgt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp sgt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_sle(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_sle(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp sle i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_slt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_slt(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 %a, %b
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp slt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_uge(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_uge(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp uge i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_ugt(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_ugt(
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp ugt i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_ule(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_ule(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp ule i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_ult(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_ult(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: ret i1 [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp ult i8 %a, %b
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
; Check a couple of vector variants to make sure those work too.
|
|
|
|
define <2 x i1> @ult_uge_vec(<2 x i8> %a, <2 x i8> %b) {
|
|
; CHECK-LABEL: @ult_uge_vec(
|
|
; CHECK-NEXT: ret <2 x i1> zeroinitializer
|
|
;
|
|
%cmp1 = icmp ult <2 x i8> %a, %b
|
|
%cmp2 = icmp uge <2 x i8> %a, %b
|
|
%and = and <2 x i1> %cmp1, %cmp2
|
|
ret <2 x i1> %and
|
|
}
|
|
|
|
define <2 x i1> @ult_ule_vec(<2 x i8> %a, <2 x i8> %b) {
|
|
; CHECK-LABEL: @ult_ule_vec(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult <2 x i8> %a, %b
|
|
; CHECK-NEXT: ret <2 x i1> [[CMP1]]
|
|
;
|
|
%cmp1 = icmp ult <2 x i8> %a, %b
|
|
%cmp2 = icmp ule <2 x i8> %a, %b
|
|
%and = and <2 x i1> %cmp1, %cmp2
|
|
ret <2 x i1> %and
|
|
}
|
|
|
|
define i1 @ult_uge_swap(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_uge_swap(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i8 %b, %a
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp uge i8 %b, %a
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|
|
define i1 @ult_ult_swap(i8 %a, i8 %b) {
|
|
; CHECK-LABEL: @ult_ult_swap(
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i8 %a, %b
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i8 %b, %a
|
|
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
|
|
; CHECK-NEXT: ret i1 [[AND]]
|
|
;
|
|
%cmp1 = icmp ult i8 %a, %b
|
|
%cmp2 = icmp ult i8 %b, %a
|
|
%and = and i1 %cmp1, %cmp2
|
|
ret i1 %and
|
|
}
|
|
|