PartialSchedUAff = PartialSchedUAff.intersect_domain(Domain);
isl::union_map PartialSchedUMap = isl::union_map(PartialSchedUAff);
- // Make consumable for the following code.
- // Schedule at the beginning so it is at coordinate 0.
- isl::union_set PartialSchedUSet = PartialSchedUMap.reverse().wrap();
+ // Enumerator only the scatter elements.
+ isl::union_set ScatterList = PartialSchedUMap.range();
- SmallVector<isl::point, 16> Elts;
+ // Enumerate all loop iterations.
// TODO: Diagnose if not enumerable or depends on a parameter.
- PartialSchedUSet.foreach_point([&Elts](isl::point P) -> isl::stat {
+ SmallVector<isl::point, 16> Elts;
+ ScatterList.foreach_point([&Elts](isl::point P) -> isl::stat {
Elts.push_back(P);
return isl::stat::ok();
});
// Convert the points to a sequence of filters.
isl::union_set_list List = isl::union_set_list::alloc(Ctx, Elts.size());
for (isl::point P : Elts) {
- isl::basic_set AsSet{P};
-
- // Throw away the scatter dimension.
- AsSet = AsSet.unwrap().range();
+ // Determine the domains that map this scatter element.
+ isl::union_set DomainFilter = PartialSchedUMap.intersect_range(P).domain();
- List = List.add(AsSet);
+ List = List.add(DomainFilter);
}
// Replace original band with unrolled sequence.
; CHECK-LABEL: Printing analysis 'Polly - Optimize schedule of SCoP' for region: 'for => return' in function 'func':
+; CHECK: domain: "{ Stmt_body[i0] : 0 <= i0 <= 11 }"
+; CHECK sequence:
+; CHECK: - filter: "{ Stmt_body[i0] : 0 <= i0 <= 3 }"
+; CHECK sequence:
; CHECK: - filter: "{ Stmt_body[0] }"
-; CHECK: - filter: "{ Stmt_body[1] }"
-; CHECK: - filter: "{ Stmt_body[2] }"
-; CHECK: - filter: "{ Stmt_body[3] }"
+; CHECK: - filter: "{ Stmt_body[i0] : (-1 + i0) mod 4 = 0 }"
+; CHECK: - filter: "{ Stmt_body[i0] : (2 + i0) mod 4 = 0 }"
+; CHECK: - filter: "{ Stmt_body[i0] : (1 + i0) mod 4 = 0 }"
+; CHECK sequence:
+; CHECK: - filter: "{ Stmt_body[i0] : 4 <= i0 <= 7 }"
+; CHECK sequence:
; CHECK: - filter: "{ Stmt_body[4] }"
-; CHECK: - filter: "{ Stmt_body[5] }"
-; CHECK: - filter: "{ Stmt_body[6] }"
-; CHECK: - filter: "{ Stmt_body[7] }"
+; CHECK: - filter: "{ Stmt_body[i0] : (-1 + i0) mod 4 = 0 }"
+; CHECK: - filter: "{ Stmt_body[i0] : (2 + i0) mod 4 = 0 }"
+; CHECK: - filter: "{ Stmt_body[i0] : (1 + i0) mod 4 = 0 }"
+; CHECK sequence:
+; CHECK: - filter: "{ Stmt_body[i0] : 8 <= i0 <= 11 }"
+; CHECK sequence:
; CHECK: - filter: "{ Stmt_body[8] }"
-; CHECK: - filter: "{ Stmt_body[9] }"
-; CHECK: - filter: "{ Stmt_body[10] }"
-; CHECK: - filter: "{ Stmt_body[11] }"
+; CHECK: - filter: "{ Stmt_body[i0] : (-1 + i0) mod 4 = 0 }"
+; CHECK: - filter: "{ Stmt_body[i0] : (2 + i0) mod 4 = 0 }"
+; CHECK: - filter: "{ Stmt_body[i0] : (1 + i0) mod 4 = 0 }"