diff options
author | Chad Rosier <mcrosier@codeaurora.org> | 2016-04-19 17:19:14 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@codeaurora.org> | 2016-04-19 17:19:14 +0000 |
commit | b7dfbb40a3fd9491c0188eca0ed2af66fa5ef44f (patch) | |
tree | 16244dfe2289ef44c3491a20a63af0f9516cfaa5 /llvm/lib/Analysis/InstructionSimplify.cpp | |
parent | 79e096dbaf974a775e72181d748c4e7c3e659047 (diff) | |
download | bcm5719-llvm-b7dfbb40a3fd9491c0188eca0ed2af66fa5ef44f.tar.gz bcm5719-llvm-b7dfbb40a3fd9491c0188eca0ed2af66fa5ef44f.zip |
[ValueTracking] Improve isImpliedCondition for conditions with matching operands.
This patch improves SimplifyCFG to catch cases like:
if (a < b) {
if (a > b) <- known to be false
unreachable;
}
Phabricator Revision: http://reviews.llvm.org/D18905
llvm-svn: 266767
Diffstat (limited to 'llvm/lib/Analysis/InstructionSimplify.cpp')
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index cefa18712dd..ca3ab1058a8 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -2131,14 +2131,16 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, if (match(RHS, m_Zero())) return LHS; break; - case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_UGE: { // X >=u 1 -> X if (match(RHS, m_One())) return LHS; - if (isImpliedCondition(RHS, LHS, Q.DL)) + bool ImpliedTrue; + if (isImpliedCondition(RHS, LHS, ImpliedTrue, Q.DL) && ImpliedTrue) return getTrue(ITy); break; - case ICmpInst::ICMP_SGE: + } + case ICmpInst::ICMP_SGE: { /// For signed comparison, the values for an i1 are 0 and -1 /// respectively. This maps into a truth table of: /// LHS | RHS | LHS >=s RHS | LHS implies RHS @@ -2146,9 +2148,11 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, /// 0 | 1 | 1 (0 >= -1) | 1 /// 1 | 0 | 0 (-1 >= 0) | 0 /// 1 | 1 | 1 (-1 >= -1) | 1 - if (isImpliedCondition(LHS, RHS, Q.DL)) + bool ImpliedTrue; + if (isImpliedCondition(LHS, RHS, ImpliedTrue, Q.DL) && ImpliedTrue) return getTrue(ITy); break; + } case ICmpInst::ICMP_SLT: // X <s 0 -> X if (match(RHS, m_Zero())) @@ -2159,11 +2163,13 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, if (match(RHS, m_One())) return LHS; break; - case ICmpInst::ICMP_ULE: - if (isImpliedCondition(LHS, RHS, Q.DL)) + case ICmpInst::ICMP_ULE: { + bool ImpliedTrue; + if (isImpliedCondition(LHS, RHS, ImpliedTrue, Q.DL) && ImpliedTrue) return getTrue(ITy); break; } + } } // If we are comparing with zero then try hard since this is a common case. |