forked from OSchip/llvm-project
Big programs have tons of global variable initializers, and most passes don't care
about them. Try to delete them if it doesn't affect the passes. llvm-svn: 5918
This commit is contained in:
parent
b0143880f4
commit
65e5f653fd
|
@ -244,6 +244,36 @@ bool BugDriver::debugCrash() {
|
|||
<< getPassesString(PassesToRun) << "\n";
|
||||
|
||||
EmitProgressBytecode("passinput");
|
||||
|
||||
// See if we can get away with nuking all of the global variable initializers
|
||||
// in the program...
|
||||
if (Program->gbegin() != Program->gend()) {
|
||||
Module *M = CloneModule(Program);
|
||||
bool DeletedInit = false;
|
||||
for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
|
||||
if (I->hasInitializer()) {
|
||||
I->setInitializer(0);
|
||||
I->setLinkage(GlobalValue::ExternalLinkage);
|
||||
DeletedInit = true;
|
||||
}
|
||||
|
||||
if (!DeletedInit) {
|
||||
delete M; // No change made...
|
||||
} else {
|
||||
// See if the program still causes a crash...
|
||||
std::cout << "\nChecking to see if we can delete global inits: ";
|
||||
std::swap(Program, M);
|
||||
if (runPasses(PassesToRun)) { // Still crashes?
|
||||
AnyReduction = true;
|
||||
delete M;
|
||||
std::cout << "\n*** Able to remove all global initializers!\n";
|
||||
} else { // No longer crashes?
|
||||
delete Program; // Restore program.
|
||||
Program = M;
|
||||
std::cout << " - Removing all global inits hides problem!\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now try to reduce the number of functions in the module to something small.
|
||||
std::vector<Function*> Functions;
|
||||
|
|
Loading…
Reference in New Issue