Skip to content

Commit

Permalink
[LVI] NFC. Extract LHS, RHS, Predicate locals in getValueFromCondition
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278007 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
arpilipe committed Aug 8, 2016
1 parent 1eae80e commit c14eb9a
Showing 1 changed file with 14 additions and 11 deletions.
25 changes: 14 additions & 11 deletions lib/Analysis/LazyValueInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1183,30 +1183,33 @@ bool getValueFromCondition(Value *Val, Value *Cond, LVILatticeVal &Result,
if (!ICI)
return false;

if (isa<Constant>(ICI->getOperand(1))) {
if (ICI->isEquality() && ICI->getOperand(0) == Val) {
Value *LHS = ICI->getOperand(0);
Value *RHS = ICI->getOperand(1);
CmpInst::Predicate Predicate = ICI->getPredicate();

if (isa<Constant>(RHS)) {
if (ICI->isEquality() && LHS == Val) {
// We know that V has the RHS constant if this is a true SETEQ or
// false SETNE.
if (isTrueDest == (ICI->getPredicate() == ICmpInst::ICMP_EQ))
Result = LVILatticeVal::get(cast<Constant>(ICI->getOperand(1)));
if (isTrueDest == (Predicate == ICmpInst::ICMP_EQ))
Result = LVILatticeVal::get(cast<Constant>(RHS));
else
Result = LVILatticeVal::getNot(cast<Constant>(ICI->getOperand(1)));
Result = LVILatticeVal::getNot(cast<Constant>(RHS));
return true;
}

// Recognize the range checking idiom that InstCombine produces.
// (X-C1) u< C2 --> [C1, C1+C2)
ConstantInt *NegOffset = nullptr;
if (ICI->getPredicate() == ICmpInst::ICMP_ULT)
match(ICI->getOperand(0), m_Add(m_Specific(Val),
m_ConstantInt(NegOffset)));
if (Predicate == ICmpInst::ICMP_ULT)
match(LHS, m_Add(m_Specific(Val), m_ConstantInt(NegOffset)));

ConstantInt *CI = dyn_cast<ConstantInt>(ICI->getOperand(1));
if (CI && (ICI->getOperand(0) == Val || NegOffset)) {
ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
if (CI && (LHS == Val || NegOffset)) {
// Calculate the range of values that are allowed by the comparison
ConstantRange CmpRange(CI->getValue());
ConstantRange TrueValues =
ConstantRange::makeAllowedICmpRegion(ICI->getPredicate(), CmpRange);
ConstantRange::makeAllowedICmpRegion(Predicate, CmpRange);

if (NegOffset) // Apply the offset from above.
TrueValues = TrueValues.subtract(NegOffset->getValue());
Expand Down

0 comments on commit c14eb9a

Please sign in to comment.