diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-10-02 09:45:40 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-10-02 09:45:40 +0000 |
commit | a1488398d4abf50ff8b2ec25d6a75185aefc52c8 (patch) | |
tree | e5cca47aca114b176833f91da6a74b6829051ce5 /gcc/match.pd | |
parent | 1a6da556c414bbbec6df82fdb342e8b84e205507 (diff) | |
download | gcc-a1488398d4abf50ff8b2ec25d6a75185aefc52c8.zip gcc-a1488398d4abf50ff8b2ec25d6a75185aefc52c8.tar.gz gcc-a1488398d4abf50ff8b2ec25d6a75185aefc52c8.tar.bz2 |
Fix mismatched precisions in tree arithmetic
The tree wi:: decompose routine wasn't asserting that the requested
precision matched the tree's precision. This could make a difference
for unsigned trees that are exactly N HWIs wide and that have the upper
bit set, since we then need an extra zero HWI when extending it to wider
precisions (as for wi::to_widest).
This patch adds the assert and fixes the fallout shown by the testsuite.
Go seems to be unaffected.
2017-10-02 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
* tree.h (wi::int_traits <const_tree>::decompose): Assert that the
requested precision matches the type's.
* calls.c (alloc_max_size): Calculate the new candidate size as
a widest_int and use wi::to_widest when comparing it with the
current candidate size.
* gimple-ssa-warn-alloca.c (pass_walloca::execute): Compare with
zero rather than integer_zero_node.
* match.pd: Check for a no-op conversion before using wi::add
rather than after. Use tree_to_uhwi when summing small shift
counts into an unsigned int.
gcc/c-family/
* c-warn.c (warn_tautological_bitwise_comparison): Use wi::to_widest
when combining the original unconverted comparison operands.
gcc/cp/
* constexpr.c (cxx_eval_store_expression): Use wi::to_widest
when comparing the array bounds with an ARRAY_REF index.
gcc/ada/
* gcc-interface/decl.c (annotate_value): Use wi::to_widest when
handling the form (plus/mult (convert @0) @1).
From-SVN: r253341
Diffstat (limited to 'gcc/match.pd')
-rw-r--r-- | gcc/match.pd | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index 1136a59..e58a65a 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -358,8 +358,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (div (convert? (bit_and @0 INTEGER_CST@1)) INTEGER_CST@2) (if (integer_pow2p (@2) && tree_int_cst_sgn (@2) > 0 - && wi::add (@2, @1) == 0 - && tree_nop_conversion_p (type, TREE_TYPE (@0))) + && tree_nop_conversion_p (type, TREE_TYPE (@0)) + && wi::add (@2, @1) == 0) (rshift (convert @0) { build_int_cst (integer_type_node, wi::exact_log2 (@2)); })))) @@ -1883,7 +1883,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && wi::lt_p (@1, prec, TYPE_SIGN (TREE_TYPE (@1))) && wi::ge_p (@2, 0, TYPE_SIGN (TREE_TYPE (@2))) && wi::lt_p (@2, prec, TYPE_SIGN (TREE_TYPE (@2)))) - (with { unsigned int low = wi::add (@1, @2).to_uhwi (); } + (with { unsigned int low = (tree_to_uhwi (@1) + + tree_to_uhwi (@2)); } /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2 being well defined. */ (if (low >= prec) |