[llvm-commits] [llvm] r85789 - in /llvm/trunk: lib/Transforms/Scalar/SCCP.cpp test/Transforms/SCCP/loadtest.ll
Chris Lattner
sabre at nondot.org
Sun Nov 1 22:06:14 PST 2009
Author: lattner
Date: Mon Nov 2 00:06:14 2009
New Revision: 85789
URL: http://llvm.org/viewvc/llvm-project?rev=85789&view=rev
Log:
Use the libanalysis 'ConstantFoldLoadFromConstPtr' function
instead of reinventing SCCP-specific logic. This gives us
new powers.
Modified:
llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
llvm/trunk/test/Transforms/SCCP/loadtest.ll
Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=85789&r1=85788&r2=85789&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Mon Nov 2 00:06:14 2009
@@ -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 @@
/// 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 @@
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 @@
// 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 @@
// 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 @@
}
}
- // 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 @@
//
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 @@
}
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.
Modified: llvm/trunk/test/Transforms/SCCP/loadtest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SCCP/loadtest.ll?rev=85789&r1=85788&r2=85789&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SCCP/loadtest.ll (original)
+++ llvm/trunk/test/Transforms/SCCP/loadtest.ll Mon Nov 2 00:06:14 2009
@@ -1,5 +1,6 @@
; This test makes sure that these instructions are properly constant propagated.
-;
+
+target datalayout = "e-p:32:32"
; RUN: opt < %s -sccp -S | not grep load
@@ -20,7 +21,13 @@
define i32 @test3() {
%A = getelementptr [2 x { i32, float }]* @Y, i64 0, i64 0, i32 0 ; <i32*> [#uses=1]
- %B = load i32* %A ; <i32> [#uses=1]
+ %B = load i32* %A
ret i32 %B
}
+define i8 @test4() {
+ %A = bitcast i32* @X to i8*
+ %B = load i8* %A
+ ret i8 %B
+}
+
More information about the llvm-commits
mailing list