[polly] r314900 - [ScopBuilder] Introduce -polly-stmt-granularity option. NFC.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 4 05:18:58 PDT 2017
Author: meinersbur
Date: Wed Oct 4 05:18:57 2017
New Revision: 314900
URL: http://llvm.org/viewvc/llvm-project?rev=314900&view=rev
Log:
[ScopBuilder] Introduce -polly-stmt-granularity option. NFC.
The option is introduced with only one possible value
-polly-stmt-granularity=bb which represents the current behaviour, which
is outlined into the new function buildSequentialBlockStmts().
More options will be added in future commits.
Modified:
polly/trunk/include/polly/ScopBuilder.h
polly/trunk/lib/Analysis/ScopBuilder.cpp
Modified: polly/trunk/include/polly/ScopBuilder.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopBuilder.h?rev=314900&r1=314899&r2=314900&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopBuilder.h (original)
+++ polly/trunk/include/polly/ScopBuilder.h Wed Oct 4 05:18:57 2017
@@ -229,6 +229,12 @@ class ScopBuilder {
/// @returns True if the instruction should be modeled.
bool shouldModelInst(Instruction *Inst, Loop *L);
+ /// Create one or more ScopStmts for @p BB.
+ ///
+ /// Consecutive instructions are associated to the same statement until a
+ /// separator is found.
+ void buildSequentialBlockStmts(BasicBlock *BB);
+
/// Create ScopStmt for all BBs and non-affine subregions of @p SR.
///
/// @param SR A subregion of @p R.
Modified: polly/trunk/lib/Analysis/ScopBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopBuilder.cpp?rev=314900&r1=314899&r2=314900&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopBuilder.cpp (original)
+++ polly/trunk/lib/Analysis/ScopBuilder.cpp Wed Oct 4 05:18:57 2017
@@ -102,6 +102,16 @@ static cl::opt<bool> DisableMultiplicati
cl::desc("Disable multiplicative reductions"), cl::Hidden, cl::ZeroOrMore,
cl::init(false), cl::cat(PollyCategory));
+enum class GranularityChoice { BasicBlocks };
+
+static cl::opt<GranularityChoice> StmtGranularity(
+ "polly-stmt-granularity",
+ cl::desc(
+ "Algorithm to use for splitting basic blocks into multiple statements"),
+ cl::values(clEnumValN(GranularityChoice::BasicBlocks, "bb",
+ "One statement per basic block")),
+ cl::init(GranularityChoice::BasicBlocks), cl::cat(PollyCategory));
+
void ScopBuilder::buildPHIAccesses(ScopStmt *PHIStmt, PHINode *PHI,
Region *NonAffineSubRegion,
bool IsExitBlock) {
@@ -673,6 +683,24 @@ bool ScopBuilder::shouldModelInst(Instru
!canSynthesize(Inst, *scop, &SE, L);
}
+void ScopBuilder::buildSequentialBlockStmts(BasicBlock *BB) {
+ Loop *SurroundingLoop = LI.getLoopFor(BB);
+
+ int Count = 0;
+ std::vector<Instruction *> Instructions;
+ for (Instruction &Inst : *BB) {
+ if (shouldModelInst(&Inst, SurroundingLoop))
+ Instructions.push_back(&Inst);
+ if (Inst.getMetadata("polly_split_after")) {
+ scop->addScopStmt(BB, SurroundingLoop, Instructions, Count);
+ Count++;
+ Instructions.clear();
+ }
+ }
+
+ scop->addScopStmt(BB, SurroundingLoop, Instructions, Count);
+}
+
void ScopBuilder::buildStmts(Region &SR) {
if (scop->isNonAffineSubRegion(&SR)) {
std::vector<Instruction *> Instructions;
@@ -689,23 +717,12 @@ void ScopBuilder::buildStmts(Region &SR)
if (I->isSubRegion())
buildStmts(*I->getNodeAs<Region>());
else {
- int Count = 0;
- std::vector<Instruction *> Instructions;
- for (Instruction &Inst : *I->getNodeAs<BasicBlock>()) {
- Loop *L = LI.getLoopFor(Inst.getParent());
- if (shouldModelInst(&Inst, L))
- Instructions.push_back(&Inst);
- if (Inst.getMetadata("polly_split_after")) {
- Loop *SurroundingLoop = LI.getLoopFor(I->getNodeAs<BasicBlock>());
- scop->addScopStmt(I->getNodeAs<BasicBlock>(), SurroundingLoop,
- Instructions, Count);
- Count++;
- Instructions.clear();
- }
+ BasicBlock *BB = I->getNodeAs<BasicBlock>();
+ switch (StmtGranularity) {
+ case GranularityChoice::BasicBlocks:
+ buildSequentialBlockStmts(BB);
+ break;
}
- Loop *SurroundingLoop = LI.getLoopFor(I->getNodeAs<BasicBlock>());
- scop->addScopStmt(I->getNodeAs<BasicBlock>(), SurroundingLoop,
- Instructions, Count);
}
}
More information about the llvm-commits
mailing list