diff options
author | Sven Verdoolaege <skimo@kotnet.org> | 2009-09-17 15:40:46 +0200 |
---|---|---|
committer | Sven Verdoolaege <skimo@kotnet.org> | 2009-10-09 19:56:02 +0200 |
commit | 57bd26bcf4ee5033a8a1732c9d711256815d759a (patch) | |
tree | 10f35edd9214166882a31c216432c516b256ef6d /isl_tab_pip.c | |
parent | 79d277b08490900bd698114586a63160a3da5d01 (diff) | |
download | isl-57bd26bcf4ee5033a8a1732c9d711256815d759a.tar.gz isl-57bd26bcf4ee5033a8a1732c9d711256815d759a.tar.bz2 isl-57bd26bcf4ee5033a8a1732c9d711256815d759a.zip |
isl_tab_pip.c: add_div: use more reliable way to test whether div is nonneg
Before, we used the fact that if all parameters are non-negative,
then the big parameter is not used.
However, it is perfectly valid to have negative parameters and
still not use any big parameter.
Diffstat (limited to 'isl_tab_pip.c')
-rw-r--r-- | isl_tab_pip.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/isl_tab_pip.c b/isl_tab_pip.c index 5886fd7e..7563a4e9 100644 --- a/isl_tab_pip.c +++ b/isl_tab_pip.c @@ -1335,14 +1335,24 @@ static int add_div(struct isl_tab *tab, struct isl_tab **context_tab, int i; int r; int k; + int nonneg; struct isl_mat *samples; + for (i = 0; i < (*context_tab)->n_var; ++i) { + if (isl_int_is_zero(div->el[2 + i])) + continue; + if (!(*context_tab)->var[i].is_nonneg) + break; + } + nonneg = i == (*context_tab)->n_var; + if (isl_tab_extend_vars(*context_tab, 1) < 0) goto error; r = isl_tab_allocate_var(*context_tab); if (r < 0) goto error; - (*context_tab)->var[r].is_nonneg = 1; + if (nonneg) + (*context_tab)->var[r].is_nonneg = 1; (*context_tab)->var[r].frozen = 1; samples = isl_mat_extend((*context_tab)->samples, @@ -1373,7 +1383,7 @@ static int add_div(struct isl_tab *tab, struct isl_tab **context_tab, r = isl_tab_allocate_var(tab); if (r < 0) goto error; - if (!(*context_tab)->M) + if (nonneg) tab->var[r].is_nonneg = 1; tab->var[r].frozen = 1; tab->n_div++; |