From 3769d58bc91ea9900b8c6aa0bf4d8b04596f7abf Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 27 Jun 2010 20:35:29 +0200 Subject: [PATCH 1/1] isl_map_simplify.c: separate out isl_basic_map_is_div_constraint --- isl_map_private.h | 2 ++ isl_map_simplify.c | 59 +++++++++++++++++++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/isl_map_private.h b/isl_map_private.h index 95953af..54067c3 100644 --- a/isl_map_private.h +++ b/isl_map_private.h @@ -173,3 +173,5 @@ int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset, int isl_basic_set_add_div_constraints_var(__isl_keep isl_basic_set *bset, unsigned pos, isl_int *div); +int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap, + isl_int *constraint, unsigned div); diff --git a/isl_map_simplify.c b/isl_map_simplify.c index 75a1035..4775efa 100644 --- a/isl_map_simplify.c +++ b/isl_map_simplify.c @@ -1105,6 +1105,43 @@ struct isl_basic_set *isl_basic_set_simplify(struct isl_basic_set *bset) } +int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap, + isl_int *constraint, unsigned div) +{ + unsigned pos; + + if (!bmap) + return -1; + + pos = 1 + isl_dim_total(bmap->dim) + div; + + if (isl_int_eq(constraint[pos], bmap->div[div][0])) { + int neg; + isl_int_sub(bmap->div[div][1], + bmap->div[div][1], bmap->div[div][0]); + isl_int_add_ui(bmap->div[div][1], bmap->div[div][1], 1); + neg = isl_seq_is_neg(constraint, bmap->div[div]+1, pos); + isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1); + isl_int_add(bmap->div[div][1], + bmap->div[div][1], bmap->div[div][0]); + if (!neg) + return 0; + if (isl_seq_first_non_zero(constraint+pos+1, + bmap->n_div-div-1) != -1) + return 0; + } else if (isl_int_abs_eq(constraint[pos], bmap->div[div][0])) { + if (!isl_seq_eq(constraint, bmap->div[div]+1, pos)) + return 0; + if (isl_seq_first_non_zero(constraint+pos+1, + bmap->n_div-div-1) != -1) + return 0; + } else + return 0; + + return 1; +} + + /* If the only constraints a div d=floor(f/m) * appears in are its two defining constraints * @@ -1125,27 +1162,7 @@ static int div_is_redundant(struct isl_basic_map *bmap, int div) for (i = 0; i < bmap->n_ineq; ++i) { if (isl_int_is_zero(bmap->ineq[i][pos])) continue; - if (isl_int_eq(bmap->ineq[i][pos], bmap->div[div][0])) { - int neg; - isl_int_sub(bmap->div[div][1], - bmap->div[div][1], bmap->div[div][0]); - isl_int_add_ui(bmap->div[div][1], bmap->div[div][1], 1); - neg = isl_seq_is_neg(bmap->ineq[i], bmap->div[div]+1, pos); - isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1); - isl_int_add(bmap->div[div][1], - bmap->div[div][1], bmap->div[div][0]); - if (!neg) - return 0; - if (isl_seq_first_non_zero(bmap->ineq[i]+pos+1, - bmap->n_div-div-1) != -1) - return 0; - } else if (isl_int_abs_eq(bmap->ineq[i][pos], bmap->div[div][0])) { - if (!isl_seq_eq(bmap->ineq[i], bmap->div[div]+1, pos)) - return 0; - if (isl_seq_first_non_zero(bmap->ineq[i]+pos+1, - bmap->n_div-div-1) != -1) - return 0; - } else + if (!isl_basic_map_is_div_constraint(bmap, bmap->ineq[i], div)) return 0; } -- 2.7.4