[InstSimplify] fold redundant select of min/max
This is similar to the existing simplify: max (max X, Y), X --> max X, Y ...but the select condition can be one of several predicates as shown in the tests. The tests cycle through all 10 icmp preds for each min/max variant with 4 swapped operand patterns each (and the min/max operands are commuted in every other test within those). Some Alive2 examples to verify: https://alive2.llvm.org/ce/z/lCAQm4 https://alive2.llvm.org/ce/z/kzxVXC
This commit is contained in:
@@ -4233,6 +4233,40 @@ static Value *simplifySelectBitTest(Value *TrueVal, Value *FalseVal, Value *X,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static Value *simplifyCmpSelOfMaxMin(Value *CmpLHS, Value *CmpRHS,
|
||||
ICmpInst::Predicate Pred, Value *TVal,
|
||||
Value *FVal) {
|
||||
// Canonicalize max/min as false value of select.
|
||||
if (match(TVal, m_c_MaxOrMin(m_Specific(FVal), m_Value()))) {
|
||||
std::swap(TVal, FVal);
|
||||
Pred = ICmpInst::getInversePredicate(Pred);
|
||||
}
|
||||
|
||||
// Cond ? X : max(X, Y)
|
||||
Value *X = TVal, *Y;
|
||||
if (!match(FVal, m_c_MaxOrMin(m_Specific(X), m_Value(Y))))
|
||||
return nullptr;
|
||||
|
||||
// Canonicalize common select operand X as CmpLHS.
|
||||
if (CmpRHS == X) {
|
||||
std::swap(CmpLHS, CmpRHS);
|
||||
Pred = ICmpInst::getSwappedPredicate(Pred);
|
||||
}
|
||||
|
||||
// (X Pred Y) ? X : max(X, Y)
|
||||
if (CmpLHS != X || CmpRHS != Y)
|
||||
return nullptr;
|
||||
|
||||
if (auto *MMI = dyn_cast<MinMaxIntrinsic>(FVal)) {
|
||||
ICmpInst::Predicate MMPred = MMI->getPredicate();
|
||||
if (MMPred == Pred || MMPred == CmpInst::getStrictPredicate(Pred) ||
|
||||
Pred == ICmpInst::ICMP_EQ)
|
||||
return MMI;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// An alternative way to test if a bit is set or not uses sgt/slt instead of
|
||||
/// eq/ne.
|
||||
static Value *simplifySelectWithFakeICmpEq(Value *CmpLHS, Value *CmpRHS,
|
||||
@@ -4258,6 +4292,9 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
|
||||
if (!match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))
|
||||
return nullptr;
|
||||
|
||||
if (Value *V = simplifyCmpSelOfMaxMin(CmpLHS, CmpRHS, Pred, TrueVal, FalseVal))
|
||||
return V;
|
||||
|
||||
// Canonicalize ne to eq predicate.
|
||||
if (Pred == ICmpInst::ICMP_NE) {
|
||||
Pred = ICmpInst::ICMP_EQ;
|
||||
|
||||
@@ -10,10 +10,8 @@ declare i8 @llvm.umax.i8(i8, i8)
|
||||
|
||||
define i8 @slt_xy_smin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @slt_xy_smin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp slt i8 %x, %y
|
||||
%m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
|
||||
@@ -23,10 +21,8 @@ define i8 @slt_xy_smin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sle_xy_smin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sle_xy_smin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sle i8 %x, %y
|
||||
%m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
|
||||
@@ -114,10 +110,8 @@ define i8 @uge_xy_smin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_xy_smin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_xy_smin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %x, %y
|
||||
%m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
|
||||
@@ -168,10 +162,8 @@ define i8 @sle_yx_smin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sgt_yx_smin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sgt_yx_smin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sgt i8 %y, %x
|
||||
%m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
|
||||
@@ -181,10 +173,8 @@ define i8 @sgt_yx_smin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sge_yx_smin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sge_yx_smin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sge i8 %y, %x
|
||||
%m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
|
||||
@@ -246,10 +236,8 @@ define i8 @uge_yx_smin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_yx_smin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_yx_smin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %y, %x
|
||||
%m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
|
||||
@@ -300,10 +288,8 @@ define i8 @sle_xy_smin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sgt_xy_smin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sgt_xy_smin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sgt i8 %x, %y
|
||||
%m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
|
||||
@@ -313,10 +299,8 @@ define i8 @sgt_xy_smin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sge_xy_smin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sge_xy_smin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sge i8 %x, %y
|
||||
%m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
|
||||
@@ -391,10 +375,8 @@ define i8 @eq_xy_smin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_xy_smin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_xy_smin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %x, %y
|
||||
%m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
|
||||
@@ -406,10 +388,8 @@ define i8 @ne_xy_smin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @slt_yx_smin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @slt_yx_smin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp slt i8 %y, %x
|
||||
%m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
|
||||
@@ -419,10 +399,8 @@ define i8 @slt_yx_smin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sle_yx_smin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sle_yx_smin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sle i8 %y, %x
|
||||
%m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
|
||||
@@ -523,10 +501,8 @@ define i8 @eq_yx_smin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_yx_smin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_yx_smin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %y, %x
|
||||
%m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
|
||||
@@ -564,10 +540,8 @@ define i8 @sle_xy_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sgt_xy_smax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sgt_xy_smax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sgt i8 %x, %y
|
||||
%m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
|
||||
@@ -577,10 +551,8 @@ define i8 @sgt_xy_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sge_xy_smax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sge_xy_smax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sge i8 %x, %y
|
||||
%m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
|
||||
@@ -642,10 +614,8 @@ define i8 @uge_xy_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_xy_smax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_xy_smax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %x, %y
|
||||
%m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
|
||||
@@ -670,10 +640,8 @@ define i8 @ne_xy_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @slt_yx_smax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @slt_yx_smax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp slt i8 %y, %x
|
||||
%m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
|
||||
@@ -683,10 +651,8 @@ define i8 @slt_yx_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sle_yx_smax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sle_yx_smax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sle i8 %y, %x
|
||||
%m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
|
||||
@@ -774,10 +740,8 @@ define i8 @uge_yx_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_yx_smax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_yx_smax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %y, %x
|
||||
%m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
|
||||
@@ -802,10 +766,8 @@ define i8 @ne_yx_smax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @slt_xy_smax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @slt_xy_smax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp slt i8 %x, %y
|
||||
%m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
|
||||
@@ -815,10 +777,8 @@ define i8 @slt_xy_smax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sle_xy_smax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sle_xy_smax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sle i8 %x, %y
|
||||
%m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
|
||||
@@ -919,10 +879,8 @@ define i8 @eq_xy_smax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_xy_smax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_xy_smax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %x, %y
|
||||
%m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
|
||||
@@ -960,10 +918,8 @@ define i8 @sle_yx_smax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sgt_yx_smax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sgt_yx_smax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sgt i8 %y, %x
|
||||
%m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
|
||||
@@ -973,10 +929,8 @@ define i8 @sgt_yx_smax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @sge_yx_smax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @sge_yx_smax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp sge i8 %y, %x
|
||||
%m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
|
||||
@@ -1051,10 +1005,8 @@ define i8 @eq_yx_smax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_yx_smax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_yx_smax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %y, %x
|
||||
%m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
|
||||
@@ -1118,10 +1070,8 @@ define i8 @sge_xy_umin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ult_xy_umin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ult_xy_umin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ult i8 %x, %y
|
||||
%m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
|
||||
@@ -1131,10 +1081,8 @@ define i8 @ult_xy_umin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ule_xy_umin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ule_xy_umin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ule i8 %x, %y
|
||||
%m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
|
||||
@@ -1170,10 +1118,8 @@ define i8 @uge_xy_umin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_xy_umin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_xy_umin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %x, %y
|
||||
%m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
|
||||
@@ -1276,10 +1222,8 @@ define i8 @ule_yx_umin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ugt_yx_umin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ugt_yx_umin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ugt i8 %y, %x
|
||||
%m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
|
||||
@@ -1289,10 +1233,8 @@ define i8 @ugt_yx_umin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @uge_yx_umin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @uge_yx_umin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp uge i8 %y, %x
|
||||
%m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
|
||||
@@ -1302,10 +1244,8 @@ define i8 @uge_yx_umin_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_yx_umin_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_yx_umin_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %y, %x
|
||||
%m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
|
||||
@@ -1408,10 +1348,8 @@ define i8 @ule_xy_umin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ugt_xy_umin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ugt_xy_umin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ugt i8 %x, %y
|
||||
%m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
|
||||
@@ -1421,10 +1359,8 @@ define i8 @ugt_xy_umin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @uge_xy_umin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @uge_xy_umin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp uge i8 %x, %y
|
||||
%m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
|
||||
@@ -1447,10 +1383,8 @@ define i8 @eq_xy_umin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_xy_umin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_xy_umin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %x, %y
|
||||
%m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
|
||||
@@ -1514,10 +1448,8 @@ define i8 @sge_yx_umin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ult_yx_umin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ult_yx_umin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ult i8 %y, %x
|
||||
%m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
|
||||
@@ -1527,10 +1459,8 @@ define i8 @ult_yx_umin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ule_yx_umin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ule_yx_umin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ule i8 %y, %x
|
||||
%m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
|
||||
@@ -1579,10 +1509,8 @@ define i8 @eq_yx_umin_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_yx_umin_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_yx_umin_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %y, %x
|
||||
%m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
|
||||
@@ -1672,10 +1600,8 @@ define i8 @ule_xy_umax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ugt_xy_umax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ugt_xy_umax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ugt i8 %x, %y
|
||||
%m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
|
||||
@@ -1685,10 +1611,8 @@ define i8 @ugt_xy_umax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @uge_xy_umax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @uge_xy_umax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp uge i8 %x, %y
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
@@ -1698,10 +1622,8 @@ define i8 @uge_xy_umax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_xy_umax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_xy_umax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %x, %y
|
||||
%m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
|
||||
@@ -1778,10 +1700,8 @@ define i8 @sge_yx_umax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ult_yx_umax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ult_yx_umax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ult i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
|
||||
@@ -1791,10 +1711,8 @@ define i8 @ult_yx_umax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ule_yx_umax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ule_yx_umax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ule i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
@@ -1830,10 +1748,8 @@ define i8 @uge_yx_umax_fval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @eq_yx_umax_fval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @eq_yx_umax_fval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp eq i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
|
||||
@@ -1910,10 +1826,8 @@ define i8 @sge_xy_umax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ult_xy_umax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ult_xy_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ult i8 %x, %y
|
||||
%m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
|
||||
@@ -1923,10 +1837,8 @@ define i8 @ult_xy_umax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ule_xy_umax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ule_xy_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ule i8 %x, %y
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
@@ -1975,10 +1887,8 @@ define i8 @eq_xy_umax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_xy_umax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_xy_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %x, %y
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
@@ -2068,10 +1978,8 @@ define i8 @ule_yx_umax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ugt_yx_umax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ugt_yx_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ugt i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
|
||||
@@ -2081,10 +1989,8 @@ define i8 @ugt_yx_umax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @uge_yx_umax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @uge_yx_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp uge i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
@@ -2107,13 +2013,41 @@ define i8 @eq_yx_umax_tval(i8 %x, i8 %y) {
|
||||
|
||||
define i8 @ne_yx_umax_tval(i8 %x, i8 %y) {
|
||||
; CHECK-LABEL: @ne_yx_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: ret i8 [[M]]
|
||||
;
|
||||
%i = icmp ne i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
%r = select i1 %i, i8 %m, i8 %x
|
||||
ret i8 %r
|
||||
}
|
||||
|
||||
; negative test - wrong cmp op
|
||||
|
||||
define i8 @ne_yz_umax_tval(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @ne_yz_umax_tval(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X:%.*]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
;
|
||||
%i = icmp ne i8 %y, %z
|
||||
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
|
||||
%r = select i1 %i, i8 %m, i8 %x
|
||||
ret i8 %r
|
||||
}
|
||||
|
||||
; negative test - wrong max op
|
||||
|
||||
define i8 @ne_yx_umax_tval_wrong_op(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @ne_yx_umax_tval_wrong_op(
|
||||
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
|
||||
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Z:%.*]], i8 [[X]])
|
||||
; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
|
||||
; CHECK-NEXT: ret i8 [[R]]
|
||||
;
|
||||
%i = icmp ne i8 %y, %x
|
||||
%m = call i8 @llvm.umax.i8(i8 %z, i8 %x)
|
||||
%r = select i1 %i, i8 %m, i8 %x
|
||||
ret i8 %r
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user