diff options
author | Chris Lattner <sabre@nondot.org> | 2004-03-14 20:02:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-03-14 20:02:07 +0000 |
commit | 7546c3884a400b72d10fc19f120c6798b294a39d (patch) | |
tree | 943f14421d2c3bd21e4a995dfcb30854ce658cb0 /tools/bugpoint | |
parent | 41bc0b069c74afa05e92a97ff2c5d3cfa7426505 (diff) | |
download | external_llvm-7546c3884a400b72d10fc19f120c6798b294a39d.zip external_llvm-7546c3884a400b72d10fc19f120c6798b294a39d.tar.gz external_llvm-7546c3884a400b72d10fc19f120c6798b294a39d.tar.bz2 |
Add a method to extract a loop
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12391 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/bugpoint')
-rw-r--r-- | tools/bugpoint/BugDriver.h | 5 | ||||
-rw-r--r-- | tools/bugpoint/ExtractFunction.cpp | 38 |
2 files changed, 42 insertions, 1 deletions
diff --git a/tools/bugpoint/BugDriver.h b/tools/bugpoint/BugDriver.h index f15481f..eb48eb7 100644 --- a/tools/bugpoint/BugDriver.h +++ b/tools/bugpoint/BugDriver.h @@ -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. diff --git a/tools/bugpoint/ExtractFunction.cpp b/tools/bugpoint/ExtractFunction.cpp index 41b5641..8e39261 100644 --- a/tools/bugpoint/ExtractFunction.cpp +++ b/tools/bugpoint/ExtractFunction.cpp @@ -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. // |