mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-28 09:31:03 +00:00
Add a method to extract a loop
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12391 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
41bc0b069c
commit
7546c3884a
@ -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.
|
||||
|
@ -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.
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user