Skip to content
This repository was archived by the owner on Apr 28, 2023. It is now read-only.

Commit 3ea18a9

Browse files
author
Sven Verdoolaege
committed
[RFC] use templated isl types schedule tree
Templated isl types require the user to specify the domain and range universes of isl objects, allowing the compiler to check whether it makes sense to combine pairs of objects. This RFC only converts isPromotableToRegistersBelow and some related functions to illustrate the effect. The isPromotableToRegistersBelow was already applying operations correctly, so the code itself did not require any changes. However, one variable was reused to store different types of intermediate result and this one had to be split up into several variables because they now have different types.
1 parent 3137885 commit 3ea18a9

13 files changed

+108
-84
lines changed

tc/core/polyhedral/memory_promotion.cc

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,10 @@ ScheduleTree* insertCopiesUnder(
500500
auto writeSchedule = isl::multi_union_pw_aff(identityCopySchedule.pullback(
501501
isl::multi_aff::wrapped_range_map(writeSpace)));
502502

503-
auto readBandNode = ScheduleTree::makeBand(readSchedule);
504-
auto writeBandNode = ScheduleTree::makeBand(writeSchedule);
503+
auto readBandNode = ScheduleTree::makeBand(
504+
isl::MultiUnionPwAff<Statement, Band>(readSchedule));
505+
auto writeBandNode = ScheduleTree::makeBand(
506+
isl::MultiUnionPwAff<Statement, Band>(writeSchedule));
505507

506508
if (unrollAllCopies) {
507509
unrollAllMembers(readBandNode->as<detail::ScheduleTreeBand>());
@@ -551,14 +553,18 @@ ScheduleTree* insertCopiesUnder(
551553

552554
if (reads) {
553555
insertExtensionBefore(
554-
root, tree, tree->child({0}), readExtension, std::move(readFilterNode));
556+
root,
557+
tree,
558+
tree->child({0}),
559+
isl::UnionMap<Prefix, Statement>(readExtension),
560+
std::move(readFilterNode));
555561
}
556562
if (writes) {
557563
insertExtensionAfter(
558564
root,
559565
tree,
560566
tree->child({0}),
561-
writeExtension,
567+
isl::UnionMap<Prefix, Statement>(writeExtension),
562568
std::move(writeFilterNode));
563569
}
564570

tc/core/polyhedral/schedule_isl_conversion.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,16 +243,16 @@ std::unique_ptr<ScheduleTreeBand> fromIslScheduleNodeBand(
243243
for (size_t i = 0; i < n; ++i) {
244244
coincident[i] = b.member_get_coincident(i);
245245
}
246-
return ScheduleTreeBand::make(
247-
b.get_partial_schedule(), b.get_permutable(), coincident, unroll);
246+
auto mupa = isl::MultiUnionPwAff<Statement, Band>(b.get_partial_schedule());
247+
return ScheduleTreeBand::make(mupa, b.get_permutable(), coincident, unroll);
248248
}
249249

250250
std::unique_ptr<ScheduleTree> elemFromIslScheduleNode(isl::schedule_node node) {
251251
auto ctx = node.get_ctx();
252252
if (auto band = node.as<isl::schedule_node_band>()) {
253253
return fromIslScheduleNodeBand(band);
254254
} else if (auto context = node.as<isl::schedule_node_context>()) {
255-
auto c = context.get_context();
255+
auto c = isl::Set<Prefix>(context.get_context());
256256
return ScheduleTreeContext::make(c);
257257
} else if (auto domain = node.as<isl::schedule_node_domain>()) {
258258
auto c = domain.get_domain();

tc/core/polyhedral/schedule_transforms.cc

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ ScheduleTree* joinBandsHelper(ScheduleTree* st, bool& moveChildren) {
8888

8989
auto& partialSchedule = eb->mupa_;
9090
auto& partialScheduleChild = ebChild->mupa_;
91-
partialSchedule = partialSchedule.flat_range_product(partialScheduleChild);
91+
partialSchedule =
92+
partialSchedule.flat_range_product<Band>(partialScheduleChild);
9293
eb->coincident_.resize(
9394
eb->coincident_.size() + ebChild->coincident_.size(), false);
9495
eb->unroll_.insert(
@@ -284,7 +285,9 @@ ScheduleTree* insertTopLevelEmptyBand(ScheduleTree* root) {
284285
return insertNodeBelow(node, ScheduleTree::makeEmptyBand(root));
285286
}
286287

287-
void updateTopLevelContext(detail::ScheduleTree* root, isl::set context) {
288+
void updateTopLevelContext(
289+
detail::ScheduleTree* root,
290+
isl::Set<Prefix> context) {
288291
if (!matchOne(tc::polyhedral::domain(tc::polyhedral::context(any())), root)) {
289292
root->appendChild(
290293
ScheduleTree::makeContext(context, root->detachChildren()));
@@ -393,7 +396,7 @@ void insertExtensionAt(
393396
ScheduleTree* relativeRoot,
394397
ScheduleTree* seqNode,
395398
size_t pos,
396-
isl::union_map extension,
399+
isl::UnionMap<Prefix, Statement> extension,
397400
ScheduleTreeUPtr&& filterNode) {
398401
auto extensionTree = seqNode->ancestor(relativeRoot, 1);
399402
auto extensionNode = extensionTree->as<detail::ScheduleTreeExtension>();
@@ -412,7 +415,7 @@ void insertExtensionBefore(
412415
const ScheduleTree* root,
413416
ScheduleTree* relativeRoot,
414417
ScheduleTree* tree,
415-
isl::union_map extension,
418+
isl::UnionMap<Prefix, Statement> extension,
416419
ScheduleTreeUPtr&& filterNode) {
417420
size_t pos;
418421
auto parent = tree->ancestor(relativeRoot, 1);
@@ -441,7 +444,7 @@ void insertExtensionAfter(
441444
const ScheduleTree* root,
442445
ScheduleTree* relativeRoot,
443446
ScheduleTree* tree,
444-
isl::union_map extension,
447+
isl::UnionMap<Prefix, Statement> extension,
445448
ScheduleTreeUPtr&& filterNode) {
446449
size_t pos;
447450
auto parent = tree->ancestor(relativeRoot, 1);
@@ -503,7 +506,7 @@ namespace {
503506
* of band node partial schedules.
504507
* Elements of a sequence that end up with an empty filter are removed.
505508
*/
506-
void gist(ScheduleTree* tree, isl::union_set context) {
509+
void gist(ScheduleTree* tree, isl::UnionSet<Statement> context) {
507510
if (auto bandElem = tree->as<ScheduleTreeBand>()) {
508511
bandElem->mupa_ = bandElem->mupa_.gist(context);
509512
} else if (auto filterElem = tree->as<ScheduleTreeMapping>()) {
@@ -533,7 +536,9 @@ void gist(ScheduleTree* tree, isl::union_set context) {
533536
* Create a filter node with the given filter and single child node,
534537
* after simplifying the child node in the context of the filter.
535538
*/
536-
ScheduleTreeUPtr gistedFilter(isl::union_set filter, ScheduleTreeUPtr child) {
539+
ScheduleTreeUPtr gistedFilter(
540+
isl::UnionSet<Statement> filter,
541+
ScheduleTreeUPtr child) {
537542
gist(child.get(), filter);
538543
return ScheduleTree::makeFilter(filter, std::move(child));
539544
}
@@ -556,7 +561,8 @@ bool canOrder(
556561
auto zero = isl::MultiVal<isl::Anonymous>::zero(space);
557562
auto one = zero.set_val(0, isl::val::one(ctx));
558563
auto order = isl::MultiUnionPwAff<Statement, isl::Anonymous>(first, zero);
559-
order = order.union_add(isl::MultiUnionPwAff<Statement, isl::Anonymous>(second, one));
564+
order = order.union_add(
565+
isl::MultiUnionPwAff<Statement, isl::Anonymous>(second, one));
560566

561567
// Check that this ordering preserves all dependences.
562568
auto preserved = dependences.lex_lt_at(order).unite(dependences.eq_at(order));

tc/core/polyhedral/schedule_transforms.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ detail::ScheduleTree* insertTopLevelEmptyBand(detail::ScheduleTree* root);
111111
// Update the top-level context node by intersecting it with "context". The
112112
// top-level context node must be located directly under the root of the tree.
113113
// If there is no such node, insert one first.
114-
void updateTopLevelContext(detail::ScheduleTree* root, isl::set context);
114+
void updateTopLevelContext(
115+
detail::ScheduleTree* root,
116+
isl::Set<Prefix> context);
115117

116118
// In a tree starting at "root", insert a sequence node with
117119
// as only child the node identified by "tree".
@@ -175,7 +177,7 @@ void insertExtensionBefore(
175177
const detail::ScheduleTree* root,
176178
detail::ScheduleTree* relativeRoot,
177179
detail::ScheduleTree* tree,
178-
isl::union_map extension,
180+
isl::UnionMap<Prefix, Statement> extension,
179181
ScheduleTreeUPtr&& filterNode);
180182

181183
// Insert an extension with the given extension map and extension filter node
@@ -190,7 +192,7 @@ void insertExtensionAfter(
190192
const detail::ScheduleTree* root,
191193
detail::ScheduleTree* relativeRoot,
192194
detail::ScheduleTree* tree,
193-
isl::union_map extension,
195+
isl::UnionMap<Prefix, Statement> extension,
194196
ScheduleTreeUPtr&& filterNode);
195197

196198
// Given a sequence node in the schedule tree, insert

tc/core/polyhedral/schedule_tree.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ size_t ScheduleTree::scheduleDepth(const ScheduleTree* relativeRoot) const {
199199
}
200200

201201
std::unique_ptr<ScheduleTree> ScheduleTree::makeBand(
202-
isl::multi_union_pw_aff mupa,
202+
isl::MultiUnionPwAff<Statement, Band> mupa,
203203
std::vector<ScheduleTreeUPtr>&& children) {
204204
std::vector<bool> coincident(mupa.size(), false);
205205
std::vector<bool> unroll(mupa.size(), false);
@@ -211,9 +211,9 @@ std::unique_ptr<ScheduleTree> ScheduleTree::makeBand(
211211
ScheduleTreeUPtr ScheduleTree::makeEmptyBand(const ScheduleTree* root) {
212212
auto domain = root->as<ScheduleTreeDomain>();
213213
TC_CHECK(domain);
214-
auto space = domain->domain_.get_space().set_from_params();
215-
auto mv = isl::multi_val::zero(space);
216-
auto zero = isl::multi_union_pw_aff(domain->domain_, mv);
214+
auto space = domain->domain_.get_space().add_unnamed_tuple_ui<Band>(0);
215+
auto mv = isl::MultiVal<Band>::zero(space);
216+
auto zero = isl::MultiUnionPwAff<Statement, Band>(domain->domain_, mv);
217217
return ScheduleTree::makeBand(zero);
218218
}
219219

@@ -224,7 +224,7 @@ std::unique_ptr<ScheduleTree> ScheduleTree::makeDomain(
224224
}
225225

226226
std::unique_ptr<ScheduleTree> ScheduleTree::makeContext(
227-
isl::set context,
227+
isl::Set<Prefix> context,
228228
std::vector<ScheduleTreeUPtr>&& children) {
229229
return ScheduleTreeContext::make(context, std::move(children));
230230
}

tc/core/polyhedral/schedule_tree.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <vector>
2222

2323
#include "tc/core/check.h"
24+
#include "tc/core/polyhedral/domain_types.h"
2425
#include "tc/core/polyhedral/mapping_types.h"
2526
#include "tc/core/polyhedral/options.h"
2627
#include "tc/core/utils/vararg.h"
@@ -280,7 +281,7 @@ struct ScheduleTree {
280281
// Factory functions
281282
//
282283
static ScheduleTreeUPtr makeBand(
283-
isl::multi_union_pw_aff mupa,
284+
isl::MultiUnionPwAff<Statement, Band> mupa,
284285
std::vector<ScheduleTreeUPtr>&& children = {});
285286

286287
// Return a zero-dimensional band for use in a tree with the given root.
@@ -291,7 +292,7 @@ struct ScheduleTree {
291292
std::vector<ScheduleTreeUPtr>&& children = {});
292293

293294
static ScheduleTreeUPtr makeContext(
294-
isl::set context,
295+
isl::Set<Prefix> context,
295296
std::vector<ScheduleTreeUPtr>&& children = {});
296297

297298
static ScheduleTreeUPtr makeFilter(
@@ -332,7 +333,7 @@ struct ScheduleTree {
332333

333334
template <typename... Args>
334335
static ScheduleTreeUPtr makeBand(
335-
isl::multi_union_pw_aff mupa,
336+
isl::MultiUnionPwAff<Statement, Band> mupa,
336337
Args&&... args) {
337338
return makeBand(
338339
mupa, vectorFromArgs<ScheduleTreeUPtr>(std::forward<Args>(args)...));
@@ -345,7 +346,7 @@ struct ScheduleTree {
345346
}
346347

347348
template <typename... Args>
348-
static ScheduleTreeUPtr makeContext(isl::set context, Args&&... args) {
349+
static ScheduleTreeUPtr makeContext(isl::Set<> context, Args&&... args) {
349350
return makeContext(
350351
context, vectorFromArgs<ScheduleTreeUPtr>(std::forward<Args>(args)...));
351352
}

tc/core/polyhedral/schedule_tree_elem.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "tc/core/check.h"
2727
#include "tc/core/constants.h"
2828
#include "tc/core/flags.h"
29+
#include "tc/core/polyhedral/domain_types.h"
2930
#include "tc/core/polyhedral/schedule_isl_conversion.h"
3031
#include "tc/core/polyhedral/schedule_tree.h"
3132
#include "tc/core/scope_guard.h"
@@ -185,7 +186,7 @@ std::unique_ptr<ScheduleTreeSet> ScheduleTreeSet::make(
185186
}
186187

187188
std::unique_ptr<ScheduleTreeBand> ScheduleTreeBand::make(
188-
isl::multi_union_pw_aff mupa,
189+
isl::MultiUnionPwAff<Statement, Band> mupa,
189190
bool permutable,
190191
std::vector<bool> coincident,
191192
std::vector<bool> unroll,
@@ -238,8 +239,8 @@ void ScheduleTreeBand::drop(size_t pos, size_t n) {
238239
auto list = mupa_.get_union_pw_aff_list();
239240
auto space = mupa_.get_space().params();
240241
list = list.drop(pos, n);
241-
space = space.add_unnamed_tuple_ui(list.size());
242-
mupa_ = isl::multi_union_pw_aff(space, list);
242+
auto spaceBand = space.add_unnamed_tuple_ui<Band>(list.size());
243+
mupa_ = isl::MultiUnionPwAff<Statement, Band>(spaceBand, list);
243244

244245
std::copy(
245246
coincident_.begin() + pos + n,

tc/core/polyhedral/schedule_tree_elem.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct ScheduleTreeContext : public ScheduleTree {
6464
}
6565

6666
public:
67-
isl::set context_;
67+
isl::Set<Prefix> context_;
6868
};
6969

7070
struct ScheduleTreeDomain : public ScheduleTree {
@@ -100,7 +100,7 @@ struct ScheduleTreeDomain : public ScheduleTree {
100100
}
101101

102102
public:
103-
isl::union_set domain_;
103+
isl::UnionSet<Statement> domain_;
104104
};
105105

106106
struct ScheduleTreeExtension : public ScheduleTree {
@@ -136,7 +136,7 @@ struct ScheduleTreeExtension : public ScheduleTree {
136136
}
137137

138138
public:
139-
isl::union_map extension_;
139+
isl::UnionMap<Prefix, Statement> extension_;
140140
};
141141

142142
struct ScheduleTreeFilter : public ScheduleTree {
@@ -172,7 +172,7 @@ struct ScheduleTreeFilter : public ScheduleTree {
172172
}
173173

174174
public:
175-
isl::union_set filter_;
175+
isl::UnionSet<Statement> filter_;
176176
};
177177

178178
struct ScheduleTreeMapping : public ScheduleTree {
@@ -216,7 +216,7 @@ struct ScheduleTreeMapping : public ScheduleTree {
216216
// Mapping from identifiers to affine functions on domain elements.
217217
const Mapping mapping;
218218
// Assignment of the affine functions to the identifiers as parameters.
219-
isl::union_set filter_;
219+
isl::UnionSet<Statement> filter_;
220220
};
221221

222222
struct ScheduleTreeSequence : public ScheduleTree {
@@ -310,7 +310,7 @@ struct ScheduleTreeBand : public ScheduleTree {
310310
// Replace "mupa" by its greatest integer part to ensure that the
311311
// schedule is always integral.
312312
static std::unique_ptr<ScheduleTreeBand> make(
313-
isl::multi_union_pw_aff mupa,
313+
isl::MultiUnionPwAff<Statement, Band> mupa,
314314
bool permutable,
315315
std::vector<bool> coincident,
316316
std::vector<bool> unroll,
@@ -336,18 +336,17 @@ struct ScheduleTreeBand : public ScheduleTree {
336336
isl::MultiUnionPwAff<Statement, Range> memberRange(size_t first, size_t n)
337337
const {
338338
auto list = mupa_.get_union_pw_aff_list();
339-
auto space = mupa_.get_space().params().add_unnamed_tuple_ui(n);
339+
auto space = mupa_.get_space().params().add_unnamed_tuple_ui<Range>(n);
340340
auto end = first + n;
341341
TC_CHECK_LE(end, nMember());
342342
list = list.drop(end, nMember() - end);
343343
list = list.drop(0, first);
344-
return isl::MultiUnionPwAff<Statement, Range>(
345-
isl::multi_union_pw_aff(space, list));
344+
return isl::MultiUnionPwAff<Statement, Range>(space, list);
346345
}
347346

348347
public:
349348
bool permutable_{false};
350-
isl::multi_union_pw_aff mupa_;
349+
isl::MultiUnionPwAff<Statement, Band> mupa_;
351350

352351
std::vector<bool> coincident_;
353352
// For each member, should the corresponding loop in the generated code

tc/core/polyhedral/schedule_utils-inl.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ namespace tc {
2727
namespace polyhedral {
2828

2929
namespace detail {
30-
inline isl::union_map partialScheduleImpl(
30+
template <typename Schedule>
31+
inline isl::UnionMap<Statement, Schedule> partialScheduleImpl(
3132
const ScheduleTree* root,
3233
const ScheduleTree* node,
3334
bool useNode) {
@@ -36,9 +37,10 @@ inline isl::union_map partialScheduleImpl(
3637
nodes.push_back(node);
3738
}
3839
TC_CHECK_GT(nodes.size(), 0u) << "root node does not have a prefix schedule";
39-
auto domain = root->as<ScheduleTreeDomain>();
40+
auto domain = root->as<detail::ScheduleTreeDomain>();
4041
TC_CHECK(domain);
41-
auto schedule = isl::union_map::from_domain(domain->domain_);
42+
auto schedule =
43+
isl::UnionMap<Statement, Schedule>::from_domain(domain->domain_);
4244
for (auto anc : nodes) {
4345
if (anc->as<ScheduleTreeDomain>()) {
4446
TC_CHECK(anc == root);
@@ -54,15 +56,15 @@ template <typename Schedule>
5456
inline isl::UnionMap<Statement, Schedule> prefixSchedule(
5557
const detail::ScheduleTree* root,
5658
const detail::ScheduleTree* node) {
57-
auto prefix = detail::partialScheduleImpl(root, node, false);
59+
auto prefix = detail::partialScheduleImpl<Schedule>(root, node, false);
5860
return isl::UnionMap<Statement, Schedule>(prefix);
5961
}
6062

6163
template <typename Schedule>
6264
inline isl::UnionMap<Statement, Schedule> partialSchedule(
6365
const detail::ScheduleTree* root,
6466
const detail::ScheduleTree* node) {
65-
auto prefix = detail::partialScheduleImpl(root, node, true);
67+
auto prefix = detail::partialScheduleImpl<Schedule>(root, node, true);
6668
return isl::UnionMap<Statement, Schedule>(prefix);
6769
}
6870

0 commit comments

Comments
 (0)