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>

Reply via email to