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 <rguent...@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>