Update isl to isl-0.15-35-ga1e44f0

This fixes a memory leak with in the sioimath backend.

llvm-svn: 241247
This commit is contained in:
Tobias Grosser 2015-07-02 07:59:21 +00:00
parent f519a288d5
commit 6c78048b76
5 changed files with 106 additions and 29 deletions

View File

@ -1 +1 @@
isl-0.15-30-g3518765
isl-0.15-35-ga1e44f0

View File

@ -2555,10 +2555,11 @@ static int foreach_iteration(__isl_take isl_set *domain,
int (*fn)(__isl_take isl_basic_set *bset, void *user), void *user)
{
int i, n;
int empty;
int depth;
isl_multi_aff *expansion;
isl_basic_map *bmap;
isl_aff *lower;
isl_aff *lower = NULL;
isl_ast_build *stride_build;
depth = isl_ast_build_get_depth(build);
@ -2577,10 +2578,17 @@ static int foreach_iteration(__isl_take isl_set *domain,
bmap = isl_basic_map_from_multi_aff(expansion);
lower = find_unroll_lower_bound(build, domain, depth, bmap, &n);
if (!lower)
empty = isl_set_is_empty(domain);
if (empty < 0) {
n = -1;
else if (init && init(n, user) < 0)
} else if (empty) {
n = 0;
} else {
lower = find_unroll_lower_bound(build, domain, depth, bmap, &n);
if (!lower)
n = -1;
}
if (n >= 0 && init && init(n, user) < 0)
n = -1;
for (i = 0; i < n; ++i) {
isl_set *set;
@ -3263,18 +3271,76 @@ error:
return NULL;
}
/* Extract out the disjunction imposed by "domain" on the outer
* schedule dimensions.
*
* In particular, remove all inner dimensions from "domain" (including
* the current dimension) and then remove the constraints that are shared
* by all disjuncts in the result.
*/
static __isl_give isl_set *extract_disjunction(__isl_take isl_set *domain,
__isl_keep isl_ast_build *build)
{
isl_set *hull;
int depth, dim;
domain = isl_ast_build_specialize(build, domain);
depth = isl_ast_build_get_depth(build);
dim = isl_set_dim(domain, isl_dim_set);
domain = isl_set_eliminate(domain, isl_dim_set, depth, dim - depth);
domain = isl_set_remove_unknown_divs(domain);
hull = isl_set_copy(domain);
hull = isl_set_from_basic_set(isl_set_unshifted_simple_hull(hull));
domain = isl_set_gist(domain, hull);
return domain;
}
/* Add "guard" to the grafts in "list".
* "build" is the outer AST build, while "sub_build" includes "guard"
* in its generated domain.
*
* First combine the grafts into a single graft and then add the guard.
* If the list is empty, or if some error occurred, then simply return
* the list.
*/
static __isl_give isl_ast_graft_list *list_add_guard(
__isl_take isl_ast_graft_list *list, __isl_keep isl_set *guard,
__isl_keep isl_ast_build *build, __isl_keep isl_ast_build *sub_build)
{
isl_ast_graft *graft;
list = isl_ast_graft_list_fuse(list, sub_build);
if (isl_ast_graft_list_n_ast_graft(list) != 1)
return list;
graft = isl_ast_graft_list_get_ast_graft(list, 0);
graft = isl_ast_graft_add_guard(graft, isl_set_copy(guard), build);
list = isl_ast_graft_list_set_ast_graft(list, 0, graft);
return list;
}
/* Generate code for a single component, after shifting (if any)
* has been applied, in case the schedule was specified as a schedule tree.
* In particular, do so for the specified subset of the schedule domain.
*
* If we are outside of the isolated part, then "domain" may include
* a disjunction. Explicitly generate this disjunction at this point
* instead of relying on the disjunction getting hoisted back up
* to this level.
*/
static __isl_give isl_ast_graft_list *generate_shifted_component_tree_part(
__isl_keep isl_union_map *executed, __isl_take isl_set *domain,
__isl_keep isl_ast_build *build, int isolated)
{
isl_union_set *uset;
isl_ast_graft_list *list;
isl_ast_build *sub_build;
int empty;
uset = isl_union_set_from_set(domain);
uset = isl_union_set_from_set(isl_set_copy(domain));
executed = isl_union_map_copy(executed);
executed = isl_union_map_intersect_domain(executed, uset);
empty = isl_union_map_is_empty(executed);
@ -3283,14 +3349,27 @@ static __isl_give isl_ast_graft_list *generate_shifted_component_tree_part(
if (empty) {
isl_ctx *ctx;
isl_union_map_free(executed);
isl_set_free(domain);
ctx = isl_ast_build_get_ctx(build);
return isl_ast_graft_list_alloc(ctx, 0);
}
build = isl_ast_build_copy(build);
return generate_shifted_component_tree_base(executed, build, isolated);
sub_build = isl_ast_build_copy(build);
if (!isolated) {
domain = extract_disjunction(domain, build);
sub_build = isl_ast_build_restrict_generated(sub_build,
isl_set_copy(domain));
}
list = generate_shifted_component_tree_base(executed,
isl_ast_build_copy(sub_build), isolated);
if (!isolated)
list = list_add_guard(list, domain, build, sub_build);
isl_ast_build_free(sub_build);
isl_set_free(domain);
return list;
error:
isl_union_map_free(executed);
isl_set_free(domain);
return NULL;
}
@ -5080,6 +5159,7 @@ static __isl_give isl_ast_graft_list *build_ast_from_extension(
isl_set *set;
set = isl_ast_build_get_generated(build);
set = isl_set_from_basic_set(isl_set_simple_hull(set));
schedule_domain = isl_union_set_from_set(set);
extension = isl_schedule_node_extension_get_extension(node);

View File

@ -719,7 +719,7 @@ static __isl_give isl_ast_node_list *extract_node_list(
/* Look for shared enforced constraints by all the elements in "list"
* on outer loops (with respect to the current depth) and return the result.
*
* We assume that the number of children is at least one.
* If there are no elements in "list", then return the empty set.
*/
__isl_give isl_basic_set *isl_ast_graft_list_extract_shared_enforced(
__isl_keep isl_ast_graft_list *list,
@ -733,16 +733,11 @@ __isl_give isl_basic_set *isl_ast_graft_list_extract_shared_enforced(
if (!list)
return NULL;
n = isl_ast_graft_list_n_ast_graft(list);
if (n == 0)
isl_die(isl_ast_graft_list_get_ctx(list), isl_error_invalid,
"for node should have at least one child",
return NULL);
space = isl_ast_build_get_space(build, 1);
enforced = isl_basic_set_empty(space);
depth = isl_ast_build_get_depth(build);
n = isl_ast_graft_list_n_ast_graft(list);
for (i = 0; i < n; ++i) {
isl_ast_graft *graft;

View File

@ -616,21 +616,21 @@ static int min_is_manifestly_unbounded(struct isl_tab *tab,
return 1;
}
static int row_cmp(struct isl_tab *tab, int r1, int r2, int c, isl_int t)
static int row_cmp(struct isl_tab *tab, int r1, int r2, int c, isl_int *t)
{
unsigned off = 2 + tab->M;
if (tab->M) {
int s;
isl_int_mul(t, tab->mat->row[r1][2], tab->mat->row[r2][off+c]);
isl_int_submul(t, tab->mat->row[r2][2], tab->mat->row[r1][off+c]);
s = isl_int_sgn(t);
isl_int_mul(*t, tab->mat->row[r1][2], tab->mat->row[r2][off+c]);
isl_int_submul(*t, tab->mat->row[r2][2], tab->mat->row[r1][off+c]);
s = isl_int_sgn(*t);
if (s)
return s;
}
isl_int_mul(t, tab->mat->row[r1][1], tab->mat->row[r2][off + c]);
isl_int_submul(t, tab->mat->row[r2][1], tab->mat->row[r1][off + c]);
return isl_int_sgn(t);
isl_int_mul(*t, tab->mat->row[r1][1], tab->mat->row[r2][off + c]);
isl_int_submul(*t, tab->mat->row[r2][1], tab->mat->row[r1][off + c]);
return isl_int_sgn(*t);
}
/* Given the index of a column "c", return the index of a row
@ -673,7 +673,7 @@ static int pivot_row(struct isl_tab *tab,
r = j;
continue;
}
tsgn = sgn * row_cmp(tab, r, j, c, t);
tsgn = sgn * row_cmp(tab, r, j, c, &t);
if (tsgn < 0 || (tsgn == 0 &&
tab->row_var[j] < tab->row_var[r]))
r = j;

View File

@ -2,10 +2,12 @@ for (int c0 = 0; c0 <= 99; c0 += 1) {
if (c0 >= 4 && c0 <= 6) {
for (int c1 = 0; c1 <= 99; c1 += 1)
A(c0, c1);
} else if (c0 >= 7) {
for (int c1 = 0; c1 <= 99; c1 += 1)
A(c0, c1);
} else
for (int c1 = 0; c1 <= 99; c1 += 1)
A(c0, c1);
} else if (c0 >= 7 || c0 <= 3) {
if (c0 >= 7) {
for (int c1 = 0; c1 <= 99; c1 += 1)
A(c0, c1);
} else
for (int c1 = 0; c1 <= 99; c1 += 1)
A(c0, c1);
}
}