diff options
Diffstat (limited to 'lib/Transforms/Scalar/SCCP.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 4f09bee53a81..907ece8fcce9 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -317,7 +317,10 @@ private:    void markConstant(LatticeVal &IV, Value *V, Constant *C) {      if (!IV.markConstant(C)) return;      DEBUG(dbgs() << "markConstant: " << *C << ": " << *V << '\n'); -    InstWorkList.push_back(V); +    if (IV.isOverdefined()) +      OverdefinedInstWorkList.push_back(V); +    else +      InstWorkList.push_back(V);    }    void markConstant(Value *V, Constant *C) { @@ -327,9 +330,13 @@ private:    void markForcedConstant(Value *V, Constant *C) {      assert(!V->getType()->isStructTy() && "Should use other method"); -    ValueState[V].markForcedConstant(C); +    LatticeVal &IV = ValueState[V]; +    IV.markForcedConstant(C);      DEBUG(dbgs() << "markForcedConstant: " << *C << ": " << *V << '\n'); -    InstWorkList.push_back(V); +    if (IV.isOverdefined()) +      OverdefinedInstWorkList.push_back(V); +    else +      InstWorkList.push_back(V);    } @@ -1445,6 +1452,8 @@ bool SCCPSolver::ResolvedUndefsIn(Function &F) {          // After a zero extend, we know the top part is zero.  SExt doesn't have          // to be handled here, because we don't know whether the top part is 1's          // or 0's. +      case Instruction::SIToFP:  // some FP values are not possible, just use 0. +      case Instruction::UIToFP:  // some FP values are not possible, just use 0.          markForcedConstant(I, Constant::getNullValue(ITy));          return true;        case Instruction::Mul:  | 
