wide-int, gimple

Richard Biener richard.guenther@gmail.com
Mon Nov 25 15:44:00 GMT 2013


On Sat, Nov 23, 2013 at 8:21 PM, Mike Stump <mikestump@comcast.net> wrote:
> Richi has asked the we break the wide-int patch so that the individual port and front end maintainers can review their parts without have to go through the entire patch.    This patch covers the gimple code.
>
> Ok?

@@ -1754,7 +1754,7 @@ dump_ssaname_info (pretty_printer *buffer, tree
node, int spc)
   if (!POINTER_TYPE_P (TREE_TYPE (node))
       && SSA_NAME_RANGE_INFO (node))
     {
-      double_int min, max, nonzero_bits;
+      widest_int min, max, nonzero_bits;
       value_range_type range_type = get_range_info (node, &min, &max);

       if (range_type == VR_VARYING)

this makes me suspect you are changing SSA_NAME_RANGE_INFO
to embed two max wide_ints.  That's a no-no.

diff --git a/gcc/gimple-ssa-strength-reduction.c
b/gcc/gimple-ssa-strength-reduction.c
index 3ac9e4d..b9fc936 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -239,7 +240,7 @@ struct slsr_cand_d
   tree stride;

   /* The index constant i.  */
-  double_int index;
+  widest_int index;

   /* The type of the candidate.  This is normally the type of base_expr,
      but casts may have occurred when combining feeding instructions.
@@ -314,7 +315,7 @@ typedef const struct cand_chain_d *const_cand_chain_t;
 struct incr_info_d
 {
   /* The increment that relates a candidate to its basis.  */
-  double_int incr;
+  widest_int incr;

   /* How many times the increment occurs in the candidate tree.  */
   unsigned count;

that's similarly excessive.  You've said widest_int is only for automatic
use (thus, stack allocated).  Yet they sneak in into basic structures
of optimization passes ...

The above is a case where a pass should decide on a limit.  For
SLSR an offset_int is appropriate (but yes, you then need to retain
or even add checks whether uses fit).  In some cases making
wide_int the trailing element in pass local data can allow for
more optimal dynamic allocation as well.

@@ -831,9 +831,17 @@ gimple_divmod_fixed_value_transform
(gimple_stmt_iterator *si)
   else
     prob = 0;

-  tree_val = build_int_cst_wide (get_gcov_type (),
-                                (unsigned HOST_WIDE_INT) val,
-                                val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1);
+  if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
+    tree_val = build_int_cst (get_gcov_type (), val);
+  else
+    {
+      HOST_WIDE_INT a[2];
+      a[0] = (unsigned HOST_WIDE_INT) val;
+      a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
+
+      tree_val = wide_int_to_tree (get_gcov_type (),
wide_int::from_array (a, 2,
+       TYPE_PRECISION (get_gcov_type ()), false));
+    }

is two times replicated.  Please add a build_int_cst overload for
HOST_WIDEST_INT instead (conditional on HOST_WIDEST_INT != HOST_WIDE_INT).

Thanks,
Richard.



More information about the Gcc-patches mailing list