aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-06-25 04:12:49 +0000
committerChris Lattner <sabre@nondot.org>2003-06-25 04:12:49 +0000
commit9b2a14b6f1a7e1dc93f47778adb2d68f327f5ab9 (patch)
treed014c889181c4633bd735d74ef2c434600921774 /lib/Transforms
parente99f4cf4ac380cfeb235fbae6d418c165a76f556 (diff)
downloadexternal_llvm-9b2a14b6f1a7e1dc93f47778adb2d68f327f5ab9.zip
external_llvm-9b2a14b6f1a7e1dc93f47778adb2d68f327f5ab9.tar.gz
external_llvm-9b2a14b6f1a7e1dc93f47778adb2d68f327f5ab9.tar.bz2
Add argument to DAE to allow operation on non-internal functions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6895 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/IPO/DeadArgumentElimination.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp
index ad4e0e2..568fe47 100644
--- a/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -25,15 +25,27 @@ namespace {
Statistic<> NumArgumentsEliminated("deadargelim", "Number of args removed");
struct DAE : public Pass {
+ DAE(bool DFEF = false) : DeleteFromExternalFunctions(DFEF) {}
bool run(Module &M);
+
+ private:
+ bool DeleteFromExternalFunctions;
+ bool FunctionArgumentsIntrinsicallyAlive(const Function &F);
+ void RemoveDeadArgumentsFromFunction(Function *F,
+ std::set<Argument*> &DeadArguments);
};
RegisterOpt<DAE> X("deadargelim", "Dead Argument Elimination");
}
-// createDeadArgEliminationPass - This pass removes arguments from functions
-// which are not used by the body of the function.
-//
-Pass *createDeadArgEliminationPass() { return new DAE(); }
+/// createDeadArgEliminationPass - This pass removes arguments from functions
+/// which are not used by the body of the function. If
+/// DeleteFromExternalFunctions is true, the pass will modify functions that
+/// have external linkage, which is not usually safe (this is used by bugpoint
+/// to reduce testcases).
+///
+Pass *createDeadArgEliminationPass(bool DeleteFromExternalFunctions) {
+ return new DAE(DeleteFromExternalFunctions);
+}
// FunctionArgumentsIntrinsicallyAlive - Return true if the arguments of the
@@ -42,8 +54,8 @@ Pass *createDeadArgEliminationPass() { return new DAE(); }
// We consider arguments of non-internal functions to be intrinsically alive as
// well as arguments to functions which have their "address taken".
//
-static bool FunctionArgumentsIntrinsicallyAlive(const Function &F) {
- if (!F.hasInternalLinkage()) return true;
+bool DAE::FunctionArgumentsIntrinsicallyAlive(const Function &F) {
+ if (!F.hasInternalLinkage() && !DeleteFromExternalFunctions) return true;
for (Value::use_const_iterator I = F.use_begin(), E = F.use_end(); I!=E; ++I){
// If this use is anything other than a call site, the function is alive.
@@ -151,8 +163,8 @@ static void MarkArgumentLive(Argument *Arg,
// specified by the DeadArguments list. Transform the function and all of the
// callees of the function to not have these arguments.
//
-static void RemoveDeadArgumentsFromFunction(Function *F,
- std::set<Argument*> &DeadArguments){
+void DAE::RemoveDeadArgumentsFromFunction(Function *F,
+ std::set<Argument*> &DeadArguments){
// Start by computing a new prototype for the function, which is the same as
// the old function, but has fewer arguments.
const FunctionType *FTy = F->getFunctionType();
@@ -166,7 +178,7 @@ static void RemoveDeadArgumentsFromFunction(Function *F,
FTy->isVarArg());
// Create the new function body and insert it into the module...
- Function *NF = new Function(NFTy, Function::InternalLinkage, F->getName());
+ Function *NF = new Function(NFTy, F->getLinkage(), F->getName());
F->getParent()->getFunctionList().insert(F, NF);
// Loop over all of the callers of the function, transforming the call sites