diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 6d7a6c1b648..02ffad47bee 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -1510,16 +1510,16 @@ bool SCCPSolver::ResolvedUndefsIn(Function &F) { return false; } -static bool tryToReplaceInstWithConstant(SCCPSolver Solver, Instruction *Inst, - bool shouldEraseFromParent) { +template <typename ArgOrInst> +static bool tryToReplaceWithConstant(SCCPSolver Solver, ArgOrInst *AI) { Constant *Const = nullptr; - if (Inst->getType()->isStructTy()) { - std::vector<LatticeVal> IVs = Solver.getStructLatticeValueFor(Inst); + if (AI->getType()->isStructTy()) { + std::vector<LatticeVal> IVs = Solver.getStructLatticeValueFor(AI); if (std::any_of(IVs.begin(), IVs.end(), [](LatticeVal &LV) { return LV.isOverdefined(); })) return false; std::vector<Constant *> ConstVals; - StructType *ST = dyn_cast<StructType>(Inst->getType()); + StructType *ST = dyn_cast<StructType>(AI->getType()); for (unsigned i = 0, e = ST->getNumElements(); i != e; ++i) { LatticeVal V = IVs[i]; ConstVals.push_back(V.isConstant() @@ -1528,18 +1528,23 @@ static bool tryToReplaceInstWithConstant(SCCPSolver Solver, Instruction *Inst, } Const = ConstantStruct::get(ST, ConstVals); } else { - LatticeVal IV = Solver.getLatticeValueFor(Inst); + LatticeVal IV = Solver.getLatticeValueFor(AI); if (IV.isOverdefined()) return false; - - Const = - IV.isConstant() ? IV.getConstant() : UndefValue::get(Inst->getType()); + Const = IV.isConstant() ? IV.getConstant() : UndefValue::get(AI->getType()); } assert(Const && "Constant is nullptr here!"); - DEBUG(dbgs() << " Constant: " << *Const << " = " << *Inst << '\n'); + DEBUG(dbgs() << " Constant: " << *Const << " = " << *AI << '\n'); // Replaces all of the uses of a variable with uses of the constant. - Inst->replaceAllUsesWith(Const); + AI->replaceAllUsesWith(Const); + return true; +} + +static bool tryToReplaceInstWithConstant(SCCPSolver Solver, Instruction *Inst, + bool shouldEraseFromParent) { + if (!tryToReplaceWithConstant(Solver, Inst)) + return false; // Delete the instruction. if (shouldEraseFromParent) @@ -1766,17 +1771,8 @@ static bool runIPSCCP(Module &M, const DataLayout &DL, // TODO: Could use getStructLatticeValueFor to find out if the entire // result is a constant and replace it entirely if so. - LatticeVal IV = Solver.getLatticeValueFor(&*AI); - if (IV.isOverdefined()) continue; - - Constant *CST = IV.isConstant() ? - IV.getConstant() : UndefValue::get(AI->getType()); - DEBUG(dbgs() << "*** Arg " << *AI << " = " << *CST <<"\n"); - - // Replaces all of the uses of a variable with uses of the - // constant. - AI->replaceAllUsesWith(CST); - ++IPNumArgsElimed; + if (tryToReplaceWithConstant(Solver, &*AI)) + ++IPNumArgsElimed; } } |