Thanks for the changes.
@@ -8162,7 +8162,7 @@ fold_builtin_logarithm (location_t loc,
/* Prepare to do logN(exp10(exponent) -> exponent*logN(10). */
{
REAL_VALUE_TYPE dconst10;
- real_from_integer (&dconst10, VOIDmode, 10, SIGNED);
+ real_from_integer (&dconst10, VOIDmode, wi::shwi (10, 32),
SIGNED);
x = build_real (type, dconst10);
}
exponent = CALL_EXPR_ARG (arg, 0);
@@ -8315,7 +8315,7 @@ fold_builtin_pow (location_t loc, tree f
/* Check for an integer exponent. */
n = real_to_integer (&c);
- real_from_integer (&cint, VOIDmode, n, SIGNED);
+ real_from_integer (&cint, VOIDmode, wi::shwi (n,
HOST_BITS_PER_WIDE_INT), SIGNED);
if (real_identical (&c, &cint))
{
/* Attempt to evaluate pow at compile-time, unless this should
Are these changes necessary? The original calls ought to work as-is,
since the function takes a const wide_int_ref &. Same for the rest of
the patch.
Index: gcc/c/c-parser.c
===================================================================
--- gcc/c/c-parser.c (revision 204918)
+++ gcc/c/c-parser.c (working copy)
@@ -13375,7 +13375,7 @@ c_parser_cilk_clause_vectorlength (c_par
|| !TREE_CONSTANT (expr)
|| !INTEGRAL_TYPE_P (TREE_TYPE (expr)))
error_at (loc, "vectorlength must be an integer constant");
- else if (exact_log2 (tree_to_hwi (expr)) == -1)
+ else if (wi::eq_p (wi::exact_log2 (expr), -1))
error_at (loc, "vectorlength must be a power of 2");
else
{
FWIW:
wi::exact_log2 (expr) == -1
should still work.
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c (revision 204918)
+++ gcc/dwarf2out.c (working copy)
@@ -13428,8 +13428,6 @@ loc_descriptor (rtx rtl, enum machine_mo
if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict))
{
- gcc_assert (mode == GET_MODE (rtl) || VOIDmode == GET_MODE (rtl));
-
/* Note that a CONST_DOUBLE rtx could represent either an integer
or a floating-point constant. A CONST_DOUBLE is used whenever
the constant requires more than one word in order to be
The copy of the CONST_DOUBLE comment is still there though.
(This is handling CONST_WIDE_INT rather than CONST_DOUBLE.)
Index: gcc/tree.c
===================================================================
--- gcc/tree.c (revision 204918)
+++ gcc/tree.c (working copy)
@@ -8536,8 +8536,18 @@ retry:
return true;
/* Third, unsigned integers with top bit set never fit signed types. */
- if (!TYPE_UNSIGNED (type) && sgn_c == UNSIGNED && wi::neg_p (c))
- return false;
+ if (!TYPE_UNSIGNED (type) && sgn_c == UNSIGNED)
+ {
+ int uprec = GET_MODE_PRECISION (TYPE_MODE TREE_TYPE (c));
+ if (uprec < TYPE_PRECISION (TREE_TYPE (c)))
+ {
+ wide_int x = wi::sext (c, uprec);
+ if (wi::neg_p (x) || wi::ne_p (x, c))
+ return false;
+ }
+ else if (wi::neg_p (c))
+ return false;
+ }
/* If we haven't been able to decide at this point, there nothing more we
can check ourselves here. Look at the base type if we have one and it
I don't really understand this change, but I suppose it's part of
the trunk patch.
Looks good to me otherwise FWIW.
Thanks,
Richard