diff options
author | Chris Lattner <sabre@nondot.org> | 2009-11-02 06:06:14 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-11-02 06:06:14 +0000 |
commit | 5638dc618acd725d1128e77cd28a6e0ed66185c4 (patch) | |
tree | 5e3e3140041bb6a69f075944139f5020f402336b /lib/Transforms/Scalar/SCCP.cpp | |
parent | 2a0433beea44b63da36fd051c29af69ff2675b38 (diff) | |
download | llvm-5638dc618acd725d1128e77cd28a6e0ed66185c4.tar.gz llvm-5638dc618acd725d1128e77cd28a6e0ed66185c4.tar.bz2 llvm-5638dc618acd725d1128e77cd28a6e0ed66185c4.tar.xz |
Use the libanalysis 'ConstantFoldLoadFromConstPtr' function
instead of reinventing SCCP-specific logic. This gives us
new powers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85789 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index dd95ed8fa4..dd9f7651a5 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -28,6 +28,7 @@ #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/Transforms/Utils/Local.h" +#include "llvm/Target/TargetData.h" #include "llvm/Support/CallSite.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -154,6 +155,7 @@ namespace { /// Constant Propagation. /// class SCCPSolver : public InstVisitor<SCCPSolver> { + const TargetData *TD; DenseSet<BasicBlock*> BBExecutable;// The basic blocks that are executable DenseMap<Value*, LatticeVal> ValueState; // The state each value is in. @@ -194,6 +196,7 @@ class SCCPSolver : public InstVisitor<SCCPSolver> { typedef std::pair<BasicBlock*, BasicBlock*> Edge; DenseSet<Edge> KnownFeasibleEdges; public: + SCCPSolver(const TargetData *td) : TD(td) {} /// MarkBlockExecutable - This method can be used by clients to mark all of /// the blocks that are known to be intrinsically live in the processed unit. @@ -1109,16 +1112,15 @@ void SCCPSolver::visitStoreInst(StoreInst &SI) { // global, we can replace the load with the loaded constant value! void SCCPSolver::visitLoadInst(LoadInst &I) { LatticeVal PtrVal = getValueState(I.getOperand(0)); + if (PtrVal.isUndefined()) return; // The pointer is not resolved yet! LatticeVal &IV = ValueState[&I]; if (IV.isOverdefined()) return; - if (PtrVal.isUndefined()) return; // The pointer is not resolved yet! - if (!PtrVal.isConstant() || I.isVolatile()) return markOverdefined(IV, &I); - Value *Ptr = PtrVal.getConstant(); + Constant *Ptr = PtrVal.getConstant(); // load null -> null if (isa<ConstantPointerNull>(Ptr) && I.getPointerAddressSpace() == 0) @@ -1126,11 +1128,7 @@ void SCCPSolver::visitLoadInst(LoadInst &I) { // Transform load (constant global) into the value loaded. if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) { - if (GV->isConstant()) { - if (GV->hasDefinitiveInitializer()) - return markConstant(IV, &I, GV->getInitializer()); - - } else if (!TrackedGlobals.empty()) { + if (!TrackedGlobals.empty()) { // If we are tracking this global, merge in the known value for it. DenseMap<GlobalVariable*, LatticeVal>::iterator It = TrackedGlobals.find(GV); @@ -1141,14 +1139,9 @@ void SCCPSolver::visitLoadInst(LoadInst &I) { } } - // Transform load (constantexpr_GEP global, 0, ...) into the value loaded. - if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr)) - if (CE->getOpcode() == Instruction::GetElementPtr) - if (GlobalVariable *GV = dyn_cast<GlobalVariable>(CE->getOperand(0))) - if (GV->isConstant() && GV->hasDefinitiveInitializer()) - if (Constant *V = - ConstantFoldLoadThroughGEPConstantExpr(GV->getInitializer(), CE)) - return markConstant(IV, &I, V); + // Transform load from a constant into a constant if possible. + if (Constant *C = ConstantFoldLoadFromConstPtr(Ptr, TD)) + return markConstant(IV, &I, C); // Otherwise we cannot say for certain what value this load will produce. // Bail out. @@ -1530,7 +1523,7 @@ static void DeleteInstructionInBlock(BasicBlock *BB) { // bool SCCP::runOnFunction(Function &F) { DEBUG(errs() << "SCCP on function '" << F.getName() << "'\n"); - SCCPSolver Solver; + SCCPSolver Solver(getAnalysisIfAvailable<TargetData>()); // Mark the first block of the function as being executable. Solver.MarkBlockExecutable(F.begin()); @@ -1640,7 +1633,7 @@ static bool AddressIsTaken(GlobalValue *GV) { } bool IPSCCP::runOnModule(Module &M) { - SCCPSolver Solver; + SCCPSolver Solver(getAnalysisIfAvailable<TargetData>()); // Loop over all functions, marking arguments to those with their addresses // taken or that are external as overdefined. |