File cloog-ppl.patch of Package cloog

diff --git a/include/cloog/ppl_backend.h b/include/cloog/ppl_backend.h
index c3b0ad9..44df0f0 100644
--- a/include/cloog/ppl_backend.h
+++ b/include/cloog/ppl_backend.h
@@ -38,6 +38,11 @@
 
 #ifndef CLOOG_PPL_BACKEND_H
 #define CLOOG_PPL_BACKEND_H
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 10
+# error "PPL version 0.10 or following is required"
+#endif
+
 #if defined(__cplusplus)
 extern "C"
 {
diff --git a/source/ppl/domain.c b/source/ppl/domain.c
index 1f2b7a3..99e53a2 100644
--- a/source/ppl/domain.c
+++ b/source/ppl/domain.c
@@ -42,6 +42,10 @@
 # include "cloog/cloog.h"
 #include "matrix.h"
 
+#ifndef USE_PPL_POWERSETS
+# define USE_PPL_POWERSETS 1
+#endif
+
 /* Variables names for pretty printing.  */
 static char wild_name[200][40];
 
@@ -111,6 +115,12 @@ cloog_initialize (void)
       exit (1);
     }
 
+  if (ppl_restore_pre_PPL_rounding() < 0)
+    {
+      fprintf (stderr, "Cannot restore the pre-PPL rounding mode.\n");
+      exit (1);
+    }
+
   if (ppl_set_error_handler (error_handler) < 0)
     {
       fprintf (stderr, "Cannot install the custom error handler.\n");
@@ -429,7 +439,7 @@ cloog_translate_constraint_matrix_1 (ppl_Polyhedron_t ppl, CloogMatrix *matrix)
   for (i = 0; i < matrix->NbRows; i++)
     {
       ppl_Constraint_t c = cloog_translate_constraint (matrix, i, 0, -1);
-      ppl_Polyhedron_add_constraint_and_minimize (ppl, c);
+      ppl_Polyhedron_add_constraint (ppl, c);
       ppl_delete_Constraint (c);
     }
 }
@@ -448,13 +458,13 @@ cloog_translate_constraint_matrix (CloogMatrix *matrix)
 /* Put the constraint matrix of polyhedron RES under Cloog's normal
    form: Cloog expects to see
 
-   0    1    1   -9 
-   1    0    1   -1 
+   0    1    1   -9
+   1    0    1   -1
 
    instead of this:
 
-   0    1    1   -9 
-   1   -1    0    8 
+   0    1    1   -9
+   1   -1    0    8
 
    These two forms are equivalent but the expected form uses rightmost
    indices for inequalities.  */
@@ -589,7 +599,7 @@ cloog_translate_ppl_polyhedron_1 (ppl_Polyhedron_t pol)
       return cloog_empty_polyhedron (dim);
     }
 
-  /* Add the positivity constraint.  */ 
+  /* Add the positivity constraint.  */
   if (1 || orig_ineqs == 0)
     {
       row = ineqs;
@@ -787,16 +797,13 @@ cloog_domain_convex (CloogDomain * domain)
   polyhedra_union upol = cloog_domain_upol (domain);
   CloogMatrix *m = cloog_upol_domain2matrix (upol);
   ppl_Polyhedron_t p1 = cloog_translate_constraint_matrix (m);
-  
+
   upol = cloog_upol_next (upol);
   while (upol)
     {
-      ppl_const_Generator_System_t g;
-
       m = cloog_upol_domain2matrix (upol);
       p2 = cloog_translate_constraint_matrix (m);
-      ppl_Polyhedron_get_generators (p2, &g);
-      ppl_Polyhedron_add_generators_and_minimize (p1, g);
+      ppl_Polyhedron_upper_bound_assign (p1, p2);
       ppl_delete_Polyhedron (p2);
 
       upol = cloog_upol_next (upol);
@@ -870,6 +877,75 @@ cloog_positivity_constraint_p (CloogMatrix *matrix, int i, int dim)
    |   S;
   */
 
+#if USE_PPL_POWERSETS
+
+CloogDomain *
+cloog_domain_simplify (CloogDomain * dom1, CloogDomain * dom2)
+{
+  if (!dom1)
+    return dom1;
+  if (!dom2)
+    return dom2;
+
+  CloogDomain *res = NULL;
+
+  ppl_Pointset_Powerset_C_Polyhedron_t ps1, ps2;
+  ppl_dimension_type dim = cloog_domain_dim(dom1);
+  /* Translate dom1 into PPL powerset ps1. */
+  {
+    ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension(&ps1, dim, 1);
+    polyhedra_union u1;
+    for (u1 = cloog_domain_upol (dom1); u1; u1 = cloog_upol_next (u1))
+      {
+        CloogMatrix *m = cloog_upol_domain2matrix (u1);
+        ppl_const_Polyhedron_t ph = cloog_translate_constraint_matrix (m);
+        ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(ps1, ph);
+        ppl_delete_Polyhedron(ph);
+        cloog_matrix_free (m);
+      }
+  }
+
+  /* Translate dom2 into PPL powerset ps2. */
+  {
+    ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension(&ps2, dim, 1);
+    polyhedra_union u2;
+    for (u2 = cloog_domain_upol (dom2); u2; u2 = cloog_upol_next (u2))
+      {
+        CloogMatrix *m = cloog_upol_domain2matrix (u2);
+        ppl_Polyhedron_t ph = cloog_translate_constraint_matrix (m);
+        ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(ps2, ph);
+        ppl_delete_Polyhedron(ph);
+        cloog_matrix_free (m);
+      }
+  }
+
+  ppl_Pointset_Powerset_C_Polyhedron_simplify_using_context_assign(ps1, ps2);
+
+  /* Translate back simplified ps1 into res. */
+  ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t i;
+  ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator(&i);
+  ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t end;
+  ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator(&end);
+  for (ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin(ps1, i),
+         ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end(ps1, end);
+       !ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test(i, end);
+       ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment(i))
+    {
+      ppl_const_Polyhedron_t ph;
+      ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference(i, &ph);
+      res = cloog_domain_union (res, cloog_translate_ppl_polyhedron (ph));
+    }
+
+  /* Final clean-up. */
+  ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator(i);
+  ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator(end);
+  ppl_delete_Pointset_Powerset_C_Polyhedron(ps1);
+  ppl_delete_Pointset_Powerset_C_Polyhedron(ps2);
+  return res;
+}
+
+#else /* !USE_PPL_POWERSETS */
+
 CloogDomain *
 cloog_domain_simplify (CloogDomain * dom1, CloogDomain * dom2)
 {
@@ -898,8 +974,9 @@ cloog_domain_simplify (CloogDomain * dom1, CloogDomain * dom2)
   return res;
 }
 
+#endif /* !USE_PPL_POWERSETS */
 
-static polyhedra_union 
+static polyhedra_union
 cloog_upol_copy (polyhedra_union p)
 {
   polyhedra_union res = cloog_new_upol (cloog_pol_copy (cloog_upol_polyhedron (p)));
@@ -1108,17 +1185,17 @@ cloog_domain_difference (CloogDomain * d1, CloogDomain * d2)
 	      /* Add the constraint "-matrix[i] - 1 >= 0".  */
 	      p3 = cloog_translate_constraint_matrix (m1);
 	      cstr = cloog_translate_oppose_constraint (matrix, i, -1, 1);
-	      ppl_Polyhedron_add_constraint_and_minimize (p3, cstr);
+	      ppl_Polyhedron_add_constraint (p3, cstr);
 	      ppl_delete_Constraint (cstr);
 	      res = cloog_domain_union (res, cloog_translate_ppl_polyhedron (p3));
 	      ppl_delete_Polyhedron (p3);
-	
+
 	      /* For an equality, add the constraint "matrix[i] - 1 >= 0".  */
 	      if (cloog_matrix_row_is_eq_p (matrix, i))
 		{
 		  p3 = cloog_translate_constraint_matrix (m1);
 		  cstr = cloog_translate_constraint (matrix, i, -1, 1);
-		  ppl_Polyhedron_add_constraint_and_minimize (p3, cstr);
+		  ppl_Polyhedron_add_constraint (p3, cstr);
 		  ppl_delete_Constraint (cstr);
 		  res = cloog_domain_union (res, cloog_translate_ppl_polyhedron (p3));
 		  ppl_delete_Polyhedron (p3);
@@ -1395,7 +1472,7 @@ cloog_domain_polyhedron_compare (CloogMatrix *m1, CloogMatrix *m2, int level, in
  * (level) is the level to consider for partial ordering (nb_par) is the
  * parameter space dimension, (permut) if not NULL, is an array of (nb_pols)
  * integers that contains a permutation specification after call in order to
- * apply the topological sorting. 
+ * apply the topological sorting.
  */
 
 void
@@ -1411,7 +1488,7 @@ cloog_domain_sort (CloogDomain **doms, unsigned nb_pols, unsigned level,
   /* Note that here we do a comparison per tuple of polyhedra.
      PolyLib does not do this, but instead it does fewer comparisons
      and with a complex reasoning they infer that it some comparisons
-     are not useful.  The result is that PolyLib has wrong permutations.  
+     are not useful.  The result is that PolyLib has wrong permutations.
 
      FIXME: In the PolyLib backend, Cloog should use this algorithm
      instead of PolyhedronTSort, and cloog_domain_polyhedron_compare
@@ -1542,7 +1619,7 @@ cloog_domain_list_free (CloogDomainList * list)
  * cloog_domain_read function:
  * Adaptation from the PolyLib. This function reads a matrix into a file (foo,
  * posibly stdin) and returns a pointer to a polyhedron containing the read
- * information. 
+ * information.
  * - October 18th 2001: first version.
  */
 CloogDomain *
@@ -1562,7 +1639,7 @@ cloog_domain_read (FILE * foo)
 /**
  * cloog_domain_union_read function:
  * This function reads a union of polyhedra into a file (foo, posibly stdin) and
- * returns a pointer to a Polyhedron containing the read information. 
+ * returns a pointer to a Polyhedron containing the read information.
  * - September 9th 2002: first version.
  * - October  29th 2005: (debug) removal of a leak counting "correction" that
  *                       was just false since ages.
@@ -1601,7 +1678,7 @@ cloog_domain_union_read (FILE * foo)
 /**
  * cloog_domain_list_read function:
  * This function reads a list of polyhedra into a file (foo, posibly stdin) and
- * returns a pointer to a CloogDomainList containing the read information. 
+ * returns a pointer to a CloogDomainList containing the read information.
  * - November 6th 2001: first version.
  */
 CloogDomainList *
@@ -1769,7 +1846,7 @@ cloog_domain_extend (CloogDomain * domain, int dim, int nb_par)
  * constraint inside a polyhedron, 0 otherwise.
  * - domain is the polyhedron to check,
  **
- * - November 28th 2001: first version. 
+ * - November 28th 2001: first version.
  * - June 26th 2003: for iterators, more 'never true' constraints are found
  *                   (compare cholesky2 and vivien with a previous version),
  *                   checking for the parameters created (compare using vivien).
@@ -2034,7 +2111,7 @@ cloog_matrix_hermite_1 (Value * a, Value * b, Value * d, int n, int p, int q)
 	cloog_matrix_hermite_combine (a, b, *c, d, k, n, p, q, pivot, x, x_inv);
 
   cloog_matrix_hermite_1 (a, b, d, n, p, q + 1);
-  
+
   value_clear (pivot);
   value_clear (x);
   value_clear (x_inv);
@@ -2159,7 +2236,7 @@ static inline void
 cloog_exchange_rows (CloogMatrix * m, int row1, int row2)
 {
   int i;
-  
+
   for (i = 0; i < (int) m->NbColumns; i++)
     value_swap (m->p[row1][i], m->p[row2][i]);
 }
@@ -2483,7 +2560,7 @@ cloog_dio_reduce_diagonal (CloogMatrix *m, Value *coeffs, int nbc, int rank)
       value_set_si (sum, 0);
       for (j = 0; j < i; j++)
 	value_addmul (sum, res[j], m->p[i][j]);
-	
+
       value_subtract (tmp, coeffs[i], sum);
       value_modulus (tmp, tmp, m->p[i][i]);
       if (value_notzero_p (tmp))
@@ -2652,7 +2729,7 @@ cloog_solve_diophantine (CloogMatrix * m, CloogMatrix ** u, Vector ** x)
  *   to be found,
  * - looking_level is the column number of the unknown that impose a stride to
  *   the first unknown.
- * - stride is the stride that is returned back as a function parameter. 
+ * - stride is the stride that is returned back as a function parameter.
  * - offset is the value of the constant c if the condition is of the shape
  *   (i + c)%s = 0, s being the stride.
  **
@@ -2722,7 +2799,7 @@ cloog_domain_stride (CloogDomain *domain, int strided_level, int nb_par, Value *
       value_pmodulus (*offset, *offset, *stride);
     }
 
-  cloog_matrix_free (U); 
+  cloog_matrix_free (U);
   Vector_Free (V);
   return;
 }
openSUSE Build Service is sponsored by