Index: llvm/lib/Analysis/InstructionSimplify.cpp =================================================================== --- llvm/lib/Analysis/InstructionSimplify.cpp +++ llvm/lib/Analysis/InstructionSimplify.cpp @@ -1480,38 +1480,18 @@ else return nullptr; - // X < Y && Y != 0 --> X < Y - // X < Y || Y != 0 --> Y != 0 - if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_NE) - return IsAnd ? UnsignedICmp : ZeroICmp; - // X <= Y && Y != 0 --> X <= Y iff X != 0 // X <= Y || Y != 0 --> Y != 0 iff X != 0 if (UnsignedPred == ICmpInst::ICMP_ULE && EqPred == ICmpInst::ICMP_NE && isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) return IsAnd ? UnsignedICmp : ZeroICmp; - // X >= Y && Y == 0 --> Y == 0 - // X >= Y || Y == 0 --> X >= Y - if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ) - return IsAnd ? ZeroICmp : UnsignedICmp; - // X > Y && Y == 0 --> Y == 0 iff X != 0 // X > Y || Y == 0 --> X > Y iff X != 0 if (UnsignedPred == ICmpInst::ICMP_UGT && EqPred == ICmpInst::ICMP_EQ && isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) return IsAnd ? ZeroICmp : UnsignedICmp; - // X < Y && Y == 0 --> false - if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ && - IsAnd) - return getFalse(UnsignedICmp->getType()); - - // X >= Y || Y != 0 --> true - if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_NE && - !IsAnd) - return getTrue(UnsignedICmp->getType()); - return nullptr; } @@ -1690,6 +1670,78 @@ return nullptr; } +/// Try to eliminate compares with signed or unsigned min/max constants. +static Value *simplifyAndOrOfICmpsWithLimitConst(ICmpInst *Cmp0, ICmpInst *Cmp1, + bool IsAnd) { + // Canonicalize an equality compare as Cmp0. + if (Cmp1->isEquality()) + std::swap(Cmp0, Cmp1); + if (!Cmp0->isEquality()) + return nullptr; + + // The equality compare must be against a constant. The non-equality compare + // must include a common operand (X). Canonicalize the common operand as + // operand 0 (the predicate is swapped if the common operand was operand 1). + ICmpInst::Predicate Pred0 = Cmp0->getPredicate(); + Value *X = Cmp0->getOperand(0); + const APInt *C; + ICmpInst::Predicate Pred1; + if (!match(Cmp0->getOperand(1), m_APInt(C)) || + !match(Cmp1, m_c_ICmp(Pred1, m_Specific(X), m_Value())) || + ICmpInst::isEquality(Pred1)) + return nullptr; + + // DeMorganize if this is 'or': P0 || P1 --> !P0 && !P1. + if (!IsAnd) { + Pred0 = ICmpInst::getInversePredicate(Pred0); + Pred1 = ICmpInst::getInversePredicate(Pred1); + } + + // Normalize to unsigned compare and unsigned min/max value. + // Example for 8-bit: -128 + 128 -> 0; 127 + 128 -> 255 + APInt MinMaxC = *C; + if (ICmpInst::isSigned(Pred1)) { + Pred1 = ICmpInst::getUnsignedPredicate(Pred1); + MinMaxC += APInt::getSignedMinValue(C->getBitWidth()); + } + + if (MinMaxC.isMaxValue()) { + // (X == MAX) && (X < Y) --> false + // (X != MAX) || (X >= Y) --> true + if (Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_ULT) + return ConstantInt::get(Cmp0->getType(), !IsAnd); + + // (X == MAX) && (X >= Y) --> X == MAX + // (X != MAX) || (X < Y) --> X != MAX + if (Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_UGE) + return Cmp0; + + // (X != MAX) && (X < Y) --> X < Y + // (X == MAX) || (X >= Y) --> X >= Y + if (Pred0 == ICmpInst::ICMP_NE && Pred1 == ICmpInst::ICMP_ULT) + return Cmp1; + } + + if (MinMaxC.isMinValue()) { + // (X == MIN) && (X > Y) --> false + // (X != MIN) || (X <= Y) --> true + if (Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_UGT) + return ConstantInt::get(Cmp0->getType(), !IsAnd); + + // (X == MIN) && (X <= Y) --> X == MIN + // (X != MIN) || (X > Y) --> X != MIN + if (Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_ULE) + return Cmp0; + + // (X != MIN) && (X > Y) --> X > Y + // (X == MIN) || (X <= Y) --> X <= Y + if (Pred0 == ICmpInst::ICMP_NE && Pred1 == ICmpInst::ICMP_UGT) + return Cmp1; + } + + return nullptr; +} + static Value *simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q) { if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true, Q)) @@ -1705,6 +1757,9 @@ if (Value *X = simplifyAndOrOfICmpsWithConstants(Op0, Op1, true)) return X; + if (Value *X = simplifyAndOrOfICmpsWithLimitConst(Op0, Op1, true)) + return X; + if (Value *X = simplifyAndOrOfICmpsWithZero(Op0, Op1, true)) return X; @@ -1778,6 +1833,9 @@ if (Value *X = simplifyAndOrOfICmpsWithConstants(Op0, Op1, false)) return X; + if (Value *X = simplifyAndOrOfICmpsWithLimitConst(Op0, Op1, false)) + return X; + if (Value *X = simplifyAndOrOfICmpsWithZero(Op0, Op1, false)) return X; Index: llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll =================================================================== --- llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll +++ llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll @@ -15,10 +15,7 @@ define i1 @slt_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_and_max( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -28,10 +25,7 @@ define <2 x i1> @slt_and_max_commute(<2 x i8> %x, <2 x i8> %y) { ; CHECK-LABEL: @slt_and_max_commute( -; 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]] +; CHECK-NEXT: ret <2 x i1> zeroinitializer ; %cmp = icmp slt <2 x i8> %x, %y %cmpeq = icmp eq <2 x i8> %x, @@ -41,10 +35,7 @@ define i1 @slt_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_max( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -54,10 +45,7 @@ define i1 @slt_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_max_commute( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -67,10 +55,7 @@ define i1 @ult_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_max( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -80,10 +65,7 @@ define i1 @ult_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_max_commute( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -93,10 +75,7 @@ define i1 @ult_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_max( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -106,10 +85,7 @@ define i1 @ult_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_max_commute( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -125,10 +101,7 @@ define i1 @sgt_and_min(i9 %x, i9 %y) { ; CHECK-LABEL: @sgt_and_min( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp sgt i9 %x, %y %cmpeq = icmp eq i9 %x, 256 @@ -138,10 +111,7 @@ define i1 @sgt_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_and_min_commute( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -151,10 +121,7 @@ define i1 @sgt_swap_and_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_min( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -164,10 +131,7 @@ define i1 @sgt_swap_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_min_commute( -; 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]] +; CHECK-NEXT: ret i1 false ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -223,10 +187,7 @@ define i1 @sge_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_not_max( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -236,10 +197,7 @@ define i1 @sge_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_not_max_commute( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -249,10 +207,7 @@ define i1 @sge_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_not_max( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -262,10 +217,7 @@ define i1 @sge_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_not_max_commute( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -275,10 +227,7 @@ define i1 @uge_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_not_max( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -288,10 +237,7 @@ define i1 @uge_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_not_max_commute( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -301,10 +247,7 @@ define i1 @uge_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_not_max( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -314,10 +257,7 @@ define i1 @uge_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_not_max_commute( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -333,10 +273,7 @@ define i1 @sle_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_not_min( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -346,10 +283,7 @@ define i1 @sle_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_not_min_commute( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -359,10 +293,7 @@ define i1 @sle_swap_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_not_min( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -372,10 +303,7 @@ define i1 @sle_swap_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_not_min_commute( -; 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]] +; CHECK-NEXT: ret i1 true ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -431,10 +359,8 @@ define i1 @sge_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_and_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -444,10 +370,8 @@ define i1 @sge_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_and_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -457,10 +381,8 @@ define i1 @sge_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_and_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -470,10 +392,8 @@ define i1 @sge_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_and_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -483,10 +403,8 @@ define i1 @uge_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_and_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -496,10 +414,8 @@ define i1 @uge_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_and_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -509,10 +425,8 @@ define i1 @uge_swap_and_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_and_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -522,10 +436,8 @@ define i1 @uge_swap_and_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_and_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -541,10 +453,8 @@ define i1 @sle_and_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_and_min( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -554,10 +464,8 @@ define i1 @sle_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_and_min_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -567,10 +475,8 @@ define i1 @sle_swap_and_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_and_min( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -580,10 +486,8 @@ define i1 @sle_swap_and_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_and_min_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -644,9 +548,7 @@ define i1 @sge_or_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -657,9 +559,7 @@ define i1 @sge_or_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_or_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sge i8 %x, %y %cmpeq = icmp eq i8 %x, 127 @@ -670,9 +570,7 @@ define i1 @sge_swap_or_max(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -683,9 +581,7 @@ define i1 @sge_swap_or_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sge_swap_or_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sle i8 %y, %x %cmpeq = icmp eq i8 %x, 127 @@ -696,9 +592,7 @@ define i1 @uge_or_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -709,9 +603,7 @@ define i1 @uge_or_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_or_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp uge i8 %x, %y %cmpeq = icmp eq i8 %x, 255 @@ -722,9 +614,7 @@ define i1 @uge_swap_or_max(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -735,9 +625,7 @@ define i1 @uge_swap_or_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @uge_swap_or_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ule i8 %y, %x %cmpeq = icmp eq i8 %x, 255 @@ -754,9 +642,7 @@ define i1 @sle_or_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_min( ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -767,9 +653,7 @@ define i1 @sle_or_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_or_min_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sle i8 %x, %y %cmpeq = icmp eq i8 %x, 128 @@ -780,9 +664,7 @@ define i1 @sle_swap_or_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_min( ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -793,9 +675,7 @@ define i1 @sle_swap_or_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sle_swap_or_min_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sge i8 %y, %x %cmpeq = icmp eq i8 %x, 128 @@ -856,9 +736,7 @@ define i1 @slt_and_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_and_not_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -869,9 +747,7 @@ define i1 @slt_and_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_and_not_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -882,9 +758,7 @@ define i1 @slt_swap_and_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_not_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -895,9 +769,7 @@ define i1 @slt_swap_and_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_and_not_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -908,9 +780,7 @@ define i1 @ult_and_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_not_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -921,9 +791,7 @@ define i1 @ult_and_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_and_not_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -934,9 +802,7 @@ define i1 @ult_swap_and_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_not_max( ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -947,9 +813,7 @@ define i1 @ult_swap_and_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_and_not_max_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -966,9 +830,7 @@ define i1 @sgt_and_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_and_not_min( ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -979,9 +841,7 @@ define i1 @sgt_and_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_and_not_min_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -992,9 +852,7 @@ define i1 @sgt_swap_and_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_not_min( ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -1005,9 +863,7 @@ define i1 @sgt_swap_and_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_and_not_min_commute( ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128 -; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -1067,10 +923,8 @@ define i1 @slt_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_or_not_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -1080,10 +934,8 @@ define i1 @slt_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_or_not_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp slt i8 %x, %y %cmpeq = icmp ne i8 %x, 127 @@ -1093,10 +945,8 @@ define i1 @slt_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_or_not_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -1106,10 +956,8 @@ define i1 @slt_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @slt_swap_or_not_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sgt i8 %y, %x %cmpeq = icmp ne i8 %x, 127 @@ -1119,10 +967,8 @@ define i1 @ult_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_or_not_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -1132,10 +978,8 @@ define i1 @ult_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_or_not_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp ult i8 %x, %y %cmpeq = icmp ne i8 %x, 255 @@ -1145,10 +989,8 @@ define i1 @ult_swap_or_not_max(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_or_not_max( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -1158,10 +1000,8 @@ define i1 @ult_swap_or_not_max_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @ult_swap_or_not_max_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp ugt i8 %y, %x %cmpeq = icmp ne i8 %x, 255 @@ -1177,10 +1017,8 @@ define i1 @sgt_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_or_not_min( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -1190,10 +1028,8 @@ define i1 @sgt_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_or_not_min_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp sgt i8 %x, %y %cmpeq = icmp ne i8 %x, 128 @@ -1203,10 +1039,8 @@ define i1 @sgt_swap_or_not_min(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_or_not_min( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp ne i8 %x, 128 @@ -1216,10 +1050,8 @@ define i1 @sgt_swap_or_not_min_commute(i8 %x, i8 %y) { ; CHECK-LABEL: @sgt_swap_or_not_min_commute( -; 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]] +; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128 +; CHECK-NEXT: ret i1 [[CMPEQ]] ; %cmp = icmp slt i8 %y, %x %cmpeq = icmp ne i8 %x, 128