[polly] r305676 - [ScheduleOptimizer] Move isolateFullPartialTiles and isolateAndUnrollMatMulInnerLoops to C++
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 19 03:40:12 PDT 2017
Author: grosser
Date: Mon Jun 19 05:40:12 2017
New Revision: 305676
URL: http://llvm.org/viewvc/llvm-project?rev=305676&view=rev
Log:
[ScheduleOptimizer] Move isolateFullPartialTiles and isolateAndUnrollMatMulInnerLoops to C++
Modified:
polly/trunk/include/polly/ScheduleOptimizer.h
polly/trunk/lib/External/isl/include/isl-noexceptions.h
polly/trunk/lib/Transform/ScheduleOptimizer.cpp
Modified: polly/trunk/include/polly/ScheduleOptimizer.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScheduleOptimizer.h?rev=305676&r1=305675&r2=305676&view=diff
==============================================================================
--- polly/trunk/include/polly/ScheduleOptimizer.h (original)
+++ polly/trunk/include/polly/ScheduleOptimizer.h Mon Jun 19 05:40:12 2017
@@ -124,8 +124,8 @@ public:
/// @param Node A schedule node band, which is a parent of a band node,
/// that contains a vector loop.
/// @return Modified isl_schedule_node.
- static __isl_give isl_schedule_node *
- isolateFullPartialTiles(__isl_take isl_schedule_node *Node, int VectorWidth);
+ static isl::schedule_node isolateFullPartialTiles(isl::schedule_node Node,
+ int VectorWidth);
private:
/// Tile a schedule node.
Modified: polly/trunk/lib/External/isl/include/isl-noexceptions.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/External/isl/include/isl-noexceptions.h?rev=305676&r1=305675&r2=305676&view=diff
==============================================================================
--- polly/trunk/lib/External/isl/include/isl-noexceptions.h (original)
+++ polly/trunk/lib/External/isl/include/isl-noexceptions.h Mon Jun 19 05:40:12 2017
@@ -2033,6 +2033,7 @@ public:
inline isl::schedule_node ancestor(int generation) const;
inline isl::boolean band_member_get_coincident(int pos) const;
inline isl::schedule_node band_member_set_coincident(int pos, int coincident) const;
+ inline isl::schedule_node band_set_ast_build_options(isl::union_set options) const;
inline isl::schedule_node child(int pos) const;
inline isl::set context_get_context() const;
inline isl::schedule_node cut() const;
@@ -9959,6 +9960,11 @@ isl::schedule_node schedule_node::band_m
return manage(res);
}
+isl::schedule_node schedule_node::band_set_ast_build_options(isl::union_set options) const {
+ auto res = isl_schedule_node_band_set_ast_build_options(copy(), options.release());
+ return manage(res);
+}
+
isl::schedule_node schedule_node::child(int pos) const {
auto res = isl_schedule_node_child(copy(), pos);
return manage(res);
Modified: polly/trunk/lib/Transform/ScheduleOptimizer.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Transform/ScheduleOptimizer.cpp?rev=305676&r1=305675&r2=305676&view=diff
==============================================================================
--- polly/trunk/lib/Transform/ScheduleOptimizer.cpp (original)
+++ polly/trunk/lib/Transform/ScheduleOptimizer.cpp Mon Jun 19 05:40:12 2017
@@ -236,79 +236,76 @@ static cl::opt<bool> OptimizedScops(
"transformations is applied on the schedule tree"),
cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
-/// Create an isl_union_set, which describes the isolate option based on
-/// IsoalteDomain.
+/// Create an isl::union_set, which describes the isolate option based on
+/// IsolateDomain.
///
-/// @param IsolateDomain An isl_set whose @p OutDimsNum last dimensions should
+/// @param IsolateDomain An isl::set whose @p OutDimsNum last dimensions should
/// belong to the current band node.
/// @param OutDimsNum A number of dimensions that should belong to
/// the current band node.
-static __isl_give isl_union_set *
-getIsolateOptions(__isl_take isl_set *IsolateDomain, unsigned OutDimsNum) {
- auto Dims = isl_set_dim(IsolateDomain, isl_dim_set);
+static isl::union_set getIsolateOptions(isl::set IsolateDomain,
+ unsigned OutDimsNum) {
+ unsigned Dims = IsolateDomain.dim(isl::dim::set);
assert(OutDimsNum <= Dims &&
"The isl_set IsolateDomain is used to describe the range of schedule "
"dimensions values, which should be isolated. Consequently, the "
"number of its dimensions should be greater than or equal to the "
"number of the schedule dimensions.");
- auto *IsolateRelation = isl_map_from_domain(IsolateDomain);
- IsolateRelation =
- isl_map_move_dims(IsolateRelation, isl_dim_out, 0, isl_dim_in,
- Dims - OutDimsNum, OutDimsNum);
- auto *IsolateOption = isl_map_wrap(IsolateRelation);
- auto *Id = isl_id_alloc(isl_set_get_ctx(IsolateOption), "isolate", nullptr);
- return isl_union_set_from_set(isl_set_set_tuple_id(IsolateOption, Id));
+ isl::map IsolateRelation = isl::map::from_domain(IsolateDomain);
+ IsolateRelation = IsolateRelation.move_dims(isl::dim::out, 0, isl::dim::in,
+ Dims - OutDimsNum, OutDimsNum);
+ isl::set IsolateOption = IsolateRelation.wrap();
+ isl::id Id = isl::id::alloc(IsolateOption.get_ctx(), "isolate", nullptr);
+ IsolateOption = IsolateOption.set_tuple_id(Id);
+ return isl::union_set(IsolateOption);
}
-/// Create an isl_union_set, which describes the atomic option for the dimension
-/// of the current node.
+/// Create an isl::union_set, which describes the atomic option for the
+/// dimension of the current node.
///
/// It may help to reduce the size of generated code.
///
-/// @param Ctx An isl_ctx, which is used to create the isl_union_set.
-static __isl_give isl_union_set *getAtomicOptions(isl_ctx *Ctx) {
- auto *Space = isl_space_set_alloc(Ctx, 0, 1);
- auto *AtomicOption = isl_set_universe(Space);
- auto *Id = isl_id_alloc(Ctx, "atomic", nullptr);
- return isl_union_set_from_set(isl_set_set_tuple_id(AtomicOption, Id));
+/// @param Ctx An isl::ctx, which is used to create the isl::union_set.
+static isl::union_set getAtomicOptions(isl::ctx Ctx) {
+ isl::space Space(Ctx, 0, 1);
+ isl::set AtomicOption = isl::set::universe(Space);
+ isl::id Id = isl::id::alloc(Ctx, "atomic", nullptr);
+ AtomicOption = AtomicOption.set_tuple_id(Id);
+ return isl::union_set(AtomicOption);
}
-/// Create an isl_union_set, which describes the option of the form
+/// Create an isl::union_set, which describes the option of the form
/// [isolate[] -> unroll[x]].
///
-/// @param Ctx An isl_ctx, which is used to create the isl_union_set.
-static __isl_give isl_union_set *getUnrollIsolatedSetOptions(isl_ctx *Ctx) {
- auto *Space = isl_space_alloc(Ctx, 0, 0, 1);
- auto *UnrollIsolatedSetOption = isl_map_universe(Space);
- auto *DimInId = isl_id_alloc(Ctx, "isolate", nullptr);
- auto *DimOutId = isl_id_alloc(Ctx, "unroll", nullptr);
+/// @param Ctx An isl::ctx, which is used to create the isl::union_set.
+static isl::union_set getUnrollIsolatedSetOptions(isl::ctx Ctx) {
+ isl::space Space = isl::space(Ctx, 0, 0, 1);
+ isl::map UnrollIsolatedSetOption = isl::map::universe(Space);
+ isl::id DimInId = isl::id::alloc(Ctx, "isolate", nullptr);
+ isl::id DimOutId = isl::id::alloc(Ctx, "unroll", nullptr);
UnrollIsolatedSetOption =
- isl_map_set_tuple_id(UnrollIsolatedSetOption, isl_dim_in, DimInId);
+ UnrollIsolatedSetOption.set_tuple_id(isl::dim::in, DimInId);
UnrollIsolatedSetOption =
- isl_map_set_tuple_id(UnrollIsolatedSetOption, isl_dim_out, DimOutId);
- return isl_union_set_from_set(isl_map_wrap(UnrollIsolatedSetOption));
+ UnrollIsolatedSetOption.set_tuple_id(isl::dim::out, DimOutId);
+ return UnrollIsolatedSetOption.wrap();
}
/// Make the last dimension of Set to take values from 0 to VectorWidth - 1.
///
/// @param Set A set, which should be modified.
/// @param VectorWidth A parameter, which determines the constraint.
-static __isl_give isl_set *addExtentConstraints(__isl_take isl_set *Set,
- int VectorWidth) {
- auto Dims = isl_set_dim(Set, isl_dim_set);
- auto Space = isl_set_get_space(Set);
- auto *LocalSpace = isl_local_space_from_space(Space);
- auto *ExtConstr =
- isl_constraint_alloc_inequality(isl_local_space_copy(LocalSpace));
- ExtConstr = isl_constraint_set_constant_si(ExtConstr, 0);
- ExtConstr =
- isl_constraint_set_coefficient_si(ExtConstr, isl_dim_set, Dims - 1, 1);
- Set = isl_set_add_constraint(Set, ExtConstr);
- ExtConstr = isl_constraint_alloc_inequality(LocalSpace);
- ExtConstr = isl_constraint_set_constant_si(ExtConstr, VectorWidth - 1);
- ExtConstr =
- isl_constraint_set_coefficient_si(ExtConstr, isl_dim_set, Dims - 1, -1);
- return isl_set_add_constraint(Set, ExtConstr);
+static isl::set addExtentConstraints(isl::set Set, int VectorWidth) {
+ unsigned Dims = Set.dim(isl::dim::set);
+ isl::space Space = Set.get_space();
+ isl::local_space LocalSpace = isl::local_space(Space);
+ isl::constraint ExtConstr = isl::constraint::alloc_inequality(LocalSpace);
+ ExtConstr = ExtConstr.set_constant_si(0);
+ ExtConstr = ExtConstr.set_coefficient_si(isl::dim::set, Dims - 1, 1);
+ Set = Set.add_constraint(ExtConstr);
+ ExtConstr = isl::constraint::alloc_inequality(LocalSpace);
+ ExtConstr = ExtConstr.set_constant_si(VectorWidth - 1);
+ ExtConstr = ExtConstr.set_coefficient_si(isl::dim::set, Dims - 1, -1);
+ return Set.add_constraint(ExtConstr);
}
/// Build the desired set of partial tile prefixes.
@@ -326,34 +323,31 @@ static __isl_give isl_set *addExtentCons
///
/// @param ScheduleRange A range of a map, which describes a prefix schedule
/// relation.
-static __isl_give isl_set *
-getPartialTilePrefixes(__isl_take isl_set *ScheduleRange, int VectorWidth) {
- auto Dims = isl_set_dim(ScheduleRange, isl_dim_set);
- auto *LoopPrefixes = isl_set_project_out(isl_set_copy(ScheduleRange),
- isl_dim_set, Dims - 1, 1);
- auto *ExtentPrefixes =
- isl_set_add_dims(isl_set_copy(LoopPrefixes), isl_dim_set, 1);
+static isl::set getPartialTilePrefixes(isl::set ScheduleRange,
+ int VectorWidth) {
+ unsigned Dims = ScheduleRange.dim(isl::dim::set);
+ isl::set LoopPrefixes = ScheduleRange.project_out(isl::dim::set, Dims - 1, 1);
+ isl::set ExtentPrefixes = LoopPrefixes.add_dims(isl::dim::set, 1);
ExtentPrefixes = addExtentConstraints(ExtentPrefixes, VectorWidth);
- auto *BadPrefixes = isl_set_subtract(ExtentPrefixes, ScheduleRange);
- BadPrefixes = isl_set_project_out(BadPrefixes, isl_dim_set, Dims - 1, 1);
- return isl_set_subtract(LoopPrefixes, BadPrefixes);
-}
-
-__isl_give isl_schedule_node *ScheduleTreeOptimizer::isolateFullPartialTiles(
- __isl_take isl_schedule_node *Node, int VectorWidth) {
- assert(isl_schedule_node_get_type(Node) == isl_schedule_node_band);
- Node = isl_schedule_node_child(Node, 0);
- Node = isl_schedule_node_child(Node, 0);
- auto *SchedRelUMap = isl_schedule_node_get_prefix_schedule_relation(Node);
- auto *ScheduleRelation = isl_map_from_union_map(SchedRelUMap);
- auto *ScheduleRange = isl_map_range(ScheduleRelation);
- auto *IsolateDomain = getPartialTilePrefixes(ScheduleRange, VectorWidth);
- auto *AtomicOption = getAtomicOptions(isl_set_get_ctx(IsolateDomain));
- auto *IsolateOption = getIsolateOptions(IsolateDomain, 1);
- Node = isl_schedule_node_parent(Node);
- Node = isl_schedule_node_parent(Node);
- auto *Options = isl_union_set_union(IsolateOption, AtomicOption);
- Node = isl_schedule_node_band_set_ast_build_options(Node, Options);
+ isl::set BadPrefixes = ExtentPrefixes.subtract(ScheduleRange);
+ BadPrefixes = BadPrefixes.project_out(isl::dim::set, Dims - 1, 1);
+ return LoopPrefixes.subtract(BadPrefixes);
+}
+
+isl::schedule_node
+ScheduleTreeOptimizer::isolateFullPartialTiles(isl::schedule_node Node,
+ int VectorWidth) {
+ assert(isl_schedule_node_get_type(Node.get()) == isl_schedule_node_band);
+ Node = Node.child(0).child(0);
+ isl::union_map SchedRelUMap = Node.get_prefix_schedule_relation();
+ isl::map ScheduleRelation = isl::map::from_union_map(SchedRelUMap);
+ isl::set ScheduleRange = ScheduleRelation.range();
+ isl::set IsolateDomain = getPartialTilePrefixes(ScheduleRange, VectorWidth);
+ isl::union_set AtomicOption = getAtomicOptions(IsolateDomain.get_ctx());
+ isl::union_set IsolateOption = getIsolateOptions(IsolateDomain, 1);
+ Node = Node.parent().parent();
+ isl::union_set Options = IsolateOption.unite(AtomicOption);
+ Node = Node.band_set_ast_build_options(Options);
return Node;
}
@@ -380,7 +374,7 @@ ScheduleTreeOptimizer::prevectSchedBand(
Sizes =
isl_multi_val_set_val(Sizes, 0, isl_val_int_from_si(Ctx, VectorWidth));
Node = isl_schedule_node_band_tile(Node, Sizes);
- Node = isolateFullPartialTiles(Node, VectorWidth);
+ Node = isolateFullPartialTiles(give(Node), VectorWidth).release();
Node = isl_schedule_node_child(Node, 0);
// Make sure the "trivially vectorizable loop" is not unrolled. Otherwise,
// we will have troubles to match it in the backend.
@@ -1227,30 +1221,29 @@ getInductionVariablesSubstitution(__isl_
/// @param MicroKernelParams Parameters of the micro-kernel
/// to be taken into account.
/// @return The modified isl_schedule_node.
-static __isl_give isl_schedule_node *
-isolateAndUnrollMatMulInnerLoops(__isl_take isl_schedule_node *Node,
+static isl::schedule_node
+isolateAndUnrollMatMulInnerLoops(isl::schedule_node Node,
struct MicroKernelParamsTy MicroKernelParams) {
- auto *Child = isl_schedule_node_get_child(Node, 0);
- auto *UnMapOldIndVar = isl_schedule_node_get_prefix_schedule_relation(Child);
- isl_schedule_node_free(Child);
- auto *Prefix = isl_map_range(isl_map_from_union_map(UnMapOldIndVar));
- auto Dims = isl_set_dim(Prefix, isl_dim_set);
- Prefix = isl_set_project_out(Prefix, isl_dim_set, Dims - 1, 1);
+ isl::schedule_node Child = Node.get_child(0);
+ isl::union_map UnMapOldIndVar = Child.get_prefix_schedule_relation();
+ isl::set Prefix = isl::map::from_union_map(UnMapOldIndVar).range();
+ unsigned Dims = Prefix.dim(isl::dim::set);
+ Prefix = Prefix.project_out(isl::dim::set, Dims - 1, 1);
Prefix = getPartialTilePrefixes(Prefix, MicroKernelParams.Nr);
Prefix = getPartialTilePrefixes(Prefix, MicroKernelParams.Mr);
- auto *IsolateOption = getIsolateOptions(
- isl_set_add_dims(isl_set_copy(Prefix), isl_dim_set, 3), 3);
- auto *Ctx = isl_schedule_node_get_ctx(Node);
- auto *AtomicOption = getAtomicOptions(Ctx);
- auto *Options =
- isl_union_set_union(IsolateOption, isl_union_set_copy(AtomicOption));
- Options = isl_union_set_union(Options, getUnrollIsolatedSetOptions(Ctx));
- Node = isl_schedule_node_band_set_ast_build_options(Node, Options);
- Node = isl_schedule_node_parent(isl_schedule_node_parent(Node));
+
+ isl::union_set IsolateOption =
+ getIsolateOptions(Prefix.add_dims(isl::dim::set, 3), 3);
+ isl::ctx Ctx = Node.get_ctx();
+ isl::union_set AtomicOption = getAtomicOptions(Ctx);
+ isl::union_set Options = IsolateOption.unite(AtomicOption);
+ Options = Options.unite(getUnrollIsolatedSetOptions(Ctx));
+ Node = Node.band_set_ast_build_options(Options);
+ Node = Node.parent().parent();
IsolateOption = getIsolateOptions(Prefix, 3);
- Options = isl_union_set_union(IsolateOption, AtomicOption);
- Node = isl_schedule_node_band_set_ast_build_options(Node, Options);
- Node = isl_schedule_node_child(isl_schedule_node_child(Node, 0), 0);
+ Options = IsolateOption.unite(AtomicOption);
+ Node = Node.band_set_ast_build_options(Options);
+ Node = Node.child(0).child(0);
return Node;
}
@@ -1329,7 +1322,8 @@ __isl_give isl_schedule_node *ScheduleTr
Node, MicroKernelParams, MacroKernelParams);
if (!MapOldIndVar)
return Node;
- Node = isolateAndUnrollMatMulInnerLoops(Node, MicroKernelParams);
+ Node =
+ isolateAndUnrollMatMulInnerLoops(give(Node), MicroKernelParams).release();
return optimizeDataLayoutMatrMulPattern(Node, MapOldIndVar, MicroKernelParams,
MacroKernelParams, MMI);
}
More information about the llvm-commits
mailing list