summaryrefslogtreecommitdiff
path: root/isl_tab_pip.c
diff options
context:
space:
mode:
authorSven Verdoolaege <skimo@kotnet.org>2009-09-17 15:40:46 +0200
committerSven Verdoolaege <skimo@kotnet.org>2009-10-09 19:56:02 +0200
commit57bd26bcf4ee5033a8a1732c9d711256815d759a (patch)
tree10f35edd9214166882a31c216432c516b256ef6d /isl_tab_pip.c
parent79d277b08490900bd698114586a63160a3da5d01 (diff)
downloadisl-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.c14
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++;