diff options
author | Chris Lattner <sabre@nondot.org> | 2007-11-15 06:10:55 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-11-15 06:10:55 +0000 |
commit | 6b863f4976b8cbc44f486fa32b0b130776449117 (patch) | |
tree | 1a4d25fc4379e2d76930d14421d663148da5a7c6 /lib/Transforms/IPO | |
parent | 4780ce0bf2140862af7a7d32591f2b69bf1c77c0 (diff) | |
download | external_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')
-rw-r--r-- | lib/Transforms/IPO/DeadArgumentElimination.cpp | 27 |
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. |