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;