Skip to content
Merged
45 changes: 27 additions & 18 deletions polly/lib/Transform/CodePreparation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,26 @@
using namespace llvm;
using namespace polly;

static bool runCodePreprationImpl(Function &F, DominatorTree *DT, LoopInfo *LI,
RegionInfo *RI) {
// Find first non-alloca instruction. Every basic block has a non-alloca
// instruction, as every well formed basic block has a terminator.
auto &EntryBlock = F.getEntryBlock();
BasicBlock::iterator I = EntryBlock.begin();
while (isa<AllocaInst>(I))
++I;

// Abort if not necessary to split
if (I->isTerminator() && isa<BranchInst>(I) &&
cast<BranchInst>(I)->isUnconditional())
return false;

// splitBlock updates DT, LI and RI.
splitEntryBlockForAlloca(&EntryBlock, DT, LI, RI);

return true;
}

namespace {

/// Prepare the IR for the scop detection.
Expand All @@ -35,9 +55,6 @@ class CodePreparation final : public FunctionPass {
CodePreparation(const CodePreparation &) = delete;
const CodePreparation &operator=(const CodePreparation &) = delete;

LoopInfo *LI;
ScalarEvolution *SE;

void clear();

public:
Expand All @@ -58,19 +75,11 @@ class CodePreparation final : public FunctionPass {

PreservedAnalyses CodePreparationPass::run(Function &F,
FunctionAnalysisManager &FAM) {

// Find first non-alloca instruction. Every basic block has a non-alloca
// instruction, as every well formed basic block has a terminator.
auto &EntryBlock = F.getEntryBlock();
BasicBlock::iterator I = EntryBlock.begin();
while (isa<AllocaInst>(I))
++I;

auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);
auto &LI = FAM.getResult<LoopAnalysis>(F);

// splitBlock updates DT, LI and RI.
splitEntryBlockForAlloca(&EntryBlock, &DT, &LI, nullptr);
bool Changed = runCodePreprationImpl(F, &DT, &LI, nullptr);
if (!Changed)
return PreservedAnalyses::all();

PreservedAnalyses PA;
PA.preserve<DominatorTreeAnalysis>();
Expand All @@ -84,7 +93,6 @@ CodePreparation::~CodePreparation() { clear(); }

void CodePreparation::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfoWrapperPass>();
AU.addRequired<ScalarEvolutionWrapperPass>();

AU.addPreserved<LoopInfoWrapperPass>();
AU.addPreserved<RegionInfoPass>();
Expand All @@ -96,10 +104,11 @@ bool CodePreparation::runOnFunction(Function &F) {
if (skipFunction(F))
return false;

LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
RegionInfo *RI = &getAnalysis<RegionInfoPass>().getRegionInfo();

splitEntryBlockForAlloca(&F.getEntryBlock(), this);
runCodePreprationImpl(F, DT, LI, RI);

return true;
}
Expand Down