Changeset View
Changeset View
Standalone View
Standalone View
lib/Transform/ScheduleOptimizer.cpp
Show First 20 Lines • Show All 427 Lines • ▼ Show 20 Lines | ScheduleTreeOptimizer::applyRegisterTiling(__isl_take isl_schedule_node *Node, | ||||
int DefaultTileSize) { | int DefaultTileSize) { | ||||
auto *Ctx = isl_schedule_node_get_ctx(Node); | auto *Ctx = isl_schedule_node_get_ctx(Node); | ||||
Node = tileNode(Node, "Register tiling", TileSizes, DefaultTileSize); | Node = tileNode(Node, "Register tiling", TileSizes, DefaultTileSize); | ||||
Node = isl_schedule_node_band_set_ast_build_options( | Node = isl_schedule_node_band_set_ast_build_options( | ||||
Node, isl_union_set_read_from_str(Ctx, "{unroll[x]}")); | Node, isl_union_set_read_from_str(Ctx, "{unroll[x]}")); | ||||
return Node; | return Node; | ||||
} | } | ||||
namespace { | |||||
bool isSimpleInnermostBand(const isl::schedule_node &Node) { | |||||
assert(isl_schedule_node_get_type(Node.keep()) == isl_schedule_node_band); | |||||
assert(isl_schedule_node_n_children(Node.keep()) == 1); | |||||
auto ChildType = isl_schedule_node_get_type(Node.child(0).keep()); | |||||
if (ChildType == isl_schedule_node_leaf) | |||||
return true; | |||||
grosser: Why do you start a new namespace here?
Also, please do not try to imitate the isl lowercase… | |||||
if (ChildType != isl_schedule_node_sequence) | |||||
return false; | |||||
auto Sequence = Node.child(0); | |||||
for (int c = 0, nc = isl_schedule_node_n_children(Sequence.keep()); c < nc; | |||||
++c) { | |||||
auto Child = Sequence.child(c); | |||||
if (isl_schedule_node_get_type(Child.keep()) != isl_schedule_node_filter) | |||||
return false; | |||||
if (isl_schedule_node_get_type(Child.child(0).keep()) != | |||||
isl_schedule_node_leaf) | |||||
return false; | |||||
} | |||||
return true; | |||||
} | |||||
} // namespace | |||||
bool ScheduleTreeOptimizer::isTileableBandNode( | bool ScheduleTreeOptimizer::isTileableBandNode( | ||||
__isl_keep isl_schedule_node *Node) { | __isl_keep isl_schedule_node *Node) { | ||||
if (isl_schedule_node_get_type(Node) != isl_schedule_node_band) | if (isl_schedule_node_get_type(Node) != isl_schedule_node_band) | ||||
return false; | return false; | ||||
if (isl_schedule_node_n_children(Node) != 1) | if (isl_schedule_node_n_children(Node) != 1) | ||||
return false; | return false; | ||||
if (!isl_schedule_node_band_get_permutable(Node)) | if (!isl_schedule_node_band_get_permutable(Node)) | ||||
return false; | return false; | ||||
auto Space = isl_schedule_node_band_get_space(Node); | auto Space = isl_schedule_node_band_get_space(Node); | ||||
auto Dims = isl_space_dim(Space, isl_dim_set); | auto Dims = isl_space_dim(Space, isl_dim_set); | ||||
isl_space_free(Space); | isl_space_free(Space); | ||||
if (Dims <= 1) | if (Dims <= 1) | ||||
return false; | return false; | ||||
auto Child = isl_schedule_node_get_child(Node, 0); | auto ManagedNode = isl::manage(isl_schedule_node_copy(Node)); | ||||
auto Type = isl_schedule_node_get_type(Child); | return isSimpleInnermostBand(ManagedNode); | ||||
isl_schedule_node_free(Child); | |||||
if (Type != isl_schedule_node_leaf) | |||||
return false; | |||||
return true; | |||||
} | } | ||||
Not Done ReplyInline ActionsPlease use CamelCase for variable names.The only lower_case we see here is due to isl function names. All the code we use should be CamelCase. grosser: Please use CamelCase for variable names.The only lower_case we see here is due to isl function… | |||||
__isl_give isl_schedule_node * | __isl_give isl_schedule_node * | ||||
Not Done ReplyInline ActionsWe only check the type of the child of the child, but never the child itself. Maybe it makes sense to check that the child type is a filter node as well? grosser: We only check the type of the child of the child, but never the child itself. Maybe it makes… | |||||
ScheduleTreeOptimizer::standardBandOpts(__isl_take isl_schedule_node *Node, | ScheduleTreeOptimizer::standardBandOpts(__isl_take isl_schedule_node *Node, | ||||
void *User) { | void *User) { | ||||
if (FirstLevelTiling) | if (FirstLevelTiling) | ||||
Node = tileNode(Node, "1st level tiling", FirstLevelTileSizes, | Node = tileNode(Node, "1st level tiling", FirstLevelTileSizes, | ||||
FirstLevelDefaultTileSize); | FirstLevelDefaultTileSize); | ||||
if (SecondLevelTiling) | if (SecondLevelTiling) | ||||
Node = tileNode(Node, "2nd level tiling", SecondLevelTileSizes, | Node = tileNode(Node, "2nd level tiling", SecondLevelTileSizes, | ||||
Not Done ReplyInline ActionsIt probably makes sense to move all this functionality in a function "bool isSimpleInnerMostBand()" which can also be documented. grosser: It probably makes sense to move all this functionality in a function "bool… | |||||
SecondLevelDefaultTileSize); | SecondLevelDefaultTileSize); | ||||
if (RegisterTiling) | if (RegisterTiling) | ||||
Node = | Node = | ||||
applyRegisterTiling(Node, RegisterTileSizes, RegisterDefaultTileSize); | applyRegisterTiling(Node, RegisterTileSizes, RegisterDefaultTileSize); | ||||
if (PollyVectorizerChoice == VECTORIZER_NONE) | if (PollyVectorizerChoice == VECTORIZER_NONE) | ||||
return Node; | return Node; | ||||
▲ Show 20 Lines • Show All 1,083 Lines • Show Last 20 Lines |
Why do you start a new namespace here?
Also, please do not try to imitate the isl lowercase function names. LLVM uses CamelCase.
Also, this function only makes sense to be called on a node with a single child. Maybe we should assert this?