public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* New, almost final PPL 0.10 snapshot and patch for CLooG
@ 2008-10-01 11:06 Roberto Bagnara
  0 siblings, 0 replies; only message in thread
From: Roberto Bagnara @ 2008-10-01 11:06 UTC (permalink / raw)
  To: Sebastian Pop, Harle Christophe, Sjodin, Jan, Albert Cohen,
	Bastoul Cédric, Sven Verdoolaege, Jagasia, Harsha,
	rajagopal, dwarak, Pop, Sebastian, Jack Howarth, GCC Patches,
	Basile Starynkevitch
  Cc: The Parma Polyhedra Library developers' list

[-- Attachment #1: Type: text/plain, Size: 1525 bytes --]


Dear All,

we have uploaded an almost final PPL 0.10 snapshot to the usual location

     ftp://ftp.cs.unipr.it/pub/ppl/snapshots/

"Almost final" means that, unless new features are requested by the
Graphite/CLooG/MELT people, unless bugs are discovered, no semantic
changes are planned for the library core and its C++ and C interfaces.

This snapshot passes `make check' on almost all the architectures we
have access to (i.e., ia32, x86_64, hppa, ppc, sparc, alpha, ia64).
The only known problems are on Cygwin, but they seem problems of the
toolchain (try-catch does not work): we are currently installing
Cygwin 1.7 to check whether these problems have been solved.

Work continues on the Java, OCaml and Prolog interfaces of the library,
on documentation, testing and packaging.  We expect to officially release
PPL 0.10 in 2 or 3 weeks from now.

I also attach a patch for CLooG-PPL that:

1) avoids using features of the PPL that are deprecated in PPL 0.10
    (they will be removed in PPL 0.11);
2) uses PPL features to replace some of the existing code, but only
    for cases where the replacement is easy and clearly advantageous
    (a generalized use of PPL powersets could lead to a considerable
    simplification of the CLooG code in domain.c).

Please report any problem you may encounter to ppl-devel@cs.unipr.it
All the best,

    Roberto

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara@cs.unipr.it

[-- Attachment #2: cloog-ppl.patch --]
[-- Type: text/x-patch, Size: 11297 bytes --]

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;
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-10-01  8:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-10-01 11:06 New, almost final PPL 0.10 snapshot and patch for CLooG Roberto Bagnara

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).