Changeset View
Changeset View
Standalone View
Standalone View
polly/trunk/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; | |||||
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; | |||||
} | } | ||||
__isl_give isl_schedule_node * | __isl_give isl_schedule_node * | ||||
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); | ||||
▲ Show 20 Lines • Show All 1,094 Lines • Show Last 20 Lines |