[llvm] r223679 - InstSimplify: Try to bring back the rest of r223583
David Majnemer
david.majnemer at gmail.com
Mon Dec 8 10:30:43 PST 2014
Author: majnemer
Date: Mon Dec 8 12:30:43 2014
New Revision: 223679
URL: http://llvm.org/viewvc/llvm-project?rev=223679&view=rev
Log:
InstSimplify: Try to bring back the rest of r223583
This reverts r223624 with a small tweak, hopefully this will make stage3
equivalent.
Modified:
llvm/trunk/lib/Analysis/InstructionSimplify.cpp
llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll
Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=223679&r1=223678&r2=223679&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Mon Dec 8 12:30:43 2014
@@ -1448,8 +1448,8 @@ static Value *simplifyUnsignedRangeCheck
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
return UnsignedICmp;
}
+ // X < Y && Y == 0 --> false
+ if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ &&
+ IsAnd)
+ return getFalse(UnsignedICmp->getType());
+
return nullptr;
}
Modified: llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll?rev=223679&r1=223678&r2=223679&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll Mon Dec 8 12:30:43 2014
@@ -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
More information about the llvm-commits
mailing list