aboutsummaryrefslogtreecommitdiffstats
path: root/tools/bugpoint
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-03-14 20:02:07 +0000
committerChris Lattner <sabre@nondot.org>2004-03-14 20:02:07 +0000
commit7546c3884a400b72d10fc19f120c6798b294a39d (patch)
tree943f14421d2c3bd21e4a995dfcb30854ce658cb0 /tools/bugpoint
parent41bc0b069c74afa05e92a97ff2c5d3cfa7426505 (diff)
downloadexternal_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.h5
-rw-r--r--tools/bugpoint/ExtractFunction.cpp38
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.
//