diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2012-05-04 21:33:30 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2012-05-04 21:33:30 +0000 |
commit | 30ba82933c433611e05b07ef95da36bba8721b8b (patch) | |
tree | 4338ee025d7756bb9e336e7a415624f823dede3d /lib/Transforms/Utils | |
parent | 7c52c97a2232756bbcc2fb4e664892bdb8b2d90c (diff) |
Teach the code extractor how to extract a sequence of blocks from
RegionInfo's RegionNode. This mirrors the logic for automating the
extraction from a Loop.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156208 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils')
-rw-r--r-- | lib/Transforms/Utils/CodeExtractor.cpp | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp index b23787dc49..f10dbbeef2 100644 --- a/lib/Transforms/Utils/CodeExtractor.cpp +++ b/lib/Transforms/Utils/CodeExtractor.cpp @@ -23,6 +23,8 @@ #include "llvm/Pass.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Analysis/RegionInfo.h" +#include "llvm/Analysis/RegionIterator.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Support/CommandLine.h" @@ -63,16 +65,16 @@ static bool isBlockValidForExtraction(const BasicBlock &BB) { } /// \brief Build a set of blocks to extract if the input blocks are viable. -static SetVector<BasicBlock *> -buildExtractionBlockSet(ArrayRef<BasicBlock *> BBs) { +template <typename IteratorT> +static SetVector<BasicBlock *> buildExtractionBlockSet(IteratorT BBBegin, + IteratorT BBEnd) { SetVector<BasicBlock *> Result; - assert(!BBs.empty()); + assert(BBBegin != BBEnd); // Loop over the blocks, adding them to our set-vector, and aborting with an // empty set if we encounter invalid blocks. - for (ArrayRef<BasicBlock *>::iterator I = BBs.begin(), E = BBs.end(); - I != E; ++I) { + for (IteratorT I = BBBegin, E = BBEnd; I != E; ++I) { if (!Result.insert(*I)) llvm_unreachable("Repeated basic blocks in extraction input"); @@ -83,8 +85,8 @@ buildExtractionBlockSet(ArrayRef<BasicBlock *> BBs) { } #ifndef NDEBUG - for (ArrayRef<BasicBlock *>::iterator I = llvm::next(BBs.begin()), - E = BBs.end(); + for (SetVector<BasicBlock *>::iterator I = llvm::next(Result.begin()), + E = Result.end(); I != E; ++I) for (pred_iterator PI = pred_begin(*I), PE = pred_end(*I); PI != PE; ++PI) @@ -96,6 +98,24 @@ buildExtractionBlockSet(ArrayRef<BasicBlock *> BBs) { return Result; } +/// \brief Helper to call buildExtractionBlockSet with an ArrayRef. +static SetVector<BasicBlock *> +buildExtractionBlockSet(ArrayRef<BasicBlock *> BBs) { + return buildExtractionBlockSet(BBs.begin(), BBs.end()); +} + +/// \brief Helper to call buildExtractionBlockSet with a RegionNode. +static SetVector<BasicBlock *> +buildExtractionBlockSet(const RegionNode &RN) { + if (!RN.isSubRegion()) + // Just a single BasicBlock. + return buildExtractionBlockSet(RN.getNodeAs<BasicBlock>()); + + const Region &R = *RN.getNodeAs<Region>(); + + return buildExtractionBlockSet(R.block_begin(), R.block_end()); +} + CodeExtractor::CodeExtractor(BasicBlock *BB, bool AggregateArgs) : DT(0), AggregateArgs(AggregateArgs||AggregateArgsOpt), Blocks(buildExtractionBlockSet(BB)), NumExitBlocks(~0U) {} @@ -109,6 +129,11 @@ CodeExtractor::CodeExtractor(DominatorTree &DT, Loop &L, bool AggregateArgs) : DT(&DT), AggregateArgs(AggregateArgs||AggregateArgsOpt), Blocks(buildExtractionBlockSet(L.getBlocks())), NumExitBlocks(~0U) {} +CodeExtractor::CodeExtractor(DominatorTree &DT, const RegionNode &RN, + bool AggregateArgs) + : DT(&DT), AggregateArgs(AggregateArgs||AggregateArgsOpt), + Blocks(buildExtractionBlockSet(RN)), NumExitBlocks(~0U) {} + /// definedInRegion - Return true if the specified value is defined in the /// extracted region. static bool definedInRegion(const SetVector<BasicBlock *> &Blocks, Value *V) { |