From 7546c3884a400b72d10fc19f120c6798b294a39d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 14 Mar 2004 20:02:07 +0000 Subject: [PATCH] Add a method to extract a loop git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12391 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/bugpoint/BugDriver.h | 5 ++++ tools/bugpoint/ExtractFunction.cpp | 38 +++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/bugpoint/BugDriver.h b/tools/bugpoint/BugDriver.h index f15481fde72..eb48eb7d9c3 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 41b5641ff50..8e392613c93 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 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. //