1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

Add a method to extract a loop

llvm-svn: 12391
This commit is contained in:
Chris Lattner 2004-03-14 20:02:07 +00:00
parent 95c238ef5b
commit 07b9a2c117
2 changed files with 42 additions and 1 deletions

View File

@ -178,6 +178,11 @@ public:
///
Module *performFinalCleanups(Module *M, bool MayModifySemantics = false);
/// ExtractLoop - Given a module, extract up to one loop from it into a new
/// function. This returns null if there are no extractable loops in the
/// program or if the loop extractor crashes.
Module *ExtractLoop(Module *M);
private:
/// ParseInputFile - Given a bytecode or assembly input filename, parse and
/// return it, or return null if not possible.

View File

@ -117,7 +117,7 @@ Module *BugDriver::performFinalCleanups(Module *M, bool MayModifySemantics) {
std::swap(Program, M);
if (Failed) {
std::cerr << "Final cleanups failed. Sorry. :(\n";
std::cerr << "Final cleanups failed. Sorry. :( Please report a bug!\n";
} else {
delete M;
M = ParseInputFile(Filename);
@ -132,6 +132,42 @@ Module *BugDriver::performFinalCleanups(Module *M, bool MayModifySemantics) {
}
/// ExtractLoop - Given a module, extract up to one loop from it into a new
/// function. This returns null if there are no extractable loops in the
/// program or if the loop extractor crashes.
Module *BugDriver::ExtractLoop(Module *M) {
std::vector<const PassInfo*> LoopExtractPasses;
LoopExtractPasses.push_back(getPI(createSingleLoopExtractorPass()));
std::swap(Program, M);
std::string Filename;
bool Failed = runPasses(LoopExtractPasses, Filename);
std::swap(Program, M);
if (Failed) {
std::cerr << "Loop extraction failed. Sorry. :( Please report a bug!\n";
return 0;
} else {
Module *NewM = ParseInputFile(Filename);
if (NewM == 0) {
std::cerr << getToolName() << ": Error reading bytecode file '"
<< Filename << "'!\n";
exit(1);
}
removeFile(Filename);
// Check to see if we created any new functions. If not, no loops were
// extracted and we should return null.
if (M->size() != NewM->size()) {
delete NewM;
return 0;
}
return NewM;
}
}
// DeleteFunctionBody - "Remove" the function by deleting all of its basic
// blocks, making it external.
//