aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2016-05-02 09:39:09 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2016-05-02 09:39:09 +0000
commit032c80e999eac4288ff1b0f752e15c8e7c5cdf51 (patch)
tree246e0c0732538d6aaa57d527e1ad81e531ce8ace /gcc/tree-vrp.c
parentcd1e4d417a91f4e802e745c8ff6cc6d88a2e96c1 (diff)
downloadgcc-032c80e999eac4288ff1b0f752e15c8e7c5cdf51.zip
gcc-032c80e999eac4288ff1b0f752e15c8e7c5cdf51.tar.gz
gcc-032c80e999eac4288ff1b0f752e15c8e7c5cdf51.tar.bz2
Support <, <=, > and >= for offset_int and widest_int
offset_int and widest_int are supposed to be at least one bit wider than all the values they need to represent, with the extra bits being signs. Thus offset_int is effectively int128_t and widest_int is effectively intNNN_t, for target-dependent NNN. Because the types are signed, there's not really any need to specify a sign for operations like comparison. I think things would be clearer if we supported <, <=, > and >= for them (but not for wide_int, which doesn't have a sign). Tested on x86_64-linux-gnu and aarch64-linux-gnu. gcc/ * wide-int.h: Update offset_int and widest_int documentation. (WI_SIGNED_BINARY_PREDICATE_RESULT): New macro. (wi::binary_traits): Allow ordered comparisons between offset_int and offset_int, between widest_int and widest_int, and between either of these types and basic C types. (operator <, <=, >, >=): Define for the same combinations. * tree.h (tree_int_cst_lt): Use comparison operators instead of wi:: comparisons. (tree_int_cst_le): Likewise. * gimple-fold.c (fold_array_ctor_reference): Likewise. (fold_nonarray_ctor_reference): Likewise. * gimple-ssa-strength-reduction.c (record_increment): Likewise. * tree-affine.c (aff_comb_cannot_overlap_p): Likewise. * tree-parloops.c (try_transform_to_exit_first_loop_alt): Likewise. * tree-sra.c (completely_scalarize): Likewise. * tree-ssa-alias.c (stmt_kills_ref_p): Likewise. * tree-ssa-reassoc.c (extract_bit_test_mask): Likewise. * tree-vrp.c (extract_range_from_binary_expr_1): Likewise. (check_for_binary_op_overflow): Likewise. (search_for_addr_array): Likewise. * ubsan.c (ubsan_expand_objsize_ifn): Likewise. From-SVN: r235719
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 3cb470b..4cd1ab3 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -2749,17 +2749,17 @@ extract_range_from_binary_expr_1 (value_range *vr,
/* Sort the 4 products so that min is in prod0 and max is in
prod3. */
/* min0min1 > max0max1 */
- if (wi::gts_p (prod0, prod3))
+ if (prod0 > prod3)
std::swap (prod0, prod3);
/* min0max1 > max0min1 */
- if (wi::gts_p (prod1, prod2))
+ if (prod1 > prod2)
std::swap (prod1, prod2);
- if (wi::gts_p (prod0, prod1))
+ if (prod0 > prod1)
std::swap (prod0, prod1);
- if (wi::gts_p (prod2, prod3))
+ if (prod2 > prod3)
std::swap (prod2, prod3);
/* diff = max - min. */
@@ -3775,7 +3775,7 @@ check_for_binary_op_overflow (enum tree_code subcode, tree type,
/* If all values in [wmin, wmax] are smaller than
[wtmin, wtmax] or all are larger than [wtmin, wtmax],
the arithmetic operation will always overflow. */
- if (wi::lts_p (wmax, wtmin) || wi::gts_p (wmin, wtmax))
+ if (wmax < wtmin || wmin > wtmax)
return true;
return false;
}
@@ -6587,7 +6587,7 @@ search_for_addr_array (tree t, location_t location)
idx = mem_ref_offset (t);
idx = wi::sdiv_trunc (idx, wi::to_offset (el_sz));
- if (wi::lts_p (idx, 0))
+ if (idx < 0)
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -6599,8 +6599,8 @@ search_for_addr_array (tree t, location_t location)
"array subscript is below array bounds");
TREE_NO_WARNING (t) = 1;
}
- else if (wi::gts_p (idx, (wi::to_offset (up_bound)
- - wi::to_offset (low_bound) + 1)))
+ else if (idx > (wi::to_offset (up_bound)
+ - wi::to_offset (low_bound) + 1))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{