Skip to content

Commit 1acf246

Browse files
committed
Refactor common code of LPM and NPM
1 parent e027a4a commit 1acf246

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

polly/lib/Transform/CodePreparation.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,26 @@
2727
using namespace llvm;
2828
using namespace polly;
2929

30+
static bool runCodePreprationImpl(Function &F, DominatorTree *DT, LoopInfo *LI,
31+
RegionInfo *RI) {
32+
// Find first non-alloca instruction. Every basic block has a non-alloca
33+
// instruction, as every well formed basic block has a terminator.
34+
auto &EntryBlock = F.getEntryBlock();
35+
BasicBlock::iterator I = EntryBlock.begin();
36+
while (isa<AllocaInst>(I))
37+
++I;
38+
39+
// Abort if not necessary to split
40+
if (I->isTerminator() && isa<BranchInst>(I) &&
41+
cast<BranchInst>(I)->isUnconditional())
42+
return false;
43+
44+
// splitBlock updates DT, LI and RI.
45+
splitEntryBlockForAlloca(&EntryBlock, DT, LI, RI);
46+
47+
return true;
48+
}
49+
3050
namespace {
3151

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

38-
LoopInfo *LI;
39-
ScalarEvolution *SE;
40-
4158
void clear();
4259

4360
public:
@@ -58,19 +75,11 @@ class CodePreparation final : public FunctionPass {
5875

5976
PreservedAnalyses CodePreparationPass::run(Function &F,
6077
FunctionAnalysisManager &FAM) {
61-
62-
// Find first non-alloca instruction. Every basic block has a non-alloca
63-
// instruction, as every well formed basic block has a terminator.
64-
auto &EntryBlock = F.getEntryBlock();
65-
BasicBlock::iterator I = EntryBlock.begin();
66-
while (isa<AllocaInst>(I))
67-
++I;
68-
6978
auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);
7079
auto &LI = FAM.getResult<LoopAnalysis>(F);
71-
72-
// splitBlock updates DT, LI and RI.
73-
splitEntryBlockForAlloca(&EntryBlock, &DT, &LI, nullptr);
80+
bool Changed = runCodePreprationImpl(F, &DT, &LI, nullptr);
81+
if (!Changed)
82+
return PreservedAnalyses::all();
7483

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

8594
void CodePreparation::getAnalysisUsage(AnalysisUsage &AU) const {
8695
AU.addRequired<LoopInfoWrapperPass>();
87-
AU.addRequired<ScalarEvolutionWrapperPass>();
8896

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

99-
LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
100-
SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
107+
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
108+
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
109+
RegionInfo *RI = &getAnalysis<RegionInfoPass>().getRegionInfo();
101110

102-
splitEntryBlockForAlloca(&F.getEntryBlock(), this);
111+
runCodePreprationImpl(F, DT, LI, RI);
103112

104113
return true;
105114
}

0 commit comments

Comments
 (0)