This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][GRAPHITE] Use generic isl-val interface, not gmp special one


This removes all GMP code from graphite and instead arranges to use
widest_ints plus the generic ISL interface for building/creating vals
by pieces.  This removes one gmp allocation per conversion plus allows
ISL to be built with IMath or IMath with small integer optimization
(on the host or in-tree).

ISL 0.15 supports IMath already but not IMath with small integer 
optimization.  I didn't adjust Makefile.def to choose anything other
than the GMP default for in-tree builds (yet).

I built and tested GCC with ISL 0.15, 0.16.1 and 0.18 all with GMP
and with IMath (or IMath-32 where available).

Full bootstrap and regtest running on x86_64-unknown-linux-gnu
(with host ISL 0.16.1).

Ok for trunk?

Thanks,
Richard.

2017-02-14  Richard Biener  <rguenther@suse.de>

	* graphite.h: Do not include isl/isl_val_gmp.h, instead include
	isl/isl_val.h.
	* graphite-isl-ast-to-gimple.c (gmp_cst_to_tree): Remove.
	(gcc_expression_from_isl_expr_int): Use generic isl_val interface.
	* graphite-sese-to-poly.c: Do not include isl/isl_val_gmp.h.
	(isl_val_int_from_wi): New function.
	(extract_affine_gmp): Rename to ...
	(extract_affine_wi): ... this, take a widest_int.
	(extract_affine_int): Just wrap extract_affine_wi.
	(add_param_constraints): Use isl_val_int_from_wi.
	(add_loop_constraints): Likewise, and extract_affine_wi.

Index: gcc/graphite-isl-ast-to-gimple.c
===================================================================
--- gcc/graphite-isl-ast-to-gimple.c	(revision 245417)
+++ gcc/graphite-isl-ast-to-gimple.c	(working copy)
@@ -73,22 +73,6 @@ struct ast_build_info
   bool is_parallelizable;
 };
 
-/* Converts a GMP constant VAL to a tree and returns it.  */
-
-static tree
-gmp_cst_to_tree (tree type, mpz_t val)
-{
-  tree t = type ? type : integer_type_node;
-  mpz_t tmp;
-
-  mpz_init (tmp);
-  mpz_set (tmp, val);
-  wide_int wi = wi::from_mpz (t, tmp, true);
-  mpz_clear (tmp);
-
-  return wide_int_to_tree (t, wi);
-}
-
 /* Verifies properties that GRAPHITE should maintain during translation.  */
 
 static inline void
@@ -325,16 +309,20 @@ gcc_expression_from_isl_expr_int (tree t
 {
   gcc_assert (isl_ast_expr_get_type (expr) == isl_ast_expr_int);
   isl_val *val = isl_ast_expr_get_val (expr);
-  mpz_t val_mpz_t;
-  mpz_init (val_mpz_t);
+  size_t n = isl_val_n_abs_num_chunks (val, sizeof (HOST_WIDE_INT));
+  HOST_WIDE_INT *chunks = XALLOCAVEC (HOST_WIDE_INT, n);
   tree res;
-  if (isl_val_get_num_gmp (val, val_mpz_t) == -1)
+  if (isl_val_get_abs_num_chunks (val, sizeof (HOST_WIDE_INT), chunks) == -1)
     res = NULL_TREE;
   else
-    res = gmp_cst_to_tree (type, val_mpz_t);
+    {
+      widest_int wi = widest_int::from_array (chunks, n, true);
+      if (isl_val_is_neg (val))
+	wi = -wi;
+      res = wide_int_to_tree (type, wi);
+    }
   isl_val_free (val);
   isl_ast_expr_free (expr);
-  mpz_clear (val_mpz_t);
   return res;
 }
 
Index: gcc/graphite-sese-to-poly.c
===================================================================
--- gcc/graphite-sese-to-poly.c	(revision 245417)
+++ gcc/graphite-sese-to-poly.c	(working copy)
@@ -55,7 +55,6 @@ along with GCC; see the file COPYING3.
 #include <isl/constraint.h>
 #include <isl/aff.h>
 #include <isl/val.h>
-#include <isl/val_gmp.h>
 
 #include "graphite.h"
 
@@ -154,16 +153,32 @@ extract_affine_name (scop_p s, tree e, _
   return isl_pw_aff_alloc (dom, aff);
 }
 
+/* Convert WI to a isl_val with CTX.  */
+
+static __isl_give isl_val *
+isl_val_int_from_wi (isl_ctx *ctx, const widest_int &wi)
+{
+  if (wi::neg_p (wi, SIGNED))
+    {
+      widest_int mwi = -wi;
+      return isl_val_neg (isl_val_int_from_chunks (ctx, mwi.get_len (),
+						   sizeof (HOST_WIDE_INT),
+						   mwi.get_val ()));
+    }
+  return isl_val_int_from_chunks (ctx, wi.get_len (), sizeof (HOST_WIDE_INT),
+				  wi.get_val ());
+}
+
 /* Extract an affine expression from the gmp constant G.  */
 
 static isl_pw_aff *
-extract_affine_gmp (mpz_t g, __isl_take isl_space *space)
+extract_affine_wi (const widest_int &g, __isl_take isl_space *space)
 {
   isl_local_space *ls = isl_local_space_from_space (isl_space_copy (space));
   isl_aff *aff = isl_aff_zero_on_domain (ls);
   isl_set *dom = isl_set_universe (space);
   isl_ctx *ct = isl_aff_get_ctx (aff);
-  isl_val *v = isl_val_int_from_gmp (ct, g);
+  isl_val *v = isl_val_int_from_wi (ct, g);
   aff = isl_aff_add_constant_val (aff, v);
 
   return isl_pw_aff_alloc (dom, aff);
@@ -174,13 +189,7 @@ extract_affine_gmp (mpz_t g, __isl_take
 static isl_pw_aff *
 extract_affine_int (tree e, __isl_take isl_space *space)
 {
-  mpz_t g;
-
-  mpz_init (g);
-  tree_int_to_gmp (e, g);
-  isl_pw_aff *res = extract_affine_gmp (g, space);
-  mpz_clear (g);
-
+  isl_pw_aff *res = extract_affine_wi (wi::to_widest (e), space);
   return res;
 }
 
@@ -411,15 +420,11 @@ add_param_constraints (scop_p scop, grap
     {
       isl_space *space = isl_set_get_space (scop->param_context);
       isl_constraint *c;
-      mpz_t g;
       isl_val *v;
 
       c = isl_inequality_alloc (isl_local_space_from_space (space));
-      mpz_init (g);
-      tree_int_to_gmp (lb, g);
-      v = isl_val_int_from_gmp (scop->isl_context, g);
+      v = isl_val_int_from_wi (scop->isl_context, wi::to_widest (lb));
       v = isl_val_neg (v);
-      mpz_clear (g);
       c = isl_constraint_set_constant_val (c, v);
       c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, 1);
 
@@ -431,15 +436,11 @@ add_param_constraints (scop_p scop, grap
     {
       isl_space *space = isl_set_get_space (scop->param_context);
       isl_constraint *c;
-      mpz_t g;
       isl_val *v;
 
       c = isl_inequality_alloc (isl_local_space_from_space (space));
 
-      mpz_init (g);
-      tree_int_to_gmp (ub, g);
-      v = isl_val_int_from_gmp (scop->isl_context, g);
-      mpz_clear (g);
+      v = isl_val_int_from_wi (scop->isl_context, wi::to_widest (ub));
       c = isl_constraint_set_constant_val (c, v);
       c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, -1);
 
@@ -773,11 +774,8 @@ add_loop_constraints (scop_p scop, __isl
       isl_local_space *ls = isl_local_space_from_space (space);
       isl_constraint *c = isl_inequality_alloc (ls);
       c = isl_constraint_set_coefficient_si (c, isl_dim_set, loop_index, -1);
-      mpz_t g;
-      mpz_init (g);
-      tree_int_to_gmp (nb_iters, g);
-      isl_val *v = isl_val_int_from_gmp (scop->isl_context, g);
-      mpz_clear (g);
+      isl_val *v
+	= isl_val_int_from_wi (scop->isl_context, wi::to_widest (nb_iters));
       c = isl_constraint_set_constant_val (c, v);
       return isl_set_add_constraint (domain, c);
     }
@@ -817,12 +815,9 @@ add_loop_constraints (scop_p scop, __isl
 
   /* NIT is an upper bound to NB_ITERS: "NIT >= NB_ITERS", although we
      do not know whether the loop executes at least once.  */
-  mpz_t g;
-  mpz_init (g);
-  wi::to_mpz (nit, g, SIGNED);
-  mpz_sub_ui (g, g, 1);
+  --nit;
 
-  isl_pw_aff *approx = extract_affine_gmp (g, isl_space_copy (space));
+  isl_pw_aff *approx = extract_affine_wi (nit, isl_space_copy (space));
   isl_set *x = isl_pw_aff_ge_set (approx, aff_nb_iters);
   x = isl_set_project_out (x, isl_dim_set, 0,
 			   isl_set_dim (x, isl_dim_set));
@@ -831,8 +826,7 @@ add_loop_constraints (scop_p scop, __isl
   ls = isl_local_space_from_space (space);
   c = isl_inequality_alloc (ls);
   c = isl_constraint_set_coefficient_si (c, isl_dim_set, loop_index, -1);
-  isl_val *v = isl_val_int_from_gmp (scop->isl_context, g);
-  mpz_clear (g);
+  isl_val *v = isl_val_int_from_wi (scop->isl_context, nit);
   c = isl_constraint_set_constant_val (c, v);
 
   if (dump_file)
Index: gcc/graphite.h
===================================================================
--- gcc/graphite.h	(revision 245417)
+++ gcc/graphite.h	(working copy)
@@ -25,7 +25,7 @@ along with GCC; see the file COPYING3.
 #include "sese.h"
 #include <isl/options.h>
 #include <isl/ctx.h>
-#include <isl/val_gmp.h>
+#include <isl/val.h>
 #include <isl/set.h>
 #include <isl/union_set.h>
 #include <isl/map.h>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]