From fd41271869884660fdeaacbf2f66faece66a4909 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 9 Mar 2014 11:57:08 +0100 Subject: [PATCH] tree2scop.c: extract out shared apply_affine_break This simplifies the next commit. Signed-off-by: Sven Verdoolaege --- tree2scop.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tree2scop.c b/tree2scop.c index 607ae75..1b8ca41 100644 --- a/tree2scop.c +++ b/tree2scop.c @@ -264,6 +264,24 @@ static __isl_give isl_set *after(__isl_take isl_set *cond, int sign) return cond; } +/* Remove those iterations of "domain" that have an earlier iteration + * (based on "sign") where "skip" is satisfied. + * "domain" has an extra outer loop compared to "skip". + * The skip condition is first embedded in the same space as "domain". + * If "apply_skip_map" is set, then "skip_map" is first applied + * to the embedded skip condition before removing it from the domain. + */ +static __isl_give isl_set *apply_affine_break(__isl_take isl_set *domain, + __isl_take isl_set *skip, int sign, + int apply_skip_map, __isl_keep isl_map *skip_map) +{ + skip = embed(skip, isl_set_get_dim_id(domain, isl_dim_set, 0)); + if (apply_skip_map) + skip = isl_set_apply(skip, isl_map_copy(skip_map)); + skip = isl_set_intersect(skip , isl_set_copy(domain)); + return isl_set_subtract(domain, after(skip, sign)); +} + /* Create the infinite iteration domain * * { [id] : id >= 0 } @@ -292,9 +310,7 @@ static __isl_give isl_set *infinite_domain(__isl_take isl_id *id, return domain; skip = pet_scop_get_affine_skip_domain(scop, pet_skip_later); - skip = embed(skip, isl_id_copy(id)); - skip = isl_set_intersect(skip , isl_set_copy(domain)); - domain = isl_set_subtract(domain, after(skip, 1)); + domain = apply_affine_break(domain, skip, 1, 0, NULL); return domain; } @@ -1246,12 +1262,8 @@ static struct pet_scop *scop_from_affine_for(__isl_keep pet_tree *tree, scop = pet_scop_embed(scop, isl_set_copy(domain), sched, wrap, id); scop = pet_scop_resolve_nested(scop); if (has_affine_break) { - skip = embed(skip, isl_id_copy(id)); - if (is_virtual) - skip = isl_set_apply(skip, isl_map_copy(rev_wrap)); - skip = isl_set_intersect(skip , isl_set_copy(domain)); - skip = after(skip, isl_val_sgn(inc)); - domain = isl_set_subtract(domain, skip); + domain = apply_affine_break(domain, skip, isl_val_sgn(inc), + is_virtual, rev_wrap); scop = pet_scop_intersect_domain_prefix(scop, isl_set_copy(domain)); } -- 2.11.4.GIT