From e46dd6fbc0aff05884b5e3736bb4286a5914a2d3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 30 Oct 2023 18:31:33 +0100 Subject: [PATCH] Revert "[InstCombine] Simplify and/or of icmp eq with op replacement (#70335)" This reverts commit 1770a2e325192f1665018e21200596da1904a330. Stage 2 llvm-tblgen crashes when generating X86GenAsmWriter.inc and other files. --- llvm/lib/Analysis/InstructionSimplify.cpp | 60 -- llvm/test/CodeGen/PowerPC/pr45448.ll | 10 +- .../div-by-0-guard-before-smul_ov.ll | 11 +- .../div-by-0-guard-before-umul_ov.ll | 11 +- llvm/test/Transforms/InstCombine/ispow2.ll | 24 +- .../InstSimplify/and-or-icmp-ctpop.ll | 10 +- .../InstSimplify/and-or-icmp-min-max.ll | 617 +++++++++++++----- .../InstSimplify/and-or-implied-cond.ll | 10 +- .../div-by-0-guard-before-smul_ov-not.ll | 13 +- .../div-by-0-guard-before-smul_ov.ll | 11 +- .../div-by-0-guard-before-umul_ov-not.ll | 13 +- .../div-by-0-guard-before-umul_ov.ll | 11 +- ...f-negative-is-non-zero-and-no-underflow.ll | 20 +- llvm/test/Transforms/PGOProfile/chr.ll | 7 +- 14 files changed, 587 insertions(+), 241 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index a68ca950e523..f0e60c9a2dac 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -2025,52 +2025,6 @@ static Value *simplifyAndOrOfCmps(const SimplifyQuery &Q, Value *Op0, return nullptr; } -static Value *simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, - const SimplifyQuery &Q, - bool AllowRefinement, - SmallVectorImpl *DropFlags, - unsigned MaxRecurse); - -static Value *simplifyAndOrWithICmpEq(unsigned Opcode, Value *Op0, Value *Op1, - const SimplifyQuery &Q, - unsigned MaxRecurse) { - assert((Opcode == Instruction::And || Opcode == Instruction::Or) && - "Must be and/or"); - ICmpInst::Predicate Pred; - Value *A, *B; - if (!match(Op0, m_ICmp(Pred, m_Value(A), m_Value(B))) || - !ICmpInst::isEquality(Pred) || !MaxRecurse--) - return nullptr; - - auto Simplify = [&](Value *Res) -> Value * { - // and (icmp eq a, b), x implies (a==b) inside x. - // or (icmp ne a, b), x implies (a==b) inside x. - // If x simplifies to true/false, we can simplify the and/or. - if (Pred == - (Opcode == Instruction::And ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE)) - return simplifyBinOp(Opcode, Op0, Res, Q, MaxRecurse); - // If we have and (icmp ne a, b), x and for a==b we can simplify x to false, - // then we can drop the icmp, as x will already be false in the case where - // the icmp is false. Similar for or and true. - if (Res == ConstantExpr::getBinOpAbsorber(Opcode, Res->getType())) - return Op1; - return nullptr; - }; - - // Increment MaxRecurse again, because simplifyWithOpReplaced() does its own - // decrement. - if (Value *Res = - simplifyWithOpReplaced(Op1, A, B, Q, /* AllowRefinement */ true, - /* DropFlags */ nullptr, MaxRecurse + 1)) - return Simplify(Res); - if (Value *Res = - simplifyWithOpReplaced(Op1, B, A, Q, /* AllowRefinement */ true, - /* DropFlags */ nullptr, MaxRecurse + 1)) - return Simplify(Res); - - return nullptr; -} - /// Given a bitwise logic op, check if the operands are add/sub with a common /// source value and inverted constant (identity: C - X -> ~(X + ~C)). static Value *simplifyLogicOfAddSub(Value *Op0, Value *Op1, @@ -2205,13 +2159,6 @@ static Value *simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, Q.DT)) return Constant::getNullValue(Op0->getType()); - if (Value *V = - simplifyAndOrWithICmpEq(Instruction::And, Op0, Op1, Q, MaxRecurse)) - return V; - if (Value *V = - simplifyAndOrWithICmpEq(Instruction::And, Op1, Op0, Q, MaxRecurse)) - return V; - if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, true)) return V; @@ -2488,13 +2435,6 @@ static Value *simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, match(Op0, m_LShr(m_Specific(X), m_Specific(Y)))) return Op1; - if (Value *V = - simplifyAndOrWithICmpEq(Instruction::Or, Op0, Op1, Q, MaxRecurse)) - return V; - if (Value *V = - simplifyAndOrWithICmpEq(Instruction::Or, Op1, Op0, Q, MaxRecurse)) - return V; - if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, false)) return V; diff --git a/llvm/test/CodeGen/PowerPC/pr45448.ll b/llvm/test/CodeGen/PowerPC/pr45448.ll index 0f2dcb3ccc8a..6b3d578f6b33 100644 --- a/llvm/test/CodeGen/PowerPC/pr45448.ll +++ b/llvm/test/CodeGen/PowerPC/pr45448.ll @@ -20,16 +20,20 @@ define hidden void @julia_tryparse_internal_45896() #0 { ; CHECK-NEXT: .LBB0_6: # %fail194 ; CHECK-NEXT: .LBB0_7: # %L670 ; CHECK-NEXT: li r5, -3 +; CHECK-NEXT: cmpdi r3, 0 ; CHECK-NEXT: sradi r4, r3, 63 ; CHECK-NEXT: rldic r5, r5, 4, 32 +; CHECK-NEXT: crnot 4*cr5+lt, eq ; CHECK-NEXT: mulhdu r3, r3, r5 ; CHECK-NEXT: maddld r6, r4, r5, r3 ; CHECK-NEXT: cmpld cr1, r6, r3 ; CHECK-NEXT: mulhdu. r3, r4, r5 +; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_10 +; CHECK-NEXT: # %bb.8: # %L670 ; CHECK-NEXT: crorc 4*cr5+lt, 4*cr1+lt, eq -; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_9 -; CHECK-NEXT: # %bb.8: # %L917 -; CHECK-NEXT: .LBB0_9: # %L994 +; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_10 +; CHECK-NEXT: # %bb.9: # %L917 +; CHECK-NEXT: .LBB0_10: # %L994 top: %0 = load i64, ptr undef, align 8 %1 = icmp ne i64 %0, 0 diff --git a/llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov.ll b/llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov.ll index 08eefbebb736..23bfc75b945b 100644 --- a/llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov.ll +++ b/llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov.ll @@ -47,7 +47,11 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) { define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n3_wrong_pred( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0 +; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[SMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp eq i4 %size, 0 ; not 'ne' %smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb) @@ -59,7 +63,10 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { define i1 @n4_not_and(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n4_not_and( ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = or i1 [[SMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp ne i4 %size, 0 %smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb) diff --git a/llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov.ll b/llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov.ll index 047f8855fe5c..dbc3b5e7a25b 100644 --- a/llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov.ll +++ b/llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov.ll @@ -47,7 +47,11 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) { define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n3_wrong_pred( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0 +; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[UMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp eq i4 %size, 0 ; not 'ne' %umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb) @@ -59,7 +63,10 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { define i1 @n4_not_and(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n4_not_and( ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = or i1 [[UMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp ne i4 %size, 0 %umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb) diff --git a/llvm/test/Transforms/InstCombine/ispow2.ll b/llvm/test/Transforms/InstCombine/ispow2.ll index cc50c5cd1e66..740f79cd32b3 100644 --- a/llvm/test/Transforms/InstCombine/ispow2.ll +++ b/llvm/test/Transforms/InstCombine/ispow2.ll @@ -392,7 +392,9 @@ define i1 @is_pow2_ctpop_wrong_pred1(i32 %x) { ; CHECK-LABEL: @is_pow2_ctpop_wrong_pred1( ; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]] ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[T0]], 2 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[NOTZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp ugt i32 %t0, 2 @@ -944,7 +946,9 @@ define i1 @is_pow2or0_ctpop_wrong_pred1(i32 %x) { ; CHECK-LABEL: @is_pow2or0_ctpop_wrong_pred1( ; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]] ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 1 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[ISZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp ne i32 %t0, 1 @@ -955,7 +959,11 @@ define i1 @is_pow2or0_ctpop_wrong_pred1(i32 %x) { define i1 @is_pow2or0_ctpop_wrong_pred2(i32 %x) { ; CHECK-LABEL: @is_pow2or0_ctpop_wrong_pred2( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 1 +; CHECK-NEXT: [[ISZERO:%.*]] = icmp ne i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[ISZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp ne i32 %t0, 1 @@ -1141,7 +1149,9 @@ define i1 @isnot_pow2nor0_ctpop_wrong_pred1(i32 %x) { ; CHECK-LABEL: @isnot_pow2nor0_ctpop_wrong_pred1( ; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]] ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[T0]], 1 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[NOTZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp eq i32 %t0, 1 @@ -1152,7 +1162,11 @@ define i1 @isnot_pow2nor0_ctpop_wrong_pred1(i32 %x) { define i1 @isnot_pow2nor0_ctpop_wrong_pred2(i32 %x) { ; CHECK-LABEL: @isnot_pow2nor0_ctpop_wrong_pred2( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[T0]], 1 +; CHECK-NEXT: [[NOTZERO:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[NOTZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp eq i32 %t0, 1 diff --git a/llvm/test/Transforms/InstSimplify/and-or-icmp-ctpop.ll b/llvm/test/Transforms/InstSimplify/and-or-icmp-ctpop.ll index 6fe8d29bd10b..6de97c3a7a76 100644 --- a/llvm/test/Transforms/InstSimplify/and-or-icmp-ctpop.ll +++ b/llvm/test/Transforms/InstSimplify/and-or-icmp-ctpop.ll @@ -40,7 +40,11 @@ define <2 x i1> @eq_or_non_0_commute(<2 x i32> %x) { define i1 @eq_or_non_0_wrong_pred1(i32 %x) { ; CHECK-LABEL: @eq_or_non_0_wrong_pred1( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]) +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 10 +; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[NOTZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp ne i32 %t0, 10 @@ -86,7 +90,9 @@ define i1 @ne_and_is_0_wrong_pred1(i32 %x) { ; CHECK-LABEL: @ne_and_is_0_wrong_pred1( ; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]) ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 10 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[ISZERO]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %t0 = tail call i32 @llvm.ctpop.i32(i32 %x) %cmp = icmp ne i32 %t0, 10 diff --git a/llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll b/llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll index 4e3832f31e5a..7ea1797c9989 100644 --- a/llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll +++ b/llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll @@ -16,7 +16,10 @@ define i1 @slt_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_and_max( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -26,7 +29,10 @@ define i1 @slt_and_max(i8 %x, i8 %y) { define <2 x i1> @slt_and_max_commute(<2 x i8> %x, <2 x i8> %y) { ; CHECK-LABEL: @slt_and_max_commute( -; CHECK-NEXT: ret <2 x i1> zeroinitializer +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq <2 x i8> [[X]], +; CHECK-NEXT: [[R:%.*]] = and <2 x i1> [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret <2 x i1> [[R]] ; %cmp = icmp slt <2 x i8> %x, %y %cmpeq = icmp eq <2 x i8> %x, @@ -36,7 +42,10 @@ define <2 x i1> @slt_and_max_commute(<2 x i8> %x, <2 x i8> %y) { define i1 @slt_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_max( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -46,7 +55,10 @@ define i1 @slt_swap_and_max(i8 %x, i8 %y) { define i1 @slt_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_max_commute( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -56,7 +68,10 @@ define i1 @slt_swap_and_max_commute(i8 %x, i8 %y) { define i1 @ult_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_max( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -66,7 +81,10 @@ define i1 @ult_and_max(i8 %x, i8 %y) { define i1 @ult_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_max_commute( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -76,7 +94,10 @@ define i1 @ult_and_max_commute(i8 %x, i8 %y) { define i1 @ult_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_max( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -86,7 +107,10 @@ define i1 @ult_swap_and_max(i8 %x, i8 %y) { define i1 @ult_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_max_commute( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -102,7 +126,10 @@ define i1 @ult_swap_and_max_commute(i8 %x, i8 %y) { define i1 @sgt_and_min(i9 %x, i9 %y) { ; CHECK-LABEL: @sgt_and_min( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i9 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i9 [[X]], -256 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i9 %x, %y %cmpeq = icmp eq i9 %x, 256 @@ -112,7 +139,10 @@ define i1 @sgt_and_min(i9 %x, i9 %y) { define i1 @sgt_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_and_min_commute( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -122,7 +152,10 @@ define i1 @sgt_and_min_commute(i8 %x, i8 %y) { define i1 @sgt_swap_and_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_min( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -132,7 +165,10 @@ define i1 @sgt_swap_and_min(i8 %x, i8 %y) { define i1 @sgt_swap_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_min_commute( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -188,7 +224,10 @@ define i1 @ugt_swap_and_min_commute(i8 %x, i8 %y) { define i1 @sge_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_not_max( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -198,7 +237,10 @@ define i1 @sge_or_not_max(i8 %x, i8 %y) { define i1 @sge_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_not_max_commute( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -208,7 +250,10 @@ define i1 @sge_or_not_max_commute(i8 %x, i8 %y) { define i1 @sge_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_not_max( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -218,7 +263,10 @@ define i1 @sge_swap_or_not_max(i8 %x, i8 %y) { define i1 @sge_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_not_max_commute( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -228,7 +276,10 @@ define i1 @sge_swap_or_not_max_commute(i8 %x, i8 %y) { define i1 @uge_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_not_max( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -238,7 +289,10 @@ define i1 @uge_or_not_max(i8 %x, i8 %y) { define i1 @uge_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_not_max_commute( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -248,7 +302,10 @@ define i1 @uge_or_not_max_commute(i8 %x, i8 %y) { define i1 @uge_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_not_max( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -258,7 +315,10 @@ define i1 @uge_swap_or_not_max(i8 %x, i8 %y) { define i1 @uge_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_not_max_commute( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -274,7 +334,10 @@ define i1 @uge_swap_or_not_max_commute(i8 %x, i8 %y) { define i1 @sle_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_not_min( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -284,7 +347,10 @@ define i1 @sle_or_not_min(i8 %x, i8 %y) { define i1 @sle_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_not_min_commute( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -294,7 +360,10 @@ define i1 @sle_or_not_min_commute(i8 %x, i8 %y) { define i1 @sle_swap_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_not_min( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -304,7 +373,10 @@ define i1 @sle_swap_or_not_min(i8 %x, i8 %y) { define i1 @sle_swap_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_not_min_commute( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -360,8 +432,10 @@ define i1 @ule_swap_or_not_min_commute(i8 %x, i8 %y) { define i1 @sge_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_and_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -371,8 +445,10 @@ define i1 @sge_and_max(i8 %x, i8 %y) { define i1 @sge_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_and_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -382,8 +458,10 @@ define i1 @sge_and_max_commute(i8 %x, i8 %y) { define i1 @sge_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_and_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -393,8 +471,10 @@ define i1 @sge_swap_and_max(i8 %x, i8 %y) { define i1 @sge_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_and_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -404,8 +484,10 @@ define i1 @sge_swap_and_max_commute(i8 %x, i8 %y) { define i1 @uge_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_and_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -415,8 +497,10 @@ define i1 @uge_and_max(i8 %x, i8 %y) { define i1 @uge_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_and_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -426,8 +510,10 @@ define i1 @uge_and_max_commute(i8 %x, i8 %y) { define i1 @uge_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_and_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -437,8 +523,10 @@ define i1 @uge_swap_and_max(i8 %x, i8 %y) { define i1 @uge_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_and_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -454,8 +542,10 @@ define i1 @uge_swap_and_max_commute(i8 %x, i8 %y) { define i1 @sle_and_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_and_min( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -465,8 +555,10 @@ define i1 @sle_and_min(i8 %x, i8 %y) { define i1 @sle_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_and_min_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -476,8 +568,10 @@ define i1 @sle_and_min_commute(i8 %x, i8 %y) { define i1 @sle_swap_and_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_and_min( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -487,8 +581,10 @@ define i1 @sle_swap_and_min(i8 %x, i8 %y) { define i1 @sle_swap_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_and_min_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -924,8 +1020,10 @@ define i1 @ugt_swap_and_not_min_commute(i8 %x, i8 %y) { define i1 @slt_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_or_not_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -935,8 +1033,10 @@ define i1 @slt_or_not_max(i8 %x, i8 %y) { define i1 @slt_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_or_not_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -946,8 +1046,10 @@ define i1 @slt_or_not_max_commute(i8 %x, i8 %y) { define i1 @slt_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_or_not_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -957,8 +1059,10 @@ define i1 @slt_swap_or_not_max(i8 %x, i8 %y) { define i1 @slt_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_or_not_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -968,8 +1072,10 @@ define i1 @slt_swap_or_not_max_commute(i8 %x, i8 %y) { define i1 @ult_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_or_not_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -979,8 +1085,10 @@ define i1 @ult_or_not_max(i8 %x, i8 %y) { define i1 @ult_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_or_not_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -990,8 +1098,10 @@ define i1 @ult_or_not_max_commute(i8 %x, i8 %y) { define i1 @ult_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_or_not_max( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -1001,8 +1111,10 @@ define i1 @ult_swap_or_not_max(i8 %x, i8 %y) { define i1 @ult_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_or_not_max_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -1018,8 +1130,10 @@ define i1 @ult_swap_or_not_max_commute(i8 %x, i8 %y) { define i1 @sgt_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_or_not_min( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -1029,8 +1143,10 @@ define i1 @sgt_or_not_min(i8 %x, i8 %y) { define i1 @sgt_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_or_not_min_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -1040,8 +1156,10 @@ define i1 @sgt_or_not_min_commute(i8 %x, i8 %y) { define i1 @sgt_swap_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_or_not_min( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -1051,8 +1169,10 @@ define i1 @sgt_swap_or_not_min(i8 %x, i8 %y) { define i1 @sgt_swap_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_or_not_min_commute( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -1112,7 +1232,11 @@ define i1 @ugt_swap_or_not_min_commute(i823 %x, i823 %y) { define i1 @slt_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_and_max_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %notx, %y @@ -1123,7 +1247,11 @@ define i1 @slt_and_max_not_op(i8 %x, i8 %y) { define <2 x i1> @slt_and_max_commute_not_op(<2 x i8> %x, <2 x i8> %y) { ; CHECK-LABEL: @slt_and_max_commute_not_op( -; CHECK-NEXT: ret <2 x i1> zeroinitializer +; CHECK-NEXT: [[NOTX:%.*]] = xor <2 x i8> [[X:%.*]], +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq <2 x i8> [[X]], +; CHECK-NEXT: [[R:%.*]] = and <2 x i1> [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret <2 x i1> [[R]] ; %notx = xor <2 x i8> %x, %cmp = icmp slt <2 x i8> %notx, %y @@ -1134,7 +1262,11 @@ define <2 x i1> @slt_and_max_commute_not_op(<2 x i8> %x, <2 x i8> %y) { define i1 @slt_swap_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_max_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %y, %notx @@ -1145,7 +1277,11 @@ define i1 @slt_swap_and_max_not_op(i8 %x, i8 %y) { define i1 @slt_swap_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_max_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %y, %notx @@ -1156,7 +1292,11 @@ define i1 @slt_swap_and_max_commute_not_op(i8 %x, i8 %y) { define i1 @ult_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_max_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %notx, %y @@ -1167,7 +1307,11 @@ define i1 @ult_and_max_not_op(i8 %x, i8 %y) { define i1 @ult_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_max_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %notx, %y @@ -1178,7 +1322,11 @@ define i1 @ult_and_max_commute_not_op(i8 %x, i8 %y) { define i1 @ult_swap_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_max_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %y, %notx @@ -1189,7 +1337,11 @@ define i1 @ult_swap_and_max_not_op(i8 %x, i8 %y) { define i1 @ult_swap_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_max_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %y, %notx @@ -1206,7 +1358,11 @@ define i1 @ult_swap_and_max_commute_not_op(i8 %x, i8 %y) { define i1 @sgt_and_min_not_op(i9 %x, i9 %y) { ; CHECK-LABEL: @sgt_and_min_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i9 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i9 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i9 [[X]], 255 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i9 %x, -1 %cmp = icmp sgt i9 %notx, %y @@ -1217,7 +1373,11 @@ define i1 @sgt_and_min_not_op(i9 %x, i9 %y) { define i1 @sgt_and_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_and_min_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %notx, %y @@ -1228,7 +1388,11 @@ define i1 @sgt_and_min_commute_not_op(i8 %x, i8 %y) { define i1 @sgt_swap_and_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_min_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %y, %notx @@ -1239,7 +1403,11 @@ define i1 @sgt_swap_and_min_not_op(i8 %x, i8 %y) { define i1 @sgt_swap_and_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_min_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %y, %notx @@ -1250,7 +1418,11 @@ define i1 @sgt_swap_and_min_commute_not_op(i8 %x, i8 %y) { define i1 @ugt_and_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_and_min_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %notx, %y @@ -1261,7 +1433,11 @@ define i1 @ugt_and_min_not_op(i8 %x, i8 %y) { define i1 @ugt_and_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_and_min_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %notx, %y @@ -1272,7 +1448,11 @@ define i1 @ugt_and_min_commute_not_op(i8 %x, i8 %y) { define i1 @ugt_swap_and_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_swap_and_min_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %y, %notx @@ -1283,7 +1463,11 @@ define i1 @ugt_swap_and_min_not_op(i8 %x, i8 %y) { define i1 @ugt_swap_and_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_swap_and_min_commute_not_op( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %y, %notx @@ -1300,7 +1484,11 @@ define i1 @ugt_swap_and_min_commute_not_op(i8 %x, i8 %y) { define i1 @sge_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_not_max_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sge i8 %notx, %y @@ -1311,7 +1499,11 @@ define i1 @sge_or_not_max_not_op(i8 %x, i8 %y) { define i1 @sge_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_not_max_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sge i8 %notx, %y @@ -1322,7 +1514,11 @@ define i1 @sge_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @sge_swap_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_not_max_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sle i8 %y, %notx @@ -1333,7 +1529,11 @@ define i1 @sge_swap_or_not_max_not_op(i8 %x, i8 %y) { define i1 @sge_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_not_max_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sle i8 %y, %notx @@ -1344,7 +1544,11 @@ define i1 @sge_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @uge_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_not_max_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp uge i8 %notx, %y @@ -1355,7 +1559,11 @@ define i1 @uge_or_not_max_not_op(i8 %x, i8 %y) { define i1 @uge_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_not_max_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp uge i8 %notx, %y @@ -1366,7 +1574,11 @@ define i1 @uge_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @uge_swap_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_not_max_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ule i8 %y, %notx @@ -1377,7 +1589,11 @@ define i1 @uge_swap_or_not_max_not_op(i8 %x, i8 %y) { define i1 @uge_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_not_max_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ule i8 %y, %notx @@ -1394,7 +1610,11 @@ define i1 @uge_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @sle_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_not_min_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sle i8 %notx, %y @@ -1405,7 +1625,11 @@ define i1 @sle_or_not_min_not_op(i8 %x, i8 %y) { define i1 @sle_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_not_min_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sle i8 %notx, %y @@ -1416,7 +1640,11 @@ define i1 @sle_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @sle_swap_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_not_min_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sge i8 %y, %notx @@ -1427,7 +1655,11 @@ define i1 @sle_swap_or_not_min_not_op(i8 %x, i8 %y) { define i1 @sle_swap_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_not_min_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sge i8 %y, %notx @@ -1438,7 +1670,11 @@ define i1 @sle_swap_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @ule_or_not_min_not_op(i427 %x, i427 %y) { ; CHECK-LABEL: @ule_or_not_min_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i427 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i427 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i427 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i427 %x, -1 %cmp = icmp ule i427 %notx, %y @@ -1449,7 +1685,11 @@ define i1 @ule_or_not_min_not_op(i427 %x, i427 %y) { define i1 @ule_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ule_or_not_min_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ule i8 %notx, %y @@ -1460,7 +1700,11 @@ define i1 @ule_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @ule_swap_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ule_swap_or_not_min_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp uge i8 %y, %notx @@ -1471,7 +1715,11 @@ define i1 @ule_swap_or_not_min_not_op(i8 %x, i8 %y) { define i1 @ule_swap_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ule_swap_or_not_min_commute_not_op( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp uge i8 %y, %notx @@ -1488,8 +1736,11 @@ define i1 @ule_swap_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @sge_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_and_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sge i8 %notx, %y @@ -1500,8 +1751,11 @@ define i1 @sge_and_max_not_op(i8 %x, i8 %y) { define i1 @sge_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_and_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sge i8 %notx, %y @@ -1512,8 +1766,11 @@ define i1 @sge_and_max_commute_not_op(i8 %x, i8 %y) { define i1 @sge_swap_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_and_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sle i8 %y, %notx @@ -1524,8 +1781,11 @@ define i1 @sge_swap_and_max_not_op(i8 %x, i8 %y) { define i1 @sge_swap_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_and_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sle i8 %y, %notx @@ -1536,8 +1796,11 @@ define i1 @sge_swap_and_max_commute_not_op(i8 %x, i8 %y) { define i1 @uge_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_and_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp uge i8 %notx, %y @@ -1548,8 +1811,11 @@ define i1 @uge_and_max_not_op(i8 %x, i8 %y) { define i1 @uge_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_and_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp uge i8 %notx, %y @@ -1560,8 +1826,11 @@ define i1 @uge_and_max_commute_not_op(i8 %x, i8 %y) { define i1 @uge_swap_and_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_and_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ule i8 %y, %notx @@ -1572,8 +1841,11 @@ define i1 @uge_swap_and_max_not_op(i8 %x, i8 %y) { define i1 @uge_swap_and_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_and_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ule i8 %y, %notx @@ -2156,8 +2428,11 @@ define i1 @ugt_swap_and_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @slt_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_or_not_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %notx, %y @@ -2168,8 +2443,11 @@ define i1 @slt_or_not_max_not_op(i8 %x, i8 %y) { define i1 @slt_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_or_not_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %notx, %y @@ -2180,8 +2458,11 @@ define i1 @slt_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @slt_swap_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_or_not_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %y, %notx @@ -2192,8 +2473,11 @@ define i1 @slt_swap_or_not_max_not_op(i8 %x, i8 %y) { define i1 @slt_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_or_not_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %y, %notx @@ -2204,8 +2488,11 @@ define i1 @slt_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @ult_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_or_not_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %notx, %y @@ -2216,8 +2503,11 @@ define i1 @ult_or_not_max_not_op(i8 %x, i8 %y) { define i1 @ult_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_or_not_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %notx, %y @@ -2228,8 +2518,11 @@ define i1 @ult_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @ult_swap_or_not_max_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_or_not_max_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %y, %notx @@ -2240,8 +2533,11 @@ define i1 @ult_swap_or_not_max_not_op(i8 %x, i8 %y) { define i1 @ult_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_or_not_max_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %y, %notx @@ -2258,8 +2554,11 @@ define i1 @ult_swap_or_not_max_commute_not_op(i8 %x, i8 %y) { define i1 @sgt_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_or_not_min_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %notx, %y @@ -2270,8 +2569,11 @@ define i1 @sgt_or_not_min_not_op(i8 %x, i8 %y) { define i1 @sgt_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_or_not_min_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp sgt i8 %notx, %y @@ -2282,8 +2584,11 @@ define i1 @sgt_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @sgt_swap_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_or_not_min_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %y, %notx @@ -2294,8 +2599,11 @@ define i1 @sgt_swap_or_not_min_not_op(i8 %x, i8 %y) { define i1 @sgt_swap_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_or_not_min_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp slt i8 %y, %notx @@ -2306,8 +2614,11 @@ define i1 @sgt_swap_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @ugt_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_or_not_min_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %notx, %y @@ -2318,8 +2629,11 @@ define i1 @ugt_or_not_min_not_op(i8 %x, i8 %y) { define i1 @ugt_or_not_min_commute_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_or_not_min_commute_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[NOTX]], [[Y:%.*]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ugt i8 %notx, %y @@ -2330,8 +2644,11 @@ define i1 @ugt_or_not_min_commute_not_op(i8 %x, i8 %y) { define i1 @ugt_swap_or_not_min_not_op(i8 %x, i8 %y) { ; CHECK-LABEL: @ugt_swap_or_not_min_not_op( -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 -; CHECK-NEXT: ret i1 [[CMPEQ]] +; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[NOTX]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] +; CHECK-NEXT: ret i1 [[R]] ; %notx = xor i8 %x, -1 %cmp = icmp ult i8 %y, %notx diff --git a/llvm/test/Transforms/InstSimplify/and-or-implied-cond.ll b/llvm/test/Transforms/InstSimplify/and-or-implied-cond.ll index 7af3138dcaf2..db38077e0c51 100644 --- a/llvm/test/Transforms/InstSimplify/and-or-implied-cond.ll +++ b/llvm/test/Transforms/InstSimplify/and-or-implied-cond.ll @@ -236,7 +236,9 @@ define i1 @pr69050(i32 %arg, i32 %arg1) { ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[ARG:%.*]], -1 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[XOR]], [[ARG1:%.*]] ; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i32 [[AND]], 0 -; CHECK-NEXT: ret i1 [[ICMP]] +; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[ARG]], -1 +; CHECK-NEXT: [[AND3:%.*]] = and i1 [[ICMP2]], [[ICMP]] +; CHECK-NEXT: ret i1 [[AND3]] ; %xor = xor i32 %arg, -1 %and = and i32 %xor, %arg1 @@ -249,7 +251,11 @@ define i1 @pr69050(i32 %arg, i32 %arg1) { define i1 @pr69091(i32 %arg, i32 %arg1) { ; CHECK-LABEL: @pr69091( ; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i32 [[ARG:%.*]], -1 -; CHECK-NEXT: ret i1 [[ICMP]] +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[ARG]], 1 +; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[ADD]], [[ARG1:%.*]] +; CHECK-NEXT: [[ICMP2:%.*]] = icmp ne i32 [[MUL]], 0 +; CHECK-NEXT: [[OR:%.*]] = or i1 [[ICMP]], [[ICMP2]] +; CHECK-NEXT: ret i1 [[OR]] ; %icmp = icmp ne i32 %arg, -1 %add = add i32 %arg, 1 diff --git a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll index fa0b7f165a3a..ef2416eccb83 100644 --- a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll +++ b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll @@ -52,7 +52,12 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) { define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n3_wrong_pred( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0 +; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1 +; CHECK-NEXT: [[PHITMP:%.*]] = xor i1 [[SMUL_OV]], true +; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[PHITMP]] +; CHECK-NEXT: ret i1 [[OR]] ; %cmp = icmp ne i4 %size, 0 ; not 'eq' %smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb) @@ -65,7 +70,11 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { define i1 @n4_not_and(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n4_not_and( ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1 +; CHECK-NEXT: [[PHITMP:%.*]] = xor i1 [[SMUL_OV]], true +; CHECK-NEXT: [[OR:%.*]] = and i1 [[CMP]], [[PHITMP]] +; CHECK-NEXT: ret i1 [[OR]] ; %cmp = icmp eq i4 %size, 0 %smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb) diff --git a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov.ll b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov.ll index 001a24c0f026..84462567271a 100644 --- a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov.ll +++ b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov.ll @@ -46,7 +46,11 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) { define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n3_wrong_pred( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0 +; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[SMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp eq i4 %size, 0 ; not 'ne' %smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb) @@ -58,7 +62,10 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { define i1 @n4_not_and(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n4_not_and( ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[SMUL:%.*]] = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[SMUL_OV:%.*]] = extractvalue { i4, i1 } [[SMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = or i1 [[SMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp ne i4 %size, 0 %smul = tail call { i4, i1 } @llvm.smul.with.overflow.i4(i4 %size, i4 %nmemb) diff --git a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll index a1c317ec8ee2..c332b35fc187 100644 --- a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll +++ b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll @@ -52,7 +52,12 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) { define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n3_wrong_pred( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0 +; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1 +; CHECK-NEXT: [[PHITMP:%.*]] = xor i1 [[UMUL_OV]], true +; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[PHITMP]] +; CHECK-NEXT: ret i1 [[OR]] ; %cmp = icmp ne i4 %size, 0 ; not 'eq' %umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb) @@ -65,7 +70,11 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { define i1 @n4_not_and(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n4_not_and( ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1 +; CHECK-NEXT: [[PHITMP:%.*]] = xor i1 [[UMUL_OV]], true +; CHECK-NEXT: [[OR:%.*]] = and i1 [[CMP]], [[PHITMP]] +; CHECK-NEXT: ret i1 [[OR]] ; %cmp = icmp eq i4 %size, 0 %umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb) diff --git a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov.ll b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov.ll index f75b8a628276..9ab0819e214e 100644 --- a/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov.ll +++ b/llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov.ll @@ -46,7 +46,11 @@ define i1 @n2_wrong_size(i4 %size0, i4 %size1, i4 %nmemb) { define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n3_wrong_pred( -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i4 [[SIZE:%.*]], 0 +; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[UMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp eq i4 %size, 0 ; not 'ne' %umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb) @@ -58,7 +62,10 @@ define i1 @n3_wrong_pred(i4 %size, i4 %nmemb) { define i1 @n4_not_and(i4 %size, i4 %nmemb) { ; CHECK-LABEL: @n4_not_and( ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i4 [[SIZE:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: [[UMUL:%.*]] = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 [[SIZE]], i4 [[NMEMB:%.*]]) +; CHECK-NEXT: [[UMUL_OV:%.*]] = extractvalue { i4, i1 } [[UMUL]], 1 +; CHECK-NEXT: [[AND:%.*]] = or i1 [[UMUL_OV]], [[CMP]] +; CHECK-NEXT: ret i1 [[AND]] ; %cmp = icmp ne i4 %size, 0 %umul = tail call { i4, i1 } @llvm.umul.with.overflow.i4(i4 %size, i4 %nmemb) diff --git a/llvm/test/Transforms/InstSimplify/result-of-add-of-negative-is-non-zero-and-no-underflow.ll b/llvm/test/Transforms/InstSimplify/result-of-add-of-negative-is-non-zero-and-no-underflow.ll index 38bc66ff4d69..abcbb78889f1 100644 --- a/llvm/test/Transforms/InstSimplify/result-of-add-of-negative-is-non-zero-and-no-underflow.ll +++ b/llvm/test/Transforms/InstSimplify/result-of-add-of-negative-is-non-zero-and-no-underflow.ll @@ -18,7 +18,10 @@ define i1 @t1(i8 %base, i8 %offset) { ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i8 [[BASE]], [[OFFSET:%.*]] ; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]]) -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp ne i8 [[ADJUSTED]], 0 +; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ult i8 [[ADJUSTED]], [[BASE]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[NOT_NULL]], [[NO_UNDERFLOW]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %base, 0 call void @llvm.assume(i1 %cmp) @@ -36,7 +39,10 @@ define i1 @t2_commutative(i8 %base, i8 %offset) { ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i8 [[BASE]], [[OFFSET:%.*]] ; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]]) -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp ne i8 [[ADJUSTED]], 0 +; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ugt i8 [[BASE]], [[ADJUSTED]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[NOT_NULL]], [[NO_UNDERFLOW]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %base, 0 call void @llvm.assume(i1 %cmp) @@ -57,7 +63,10 @@ define i1 @t3(i8 %base, i8 %offset) { ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i8 [[BASE]], [[OFFSET:%.*]] ; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]]) -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp eq i8 [[ADJUSTED]], 0 +; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp uge i8 [[ADJUSTED]], [[BASE]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[NOT_NULL]], [[NO_UNDERFLOW]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %base, 0 call void @llvm.assume(i1 %cmp) @@ -75,7 +84,10 @@ define i1 @t4_commutative(i8 %base, i8 %offset) { ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i8 [[BASE]], [[OFFSET:%.*]] ; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]]) -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp eq i8 [[ADJUSTED]], 0 +; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ule i8 [[BASE]], [[ADJUSTED]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[NOT_NULL]], [[NO_UNDERFLOW]] +; CHECK-NEXT: ret i1 [[R]] ; %cmp = icmp slt i8 %base, 0 call void @llvm.assume(i1 %cmp) diff --git a/llvm/test/Transforms/PGOProfile/chr.ll b/llvm/test/Transforms/PGOProfile/chr.ll index c4030af943a9..c82800ec11a1 100644 --- a/llvm/test/Transforms/PGOProfile/chr.ll +++ b/llvm/test/Transforms/PGOProfile/chr.ll @@ -1298,11 +1298,12 @@ define i32 @test_chr_14(ptr %i, ptr %j, i32 %sum0, i1 %pred, i32 %z) !prof !14 { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[Z_FR:%.*]] = freeze i32 [[Z:%.*]] ; CHECK-NEXT: [[I0:%.*]] = load i32, ptr [[I:%.*]], align 4 -; CHECK-NEXT: [[V1:%.*]] = icmp eq i32 [[Z_FR]], 1 -; CHECK-NEXT: br i1 [[V1]], label [[BB1:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15]] +; CHECK-NEXT: [[V1_NOT:%.*]] = icmp eq i32 [[Z_FR]], 1 +; CHECK-NEXT: br i1 [[V1_NOT]], label [[BB1:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15]] ; CHECK: entry.split.nonchr: +; CHECK-NEXT: [[PRED_FR:%.*]] = freeze i1 [[PRED:%.*]] ; CHECK-NEXT: [[V0:%.*]] = icmp eq i32 [[Z_FR]], 0 -; CHECK-NEXT: [[V3_NONCHR:%.*]] = and i1 [[V0]], [[PRED:%.*]] +; CHECK-NEXT: [[V3_NONCHR:%.*]] = and i1 [[V0]], [[PRED_FR]] ; CHECK-NEXT: br i1 [[V3_NONCHR]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]] ; CHECK: bb0.nonchr: ; CHECK-NEXT: call void @foo()