From 48ecbf60ab9a84a4f49a015bbf797486f9e89987 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 10 May 2011 10:56:01 +0200 Subject: [PATCH] cloog_loop_constant: don't drop constraints on outer loop iterators 9802965 (cloog_loop_generate_general: add special treatment for loops with constant value, Sat Dec 4 17:57:26 2010 +0100) improved code generation in presence of the -noscalars option, but did so by creating loops with domains that only had constraints on the current loop iterator and not on any previous loop iterator. This broke a fundamental assumption of the CLooG internals. We already introduced a bandaid in b130274 (fix backtracking in presence of constant loops, Thu Mar 24 21:48:27 2011 +0100) for backtracking, but cloog_loop_stop was also affected. Rather than introducing a new bandaid, let's just play by the rules in cloog_loop_constant and remove the backtracking bandaid. The fallout appears to be relatively minor. Signed-off-by: Sven Verdoolaege --- source/loop.c | 20 ++++++-------------- test/reservoir/lim-lam3.c | 8 +++++--- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/source/loop.c b/source/loop.c index 47c698e..e73904d 100644 --- a/source/loop.c +++ b/source/loop.c @@ -1520,10 +1520,6 @@ CloogLoop *cloog_loop_generate_backtrack(CloogLoop *loop, else new_loop = cloog_loop_project(inner, level); - domain = cloog_domain_intersection(new_loop->domain, temp->domain); - cloog_domain_free(new_loop->domain); - new_loop->domain = domain; - cloog_loop_free_parts(inner,0,0,0,0) ; cloog_loop_add(&l,&now2,new_loop) ; inner = next ; @@ -1600,28 +1596,24 @@ int cloog_loop_is_constant(CloogLoop *loop, int level) CloogLoop *cloog_loop_constant(CloogLoop *loop, int level) { CloogLoop *res, *inner, *tmp; - CloogDomain *domain, *context, *t; + CloogDomain *domain, *t; if (!loop) return loop; inner = loop->inner; - for (tmp = loop->next; tmp; tmp = tmp->next) + domain = loop->domain; + for (tmp = loop->next; tmp; tmp = tmp->next) { inner = cloog_loop_concat(inner, tmp->inner); + domain = cloog_domain_union(domain, tmp->domain); + } - domain = cloog_domain_copy(loop->domain); domain = cloog_domain_simple_convex(t = domain); cloog_domain_free(t); - context = cloog_domain_project(domain, level - 1); - context = cloog_domain_extend(t = context, level); - cloog_domain_free(t); - domain = cloog_domain_simplify(t = domain, context); - cloog_domain_free(t); - cloog_domain_free(context); res = cloog_loop_alloc(loop->state, domain, 0, NULL, NULL, inner, NULL); - cloog_loop_free_parts(loop, 1, 0, 0, 1); + cloog_loop_free_parts(loop, 0, 0, 0, 1); return res; } diff --git a/test/reservoir/lim-lam3.c b/test/reservoir/lim-lam3.c index 313b319..c68a629 100644 --- a/test/reservoir/lim-lam3.c +++ b/test/reservoir/lim-lam3.c @@ -1,4 +1,4 @@ -/* Generated from ../../../git/cloog/test/reservoir/lim-lam3.cloog by CLooG 0.16.1-1-g6af50a0 gmp bits in 0.01s. */ +/* Generated from ../../../git/cloog/test/reservoir/lim-lam3.cloog by CLooG 0.16.2-8-g1421b58 gmp bits in 0.03s. */ S4(1); for (c2=9;c2<=min(13,5*M-1);c2++) { if (c2 <= M+7) { @@ -7,8 +7,10 @@ for (c2=9;c2<=min(13,5*M-1);c2++) { if (c2 == 10) { S4(2); } - if (c2%3 == 0) { - S3((c2-3)/3,1); + if (c2 <= 3*M+3) { + if (c2%3 == 0) { + S3((c2-3)/3,1); + } } } for (c2=14;c2<=5*M-1;c2++) { -- 2.11.4.GIT