On February 14, 2017 4:50:32 PM GMT+01:00, Sebastian Pop <seb...@gmail.com> wrote: >On Tue, Feb 14, 2017 at 7:09 AM, Richard Biener <rguent...@suse.de> >wrote: >> >> 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). > >Have you checked the speedup of using gmp / imath / imath32 >when bootstrapping with BOOT_CFLAGS="-O2 -floop-nest-optimize"?
No, I didn't do any measurements. Richard. >> >> 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. > >Looks good to me. Thanks! > >Sebastian > >> >> 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>