InstSimplify: Try to bring back the rest of r223583
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 8 Dec 2014 18:30:43 +0000 (18:30 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 8 Dec 2014 18:30:43 +0000 (18:30 +0000)
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

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/AndOrXor.ll

index 5c536aa79c480c657aefd31481aa65ef1aecddf9..2cf1661cfd90ac57b84b3479f59f090499625dc9 100644 (file)
@@ -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;
 }
 
index c01c53ec4e1e0cad3f98e95f32eb6a53392ed7a0..ce3c2aa6af222406528ffd1dfc1638770853a0f6 100644 (file)
@@ -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