patch to canonize unsigned tree-csts
Kenneth Zadeck
zadeck@naturalbridge.com
Thu Oct 17 02:17:00 GMT 2013
On 10/15/2013 02:30 PM, Richard Sandiford wrote:
> Richard Sandiford <rdsandiford@googlemail.com> writes:
>> if (small_prec)
>> ;
>> else if (precision == xprecision)
>> while (len >= 0 && val[len - 1] == -1)
>> len--;
> Err, len > 0 obviously.
you were only close. patch tested on ppc and committed as revision
203739.
Index: gcc/tree.c
===================================================================
--- gcc/tree.c (revision 203701)
+++ gcc/tree.c (working copy)
@@ -1204,7 +1204,7 @@ wide_int_to_tree (tree type, const wide_
}
wide_int cst = wide_int::from (pcst, prec, sgn);
- unsigned int len = int (cst.get_len ());
+ unsigned int len = cst.get_len ();
unsigned int small_prec = prec & (HOST_BITS_PER_WIDE_INT - 1);
bool recanonize = sgn == UNSIGNED
&& small_prec
Index: gcc/tree.h
===================================================================
--- gcc/tree.h (revision 203701)
+++ gcc/tree.h (working copy)
@@ -5204,13 +5204,13 @@ wi::int_traits <const_tree>::decompose (
scratch[len - 1] = sext_hwi (val[len - 1], precision);
return wi::storage_ref (scratch, len, precision);
}
- }
-
- if (precision < xprecision + HOST_BITS_PER_WIDE_INT)
- {
- len = wi::force_to_size (scratch, val, len, xprecision,
precision, UNS
IGNED);
- return wi::storage_ref (scratch, len, precision);
- }
+ }
+ /* We have to futz here because a large unsigned int with
+ precision 128 may look (0x0 0xFFFFFFFFFFFFFFFF 0xF...) as a
+ tree-cst and as (0xF...) as a wide-int. */
+ else if (precision == xprecision && len == max_len)
+ while (len > 1 && val[len - 1] == (HOST_WIDE_INT)-1)
+ len--;
}
/* Signed and the rest of the unsigned cases are easy. */
More information about the Gcc-patches
mailing list