Use marker nodes to annotate the different levels of tiling
Currently, marker nodes are ignored during AST generation, but visible in the
-debug-only=polly-ast output.
llvm-svn: 245809
diff --git a/polly/lib/Transform/ScheduleOptimizer.cpp b/polly/lib/Transform/ScheduleOptimizer.cpp
index 1061447..0296af4 100644
--- a/polly/lib/Transform/ScheduleOptimizer.cpp
+++ b/polly/lib/Transform/ScheduleOptimizer.cpp
@@ -187,13 +187,16 @@
/// @brief Tile a schedule node.
///
/// @param Node The node to tile.
+ /// @param Identifier An name that identifies this kind of tiling and
+ /// that is used to mark the tiled loops in the
+ /// generated AST.
/// @param TileSizes A vector of tile sizes that should be used for
/// tiling.
/// @param DefaultTileSize A default tile size that is used for dimensions
/// that are not covered by the TileSizes vector.
static __isl_give isl_schedule_node *
- tileNode(__isl_take isl_schedule_node *Node, ArrayRef<int> TileSizes,
- int DefaultTileSize);
+ tileNode(__isl_take isl_schedule_node *Node, const char *Identifier,
+ ArrayRef<int> TileSizes, int DefaultTileSize);
/// @brief Check if this node is a band node we want to tile.
///
@@ -317,17 +320,30 @@
__isl_give isl_schedule_node *
IslScheduleOptimizer::tileNode(__isl_take isl_schedule_node *Node,
- ArrayRef<int> TileSizes, int DefaultTileSize) {
+ const char *Identifier, ArrayRef<int> TileSizes,
+ int DefaultTileSize) {
auto Ctx = isl_schedule_node_get_ctx(Node);
auto Space = isl_schedule_node_band_get_space(Node);
auto Dims = isl_space_dim(Space, isl_dim_set);
auto Sizes = isl_multi_val_zero(Space);
+ std::string IdentifierString(Identifier);
for (unsigned i = 0; i < Dims; i++) {
auto tileSize = i < TileSizes.size() ? TileSizes[i] : DefaultTileSize;
Sizes = isl_multi_val_set_val(Sizes, i, isl_val_int_from_si(Ctx, tileSize));
}
+ auto TileLoopMarkerStr = IdentifierString + " - Tiles";
+ isl_id *TileLoopMarker =
+ isl_id_alloc(Ctx, TileLoopMarkerStr.c_str(), nullptr);
+ Node = isl_schedule_node_insert_mark(Node, TileLoopMarker);
+ Node = isl_schedule_node_child(Node, 0);
Node = isl_schedule_node_band_tile(Node, Sizes);
- return isl_schedule_node_child(Node, 0);
+ Node = isl_schedule_node_child(Node, 0);
+ auto PointLoopMarkerStr = IdentifierString + " - Points";
+ isl_id *PointLoopMarker =
+ isl_id_alloc(Ctx, PointLoopMarkerStr.c_str(), nullptr);
+ Node = isl_schedule_node_insert_mark(Node, PointLoopMarker);
+ Node = isl_schedule_node_child(Node, 0);
+ return Node;
}
bool IslScheduleOptimizer::isTileableBandNode(
@@ -365,14 +381,17 @@
return Node;
if (FirstLevelTiling)
- Node = tileNode(Node, FirstLevelTileSizes, FirstLevelDefaultTileSize);
+ Node = tileNode(Node, "1st level tiling", FirstLevelTileSizes,
+ FirstLevelDefaultTileSize);
if (SecondLevelTiling)
- Node = tileNode(Node, SecondLevelTileSizes, SecondLevelDefaultTileSize);
+ Node = tileNode(Node, "2nd level tiling", SecondLevelTileSizes,
+ SecondLevelDefaultTileSize);
if (RegisterTiling) {
auto *Ctx = isl_schedule_node_get_ctx(Node);
- Node = tileNode(Node, RegisterTileSizes, RegisterDefaultTileSize);
+ Node = tileNode(Node, "Register tiling", RegisterTileSizes,
+ RegisterDefaultTileSize);
Node = isl_schedule_node_band_set_ast_build_options(
Node, isl_union_set_read_from_str(Ctx, "{unroll[x]}"));
}