Add support for two-level tiling
By default we only use one level of tiling for loops, but in general tiling
for multiple levels is trivial for us. Hence, we add a set of options that
allow people to play with a second level of tiling. If this is profitable for
some cases we can work on heuristics that allow us to identify these cases
and use two-level tiling for them.
llvm-svn: 245563
diff --git a/polly/lib/Transform/ScheduleOptimizer.cpp b/polly/lib/Transform/ScheduleOptimizer.cpp
index c0584c1..8c773d8 100644
--- a/polly/lib/Transform/ScheduleOptimizer.cpp
+++ b/polly/lib/Transform/ScheduleOptimizer.cpp
@@ -71,11 +71,6 @@
#define DEBUG_TYPE "polly-opt-isl"
-static cl::opt<bool> EnableTiling("polly-tiling",
- cl::desc("Enable loop tiling"),
- cl::init(true), cl::ZeroOrMore,
- cl::cat(PollyCategory));
-
static cl::opt<std::string>
OptimizeDeps("polly-opt-optimize-only",
cl::desc("Only a certain kind of dependences (all/raw)"),
@@ -113,18 +108,40 @@
"The number of loop iterations to strip-mine for pre-vectorization"),
cl::Hidden, cl::init(4), cl::ZeroOrMore, cl::cat(PollyCategory));
-static cl::opt<int> DefaultTileSize(
+static cl::opt<bool> FirstLevelTiling("polly-tiling",
+ cl::desc("Enable loop tiling"),
+ cl::init(true), cl::ZeroOrMore,
+ cl::cat(PollyCategory));
+
+static cl::opt<int> FirstLevelDefaultTileSize(
"polly-default-tile-size",
cl::desc("The default tile size (if not enough were provided by"
" --polly-tile-sizes)"),
cl::Hidden, cl::init(32), cl::ZeroOrMore, cl::cat(PollyCategory));
-static cl::list<int> TileSizes("polly-tile-sizes",
- cl::desc("A tile size"
- " for each loop dimension, filled with"
- " --polly-default-tile-size"),
- cl::Hidden, cl::ZeroOrMore, cl::CommaSeparated,
- cl::cat(PollyCategory));
+static cl::list<int> FirstLevelTileSizes(
+ "polly-tile-sizes", cl::desc("A tile size for each loop dimension, filled "
+ "with --polly-default-tile-size"),
+ cl::Hidden, cl::ZeroOrMore, cl::CommaSeparated, cl::cat(PollyCategory));
+
+static cl::opt<bool>
+ SecondLevelTiling("polly-2nd-level-tiling",
+ cl::desc("Enable a 2nd level loop of loop tiling"),
+ cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
+
+static cl::opt<int> SecondLevelDefaultTileSize(
+ "polly-2nd-level-default-tile-size",
+ cl::desc("The default 2nd-level tile size (if not enough were provided by"
+ " --polly-2nd-level-tile-sizes)"),
+ cl::Hidden, cl::init(16), cl::ZeroOrMore, cl::cat(PollyCategory));
+
+static cl::list<int>
+ SecondLevelTileSizes("polly-2nd-level-tile-sizes",
+ cl::desc("A tile size for each loop dimension, filled "
+ "with --polly-default-tile-size"),
+ cl::Hidden, cl::ZeroOrMore, cl::CommaSeparated,
+ cl::cat(PollyCategory));
+
namespace {
class IslScheduleOptimizer : public ScopPass {
@@ -325,8 +342,11 @@
if (!isTileableBandNode(Node))
return Node;
- if (EnableTiling)
- Node = tileNode(Node, TileSizes, DefaultTileSize);
+ if (FirstLevelTiling)
+ Node = tileNode(Node, FirstLevelTileSizes, FirstLevelDefaultTileSize);
+
+ if (SecondLevelTiling)
+ Node = tileNode(Node, SecondLevelTileSizes, SecondLevelDefaultTileSize);
if (PollyVectorizerChoice == VECTORIZER_NONE)
return Node;