* Reduce the number of useless bytecode files produced by bugpoint.

- This also speeds it up as the bytecode writer isn't terribly fast.
* Add a new cleanup pass after everything else to run -funcresolve -globaldce


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5668 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-02-28 16:13:20 +00:00
parent 74cd04ea01
commit ba386d943f
3 changed files with 50 additions and 3 deletions

View File

@ -125,6 +125,12 @@ private:
///
Module *deleteInstructionFromProgram(Instruction *I, unsigned Simp) const;
/// performFinalCleanups - This method clones the current Program and performs
/// a series of cleanups intended to get rid of extra cruft on the module
/// before handing it to the user...
///
Module *performFinalCleanups() const;
/// initializeExecutionEnvironment - This method is used to set up the
/// environment for executing LLVM programs.
///

View File

@ -84,6 +84,7 @@ static unsigned CountFunctions(Module *M) {
///
bool BugDriver::debugPassCrash(const PassInfo *Pass) {
EmitProgressBytecode(Pass, "passinput");
bool Reduced = false, AnyReduction = false;
if (CountFunctions(Program) > 1) {
// Attempt to reduce the input program down to a single function that still
@ -106,7 +107,7 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
// reduce the testcase...
delete M;
EmitProgressBytecode(Pass, "reduced-"+I->getName());
Reduced = AnyReduction = true;
break;
}
@ -122,6 +123,11 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
}
}
if (Reduced) {
EmitProgressBytecode(Pass, "reduced-function");
Reduced = false;
}
// FIXME: This should attempt to delete entire basic blocks at a time to speed
// up convergence...
@ -159,8 +165,8 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
if (runPass(Pass)) {
// Yup, it does, we delete the old module, and continue trying to
// reduce the testcase...
EmitProgressBytecode(Pass, "reduced-" + I->getName());
delete M;
Reduced = AnyReduction = true;
goto TryAgain; // I wish I had a multi-level break here!
}
@ -171,6 +177,28 @@ bool BugDriver::debugPassCrash(const PassInfo *Pass) {
}
}
} while (Simplification);
// Try to clean up the testcase by running funcresolve and globaldce...
if (AnyReduction) {
std::cout << "\n*** Attempting to perform final cleanups: ";
Module *M = performFinalCleanups();
std::swap(Program, M);
// Find out if the pass still crashes on the cleaned up program...
if (runPass(Pass)) {
// Yup, it does, keep the reduced version...
delete M;
Reduced = AnyReduction = true;
} else {
delete Program; // Otherwise, restore the original module...
Program = M;
}
}
if (Reduced) {
EmitProgressBytecode(Pass, "reduced-simplified");
Reduced = false;
}
return false;
}

View File

@ -81,3 +81,16 @@ Module *BugDriver::deleteInstructionFromProgram(Instruction *I,
Passes.run(*Result);
return Result;
}
/// performFinalCleanups - This method clones the current Program and performs
/// a series of cleanups intended to get rid of extra cruft on the module
/// before handing it to the user...
///
Module *BugDriver::performFinalCleanups() const {
PassManager CleanupPasses;
CleanupPasses.add(createFunctionResolvingPass());
CleanupPasses.add(createGlobalDCEPass());
Module *M = CloneModule(Program);
CleanupPasses.run(*M);
return M;
}