/* If "node" is a sequence, then check if it has any consecutive * leaves that should be merged together and store the results * in "grouping". * * In particular, call group_subsequence on each consecutive * sequence of (filtered) leaves among the children of "node". */ static isl_bool detect_groups(__isl_keep isl_schedule_node *node, void *user) { int i, n, first; isl_bool has_only_leaves; struct ppcg_grouping *grouping = user; if (isl_schedule_node_get_type(node) != isl_schedule_node_sequence) return isl_bool_true; n = isl_schedule_node_n_children(node); if (n < 0) return isl_bool_error; first = -1; for (i = 0; i < n; ++i) { isl_schedule_node *child; enum isl_schedule_node_type type; child = isl_schedule_node_get_child(node, i); child = isl_schedule_node_child(child, 0); type = isl_schedule_node_get_type(child); isl_schedule_node_free(child); if (first >= 0 && type != isl_schedule_node_leaf) { if (group_subsequence(node, first, i - first, grouping) < 0) return isl_bool_error; first = -1; } if (first < 0 && type == isl_schedule_node_leaf) first = i; } if (first >= 0) { if (group_subsequence(node, first, n - first, grouping) < 0) return isl_bool_error; } return isl_bool_true; }
isl_schedule_node * mark_loop_type_separate(const isl::context & ctx, isl_schedule_node * node) { isl::printer p(ctx); auto type = isl_schedule_node_get_type(node); if (type == isl_schedule_node_band) { int dims = isl_schedule_node_band_n_member(node); for (int d = 0; d < dims; ++d) { node = isl_schedule_node_band_member_set_ast_loop_type (node, d, isl_ast_loop_separate); } } int n_children = isl_schedule_node_n_children(node); for (int c = 0; c < n_children; ++c) { node = isl_schedule_node_child(node, c); node = mark_loop_type_separate(ctx, node); node = isl_schedule_node_parent(node); } return node; }