From: David Majnemer Date: Mon, 8 Dec 2014 18:30:43 +0000 (+0000) Subject: InstSimplify: Try to bring back the rest of r223583 X-Git-Tag: android-x86-7.1-r4~54709 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=fca9c7b21c2849f7722e5d6e53397134cd9329bf;p=android-x86%2Fexternal-llvm.git InstSimplify: Try to bring back the rest of r223583 This reverts r223624 with a small tweak, hopefully this will make stage3 equivalent. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223679 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 5c536aa79c4..2cf1661cfd9 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -1448,8 +1448,8 @@ static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp, Value *X, *Y; ICmpInst::Predicate EqPred; - if (!match(ZeroICmp, m_ICmp(EqPred, m_Value(Y), m_Zero())) && - ICmpInst::isEquality(EqPred)) + if (!match(ZeroICmp, m_ICmp(EqPred, m_Value(Y), m_Zero())) || + !ICmpInst::isEquality(EqPred)) return nullptr; ICmpInst::Predicate UnsignedPred; @@ -1476,6 +1476,11 @@ static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp, return UnsignedICmp; } + // X < Y && Y == 0 --> false + if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ && + IsAnd) + return getFalse(UnsignedICmp->getType()); + return nullptr; } diff --git a/test/Transforms/InstSimplify/AndOrXor.ll b/test/Transforms/InstSimplify/AndOrXor.ll index c01c53ec4e1..ce3c2aa6af2 100644 --- a/test/Transforms/InstSimplify/AndOrXor.ll +++ b/test/Transforms/InstSimplify/AndOrXor.ll @@ -166,6 +166,15 @@ define i1 @and_icmp1(i32 %x, i32 %y) { ; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y ; CHECK: ret i1 %[[cmp]] +define i1 @and_icmp2(i32 %x, i32 %y) { + %1 = icmp ult i32 %x, %y + %2 = icmp eq i32 %y, 0 + %3 = and i1 %1, %2 + ret i1 %3 +} +; CHECK-LABEL: @and_icmp2( +; CHECK: ret i1 false + define i1 @or_icmp1(i32 %x, i32 %y) { %1 = icmp ult i32 %x, %y %2 = icmp ne i32 %y, 0