diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index 8ad53170d74..41106cdb7c0 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3622,25 +3622,30 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { Constant::getAllOnesValue(Op0->getType())); } break; - case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGT: { if (Op0Min.ugt(Op1Max)) // A >u B -> true if min(A) > max(B) return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType())); + if (Op0Max.ule(Op1Min)) // A >u B -> false if max(A) <= max(B) return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType())); if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B) return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1); - if (ConstantInt *CI = dyn_cast(Op1)) { - if (Op1Min == Op0Max-1) // A >u C -> A == C+1 if max(a)-1 == C + + const APInt *CmpC; + if (match(Op1, m_APInt(CmpC))) { + // A >u C -> A == C+1 if max(a)-1 == C + if (*CmpC == Op0Max - 1) return new ICmpInst(ICmpInst::ICMP_EQ, Op0, - Builder->getInt(CI->getValue()+1)); + ConstantInt::get(Op1->getType(), *CmpC + 1)); // (x >u 2147483647) -> (x true if sign bit set - if (CI->isMaxValue(true)) + if (CmpC->isMaxSignedValue()) return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Constant::getNullValue(Op0->getType())); } break; + } case ICmpInst::ICMP_SLT: if (Op0Max.slt(Op1Min)) // A true if max(A) < min(C) return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType())); diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index 7aae75bc459..4a731fb108a 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -1672,7 +1672,7 @@ define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) { define <2 x i1> @icmp_shl_1_V_uge_2147483648_vec(<2 x i32> %V) { ; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648_vec( ; CHECK-NEXT: [[SHL:%.*]] = shl <2 x i32> , %V -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[SHL]], +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[SHL]], zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %shl = shl <2 x i32> , %V @@ -2591,6 +2591,10 @@ define i1 @ugtMaxSignedVal(i8 %a) { } define <2 x i1> @ugtMaxSignedValVec(<2 x i8> %a) { +; CHECK-LABEL: @ugtMaxSignedValVec( +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %a, zeroinitializer +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; %cmp = icmp ugt <2 x i8> %a, ret <2 x i1> %cmp } @@ -2609,7 +2613,7 @@ define i1 @ugtKnownBits(i8 %a) { define <2 x i1> @ugtKnownBitsVec(<2 x i8> %a) { ; CHECK-LABEL: @ugtKnownBitsVec( ; CHECK-NEXT: [[B:%.*]] = and <2 x i8> %a, -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> [[B]], +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[B]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %b = and <2 x i8> %a,