On Sat, Nov 23, 2013 at 8:21 PM, Mike Stump <mikest...@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.