aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/IPO/DeadArgumentElimination.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-11-15 06:10:55 +0000
committerChris Lattner <sabre@nondot.org>2007-11-15 06:10:55 +0000
commit6b863f4976b8cbc44f486fa32b0b130776449117 (patch)
tree1a4d25fc4379e2d76930d14421d663148da5a7c6 /lib/Transforms/IPO/DeadArgumentElimination.cpp
parent4780ce0bf2140862af7a7d32591f2b69bf1c77c0 (diff)
downloadexternal_llvm-6b863f4976b8cbc44f486fa32b0b130776449117.zip
external_llvm-6b863f4976b8cbc44f486fa32b0b130776449117.tar.gz
external_llvm-6b863f4976b8cbc44f486fa32b0b130776449117.tar.bz2
Fix PR1788 by taking the approach suggested by Richard Smith.
Thanks to him for his detailed analysis of the problem. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44162 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO/DeadArgumentElimination.cpp')
-rw-r--r--lib/Transforms/IPO/DeadArgumentElimination.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp
index 8dd0925..3d345ee 100644
--- a/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -604,23 +604,28 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
}
bool DAE::runOnModule(Module &M) {
- // First phase: loop through the module, determining which arguments are live.
- // We assume all arguments are dead unless proven otherwise (allowing us to
- // determine that dead arguments passed into recursive functions are dead).
- //
- DOUT << "DAE - Determining liveness\n";
+ bool Changed = false;
+ // First pass: Do a simple check to see if any functions can have their "..."
+ // removed. We can do this if they never call va_start. This loop cannot be
+ // fused with the next loop, because deleting a function invalidates
+ // information computed while surveying other functions.
+ DOUT << "DAE - Deleting dead varargs\n";
for (Module::iterator I = M.begin(), E = M.end(); I != E; ) {
Function &F = *I++;
if (F.getFunctionType()->isVarArg())
- if (DeleteDeadVarargs(F))
- continue;
-
- SurveyFunction(F);
+ Changed |= DeleteDeadVarargs(F);
}
+
+ // Second phase:loop through the module, determining which arguments are live.
+ // We assume all arguments are dead unless proven otherwise (allowing us to
+ // determine that dead arguments passed into recursive functions are dead).
+ //
+ DOUT << "DAE - Determining liveness\n";
+ for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
+ SurveyFunction(*I);
// Loop over the instructions to inspect, propagating liveness among arguments
// and return values which are MaybeLive.
-
while (!InstructionsToInspect.empty()) {
Instruction *I = InstructionsToInspect.back();
InstructionsToInspect.pop_back();
@@ -680,7 +685,7 @@ bool DAE::runOnModule(Module &M) {
// to do.
if (MaybeLiveArguments.empty() && DeadArguments.empty() &&
MaybeLiveRetVal.empty() && DeadRetVal.empty())
- return false;
+ return Changed;
// Otherwise, compact into one set, and start eliminating the arguments from
// the functions.