diff --git a/lib/Analysis/LazyValueInfo.cpp b/lib/Analysis/LazyValueInfo.cpp index 659fa471aa8..d569b8595d1 100644 --- a/lib/Analysis/LazyValueInfo.cpp +++ b/lib/Analysis/LazyValueInfo.cpp @@ -141,19 +141,40 @@ public: if (RHS.isNotConstant()) { if (isNotConstant()) { - if (getNotConstant() != RHS.getNotConstant()) + if (getNotConstant() != RHS.getNotConstant() || + isa(getNotConstant()) || + isa(RHS.getNotConstant())) return markOverdefined(); return false; } - if (isConstant() && getConstant() != RHS.getNotConstant()) - return markOverdefined(); + if (isConstant()) { + if (getConstant() == RHS.getNotConstant() || + isa(RHS.getNotConstant()) || + isa(getConstant())) + return markOverdefined(); + return markNotConstant(RHS.getNotConstant()); + } + + assert(isUndefined() && "Unexpected lattice"); return markNotConstant(RHS.getNotConstant()); } - // RHS must be a constant, we must be undef or constant. - if (isConstant() && getConstant() != RHS.getConstant()) + // RHS must be a constant, we must be undef, constant, or notconstant. + if (isUndefined()) + return markConstant(RHS.getConstant()); + + if (isConstant()) { + if (getConstant() != RHS.getConstant()) + return markOverdefined(); + return false; + } + + // If we are known "!=4" and RHS is "==5", stay at "!=4". + if (getNotConstant() == RHS.getConstant() || + isa(getNotConstant()) || + isa(RHS.getConstant())) return markOverdefined(); - return markConstant(RHS.getConstant()); + return false; } }; diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp index e7a87e098d0..1bfad2d5d7e 100644 --- a/lib/Transforms/Scalar/JumpThreading.cpp +++ b/lib/Transforms/Scalar/JumpThreading.cpp @@ -275,6 +275,12 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ /// predecessor based on its terminator. // if (LVI) { + // FIXME: change this to use the more-rich 'getPredicateOnEdge' method if + // "I" is a non-local compare-with-a-constant instruction. This would be + // able to handle value inequalities better, for example if the compare is + // "X < 4" and "X < 3" is known true but "X < 4" itself is not available. + // Perhaps getConstantOnEdge should be smart enough to do this? + for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) { // If the value is known by LazyValueInfo to be a constant in a // predecessor, use that information to try to thread this block.