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