From 6a8d7fb51e78888ec1bb489968bbfa802f2e5b99 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Tue, 7 May 2013 12:53:14 -0400
Subject: [PATCH] boxify: Try harder to get convex output.

---
 loopy/isl_helpers.py | 32 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/loopy/isl_helpers.py b/loopy/isl_helpers.py
index fea91d7f9..a83564f48 100644
--- a/loopy/isl_helpers.py
+++ b/loopy/isl_helpers.py
@@ -350,7 +350,7 @@ def convexify(domain):
 
 
 
-def boxify(cache_manager, domain, box_inames):
+def boxify(cache_manager, domain, box_inames, context):
     var_dict = domain.get_var_dict(dim_type.set)
     box_iname_indices = [var_dict[iname][1] for iname in box_inames]
     n_nonbox_inames = min(box_iname_indices)
@@ -371,32 +371,26 @@ def boxify(cache_manager, domain, box_inames):
         def add_in_dims(aff):
             return aff.add_dims(dim_type.in_, len(box_inames))
 
-        iname_min = add_in_dims(cache_manager.dim_min(domain, i))
-        iname_max = add_in_dims(cache_manager.dim_max(domain, i))
+        iname_min = add_in_dims(cache_manager.dim_min(domain, i)).coalesce()
+        iname_max = add_in_dims(cache_manager.dim_max(domain, i)).coalesce()
 
         iname_slab = (iname_min.le_set(iname_aff)
-                .intersect(iname_max.ge_set(iname_aff))).coalesce()
+                .intersect(iname_max.ge_set(iname_aff)))
 
-        result = result & iname_slab
+        for i, iname in enumerate(box_inames):
+            iname_slab = iname_slab.set_dim_name(dim_type.set, i, iname)
+
+        if context is not None:
+            iname_slab, context = isl.align_two(iname_slab, context)
+            iname_slab = iname_slab.gist(context)
+        iname_slab = iname_slab.coalesce()
 
-    for i, iname in enumerate(box_inames):
-        result = result.set_dim_name(dim_type.set, i, iname)
+        result = result & iname_slab
 
     result = result.move_dims(
             dim_type.set, 0, dim_type.param, n_old_parameters, n_nonbox_inames)
 
-    if isinstance(result, isl.BasicSet):
-        return result
-
-    if len(result.get_basic_sets()) > 1:
-        result = result.coalesce()
-
-    res_bsets = result.get_basic_sets()
-    if len(res_bsets) == 1:
-        result, = res_bsets
-        return result
-    else:
-        raise RuntimeError("boxify did not yield convex set")
+    return convexify(result)
 
 
 
-- 
GitLab