aboutsummaryrefslogtreecommitdiff
path: root/gcc/range-op.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/range-op.cc')
-rw-r--r--gcc/range-op.cc263
1 files changed, 131 insertions, 132 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index 215a161..224a561 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -119,8 +119,9 @@ get_shift_range (irange &r, tree type, const irange &op)
return false;
// Build valid range and intersect it with the shift range.
- r = value_range (build_int_cst_type (op.type (), 0),
- build_int_cst_type (op.type (), TYPE_PRECISION (type) - 1));
+ r = value_range (op.type (),
+ wi::shwi (0, TYPE_PRECISION (op.type ())),
+ wi::shwi (TYPE_PRECISION (type) - 1, TYPE_PRECISION (op.type ())));
r.intersect (op);
// If there are no valid ranges in the shift range, returned false.
@@ -414,11 +415,7 @@ value_range_from_overflowed_bounds (irange &r, tree type,
if (covers || wi::cmp (tmin, tmax, sgn) > 0)
r.set_varying (type);
else
- {
- tree tree_min = wide_int_to_tree (type, tmin);
- tree tree_max = wide_int_to_tree (type, tmax);
- r.set (tree_min, tree_max, VR_ANTI_RANGE);
- }
+ r.set (type, tmin, tmax, VR_ANTI_RANGE);
}
// Create and return a range from a pair of wide-ints. MIN_OVF and
@@ -458,8 +455,7 @@ value_range_with_overflow (irange &r, tree type,
else
// No overflow or both overflow or underflow. The range
// kind stays normal.
- r.set (wide_int_to_tree (type, tmin),
- wide_int_to_tree (type, tmax));
+ r.set (type, tmin, tmax);
return;
}
@@ -497,8 +493,7 @@ value_range_with_overflow (irange &r, tree type,
else
new_ub = wmax;
- r.set (wide_int_to_tree (type, new_lb),
- wide_int_to_tree (type, new_ub));
+ r.set (type, new_lb, new_ub);
}
}
@@ -516,7 +511,7 @@ create_possibly_reversed_range (irange &r, tree type,
value_range_from_overflowed_bounds (r, type, new_lb, new_ub);
else
// Otherwise it's just a normal range.
- r.set (wide_int_to_tree (type, new_lb), wide_int_to_tree (type, new_ub));
+ r.set (type, new_lb, new_ub);
}
// Return the summary information about boolean range LHS. If EMPTY/FULL,
@@ -581,7 +576,7 @@ equal_op1_op2_relation (const irange &lhs)
return VREL_NE;
// TRUE = op1 == op2 indicates EQ_EXPR.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (lhs.undefined_p () || !contains_zero_p (lhs))
return VREL_EQ;
return VREL_VARYING;
}
@@ -701,7 +696,7 @@ not_equal_op1_op2_relation (const irange &lhs)
return VREL_EQ;
// TRUE = op1 != op2 indicates NE_EXPR.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (lhs.undefined_p () || !contains_zero_p (lhs))
return VREL_NE;
return VREL_VARYING;
}
@@ -881,7 +876,7 @@ lt_op1_op2_relation (const irange &lhs)
return VREL_GE;
// TRUE = op1 < op2 indicates LT_EXPR.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (lhs.undefined_p () || !contains_zero_p (lhs))
return VREL_LT;
return VREL_VARYING;
}
@@ -1001,7 +996,7 @@ le_op1_op2_relation (const irange &lhs)
return VREL_GT;
// TRUE = op1 <= op2 indicates LE_EXPR.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (lhs.undefined_p () || !contains_zero_p (lhs))
return VREL_LE;
return VREL_VARYING;
}
@@ -1118,7 +1113,7 @@ gt_op1_op2_relation (const irange &lhs)
return VREL_LE;
// TRUE = op1 > op2 indicates GT_EXPR.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (!contains_zero_p (lhs))
return VREL_GT;
return VREL_VARYING;
}
@@ -1234,7 +1229,7 @@ ge_op1_op2_relation (const irange &lhs)
return VREL_LT;
// TRUE = op1 >= op2 indicates GE_EXPR.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (!contains_zero_p (lhs))
return VREL_GE;
return VREL_VARYING;
}
@@ -1963,7 +1958,6 @@ operator_mult::op1_range (irange &r, tree type,
const irange &lhs, const irange &op2,
relation_trio) const
{
- tree offset;
if (lhs.undefined_p ())
return false;
@@ -1973,7 +1967,8 @@ operator_mult::op1_range (irange &r, tree type,
if (TYPE_OVERFLOW_WRAPS (type))
return false;
- if (op2.singleton_p (&offset) && !integer_zerop (offset))
+ wide_int offset;
+ if (op2.singleton_p (offset) && offset != 0)
return range_op_handler (TRUNC_DIV_EXPR, type).fold_range (r, type,
lhs, op2);
return false;
@@ -2284,15 +2279,14 @@ operator_exact_divide::op1_range (irange &r, tree type,
{
if (lhs.undefined_p ())
return false;
- tree offset;
+ wide_int offset;
// [2, 4] = op1 / [3,3] since its exact divide, no need to worry about
// remainders in the endpoints, so op1 = [2,4] * [3,3] = [6,12].
// We wont bother trying to enumerate all the in between stuff :-P
// TRUE accuracy is [6,6][9,9][12,12]. This is unlikely to matter most of
// the time however.
// If op2 is a multiple of 2, we would be able to set some non-zero bits.
- if (op2.singleton_p (&offset)
- && !integer_zerop (offset))
+ if (op2.singleton_p (offset) && offset != 0)
return range_op_handler (MULT_EXPR, type).fold_range (r, type, lhs, op2);
return false;
}
@@ -2495,16 +2489,15 @@ operator_lshift::op1_range (irange &r,
{
if (lhs.undefined_p ())
return false;
- tree shift_amount;
- if (!lhs.contains_p (build_zero_cst (type)))
+ if (!contains_zero_p (lhs))
r.set_nonzero (type);
else
r.set_varying (type);
- if (op2.singleton_p (&shift_amount))
+ wide_int shift;
+ if (op2.singleton_p (shift))
{
- wide_int shift = wi::to_wide (shift_amount);
if (wi::lt_p (shift, 0, SIGNED))
return false;
if (wi::ge_p (shift, wi::uhwi (TYPE_PRECISION (type),
@@ -2541,8 +2534,7 @@ operator_lshift::op1_range (irange &r,
// This would be [0x42, 0xFC] aka [01000010, 11111100].
// Ideally we do this for each subrange, but just lump them all for now.
- unsigned low_bits = TYPE_PRECISION (utype)
- - TREE_INT_CST_LOW (shift_amount);
+ unsigned low_bits = TYPE_PRECISION (utype) - shift.to_uhwi ();
wide_int up_mask = wi::mask (low_bits, true, TYPE_PRECISION (utype));
wide_int new_ub = wi::bit_or (up_mask, tmp_range.upper_bound ());
wide_int new_lb = wi::set_bit (tmp_range.lower_bound (), low_bits);
@@ -2566,18 +2558,18 @@ operator_rshift::op1_range (irange &r,
const irange &op2,
relation_trio) const
{
- tree shift;
if (lhs.undefined_p ())
return false;
- if (op2.singleton_p (&shift))
+ wide_int shift;
+ if (op2.singleton_p (shift))
{
// Ignore nonsensical shifts.
unsigned prec = TYPE_PRECISION (type);
- if (wi::ge_p (wi::to_wide (shift),
- wi::uhwi (prec, TYPE_PRECISION (TREE_TYPE (shift))),
+ if (wi::ge_p (shift,
+ wi::uhwi (prec, TYPE_PRECISION (op2.type ())),
UNSIGNED))
return false;
- if (wi::to_wide (shift) == 0)
+ if (shift == 0)
{
r = lhs;
return true;
@@ -2593,7 +2585,7 @@ operator_rshift::op1_range (irange &r,
r.set_undefined ();
return true;
}
- int_range_max shift_range (shift, shift);
+ int_range_max shift_range (op2.type (), shift, shift);
int_range_max lb, ub;
op_lshift.fold_range (lb, type, lhs_refined, shift_range);
// LHS
@@ -2605,12 +2597,14 @@ operator_rshift::op1_range (irange &r,
tree mask = fold_build1 (BIT_NOT_EXPR, type,
fold_build2 (LSHIFT_EXPR, type,
build_minus_one_cst (type),
- shift));
- int_range_max mask_range (build_zero_cst (type), mask);
+ wide_int_to_tree (op2.type (), shift)));
+ int_range_max mask_range (type,
+ wi::zero (TYPE_PRECISION (type)),
+ wi::to_wide (mask));
op_plus.fold_range (ub, type, lb, mask_range);
r = lb;
r.union_ (ub);
- if (!lhs_refined.contains_p (build_zero_cst (type)))
+ if (!contains_zero_p (lhs_refined))
{
mask_range.invert ();
r.intersect (mask_range);
@@ -2853,7 +2847,7 @@ operator_cast::op1_range (irange &r, tree type,
{
// If the LHS is not a pointer nor a singleton, then it is
// either VARYING or non-zero.
- if (!lhs.contains_p (build_zero_cst (lhs.type ())))
+ if (!contains_zero_p (lhs))
r.set_nonzero (type);
else
r.set_varying (type);
@@ -2971,8 +2965,7 @@ operator_logical_and::fold_range (irange &r, tree type,
if ((wi::eq_p (lh.lower_bound (), 0) && wi::eq_p (lh.upper_bound (), 0))
|| (wi::eq_p (lh.lower_bound (), 0) && wi::eq_p (rh.upper_bound (), 0)))
r = range_false (type);
- else if (lh.contains_p (build_zero_cst (lh.type ()))
- || rh.contains_p (build_zero_cst (rh.type ())))
+ else if (contains_zero_p (lh) || contains_zero_p (rh))
// To reach this point, there must be a logical 1 on each side, and
// the only remaining question is whether there is a zero or not.
r = range_true_and_false (type);
@@ -3288,7 +3281,7 @@ operator_bitwise_and::wi_fold (irange &r, tree type,
static void
set_nonzero_range_from_mask (irange &r, tree type, const irange &lhs)
{
- if (!lhs.contains_p (build_zero_cst (type)))
+ if (!contains_zero_p (lhs))
r = range_nonzero (type);
else
r.set_varying (type);
@@ -3605,8 +3598,7 @@ operator_bitwise_or::op1_range (irange &r, tree type,
if (lhs.zero_p ())
{
- tree zero = build_zero_cst (type);
- r = int_range<1> (zero, zero);
+ r.set_zero (type);
return true;
}
r.set_varying (type);
@@ -3743,7 +3735,7 @@ operator_bitwise_xor::op1_range (irange &r, tree type,
else if (op2.zero_p ())
r = range_true (type);
// See get_bool_state for the rationale
- else if (op2.contains_p (build_zero_cst (op2.type ())))
+ else if (contains_zero_p (op2))
r = range_true_and_false (type);
else
r = range_false (type);
@@ -4346,7 +4338,7 @@ operator_addr_expr::fold_range (irange &r, tree type,
// Return a non-null pointer of the LHS type (passed in op2).
if (lh.zero_p ())
r = range_zero (type);
- else if (!lh.contains_p (build_zero_cst (lh.type ())))
+ else if (!contains_zero_p (lh))
r = range_nonzero (type);
else
r.set_varying (type);
@@ -4387,8 +4379,7 @@ pointer_plus_operator::wi_fold (irange &r, tree type,
// Check for [0,0] + const, and simply return the const.
if (lh_lb == 0 && lh_ub == 0 && rh_lb == rh_ub)
{
- tree val = wide_int_to_tree (type, rh_lb);
- r.set (val, val);
+ r.set (type, rh_lb, rh_lb);
return;
}
@@ -4522,8 +4513,7 @@ pointer_or_operator::op1_range (irange &r, tree type,
return false;
if (lhs.zero_p ())
{
- tree zero = build_zero_cst (type);
- r = int_range<1> (zero, zero);
+ r.set_zero (type);
return true;
}
r.set_varying (type);
@@ -4880,112 +4870,120 @@ range_cast (vrange &r, tree type)
namespace selftest
{
-#define INT(N) build_int_cst (integer_type_node, (N))
-#define UINT(N) build_int_cstu (unsigned_type_node, (N))
-#define INT16(N) build_int_cst (short_integer_type_node, (N))
-#define UINT16(N) build_int_cstu (short_unsigned_type_node, (N))
-#define SCHAR(N) build_int_cst (signed_char_type_node, (N))
-#define UCHAR(N) build_int_cstu (unsigned_char_type_node, (N))
+#define INT(x) wi::shwi ((x), TYPE_PRECISION (integer_type_node))
+#define UINT(x) wi::uhwi ((x), TYPE_PRECISION (unsigned_type_node))
+#define INT16(x) wi::shwi ((x), TYPE_PRECISION (short_integer_type_node))
+#define UINT16(x) wi::uhwi ((x), TYPE_PRECISION (short_unsigned_type_node))
+#define SCHAR(x) wi::shwi ((x), TYPE_PRECISION (signed_char_type_node))
+#define UCHAR(x) wi::uhwi ((x), TYPE_PRECISION (unsigned_char_type_node))
static void
range_op_cast_tests ()
{
int_range<2> r0, r1, r2, rold;
r0.set_varying (integer_type_node);
- tree maxint = wide_int_to_tree (integer_type_node, r0.upper_bound ());
+ wide_int maxint = r0.upper_bound ();
// If a range is in any way outside of the range for the converted
// to range, default to the range for the new type.
r0.set_varying (short_integer_type_node);
- tree minshort = wide_int_to_tree (short_integer_type_node, r0.lower_bound ());
- tree maxshort = wide_int_to_tree (short_integer_type_node, r0.upper_bound ());
- if (TYPE_PRECISION (TREE_TYPE (maxint))
+ wide_int minshort = r0.lower_bound ();
+ wide_int maxshort = r0.upper_bound ();
+ if (TYPE_PRECISION (integer_type_node)
> TYPE_PRECISION (short_integer_type_node))
{
- r1 = int_range<1> (integer_zero_node, maxint);
+ r1 = int_range<1> (integer_type_node,
+ wi::zero (TYPE_PRECISION (integer_type_node)),
+ maxint);
range_cast (r1, short_integer_type_node);
- ASSERT_TRUE (r1.lower_bound () == wi::to_wide (minshort)
- && r1.upper_bound() == wi::to_wide (maxshort));
+ ASSERT_TRUE (r1.lower_bound () == minshort
+ && r1.upper_bound() == maxshort);
}
// (unsigned char)[-5,-1] => [251,255].
- r0 = rold = int_range<1> (SCHAR (-5), SCHAR (-1));
+ r0 = rold = int_range<1> (signed_char_type_node, SCHAR (-5), SCHAR (-1));
range_cast (r0, unsigned_char_type_node);
- ASSERT_TRUE (r0 == int_range<1> (UCHAR (251), UCHAR (255)));
+ ASSERT_TRUE (r0 == int_range<1> (unsigned_char_type_node,
+ UCHAR (251), UCHAR (255)));
range_cast (r0, signed_char_type_node);
ASSERT_TRUE (r0 == rold);
// (signed char)[15, 150] => [-128,-106][15,127].
- r0 = rold = int_range<1> (UCHAR (15), UCHAR (150));
+ r0 = rold = int_range<1> (unsigned_char_type_node, UCHAR (15), UCHAR (150));
range_cast (r0, signed_char_type_node);
- r1 = int_range<1> (SCHAR (15), SCHAR (127));
- r2 = int_range<1> (SCHAR (-128), SCHAR (-106));
+ r1 = int_range<1> (signed_char_type_node, SCHAR (15), SCHAR (127));
+ r2 = int_range<1> (signed_char_type_node, SCHAR (-128), SCHAR (-106));
r1.union_ (r2);
ASSERT_TRUE (r1 == r0);
range_cast (r0, unsigned_char_type_node);
ASSERT_TRUE (r0 == rold);
// (unsigned char)[-5, 5] => [0,5][251,255].
- r0 = rold = int_range<1> (SCHAR (-5), SCHAR (5));
+ r0 = rold = int_range<1> (signed_char_type_node, SCHAR (-5), SCHAR (5));
range_cast (r0, unsigned_char_type_node);
- r1 = int_range<1> (UCHAR (251), UCHAR (255));
- r2 = int_range<1> (UCHAR (0), UCHAR (5));
+ r1 = int_range<1> (unsigned_char_type_node, UCHAR (251), UCHAR (255));
+ r2 = int_range<1> (unsigned_char_type_node, UCHAR (0), UCHAR (5));
r1.union_ (r2);
ASSERT_TRUE (r0 == r1);
range_cast (r0, signed_char_type_node);
ASSERT_TRUE (r0 == rold);
// (unsigned char)[-5,5] => [0,5][251,255].
- r0 = int_range<1> (INT (-5), INT (5));
+ r0 = int_range<1> (integer_type_node, INT (-5), INT (5));
range_cast (r0, unsigned_char_type_node);
- r1 = int_range<1> (UCHAR (0), UCHAR (5));
- r1.union_ (int_range<1> (UCHAR (251), UCHAR (255)));
+ r1 = int_range<1> (unsigned_char_type_node, UCHAR (0), UCHAR (5));
+ r1.union_ (int_range<1> (unsigned_char_type_node, UCHAR (251), UCHAR (255)));
ASSERT_TRUE (r0 == r1);
// (unsigned char)[5U,1974U] => [0,255].
- r0 = int_range<1> (UINT (5), UINT (1974));
+ r0 = int_range<1> (unsigned_type_node, UINT (5), UINT (1974));
range_cast (r0, unsigned_char_type_node);
- ASSERT_TRUE (r0 == int_range<1> (UCHAR (0), UCHAR (255)));
+ ASSERT_TRUE (r0 == int_range<1> (unsigned_char_type_node, UCHAR (0), UCHAR (255)));
range_cast (r0, integer_type_node);
// Going to a wider range should not sign extend.
- ASSERT_TRUE (r0 == int_range<1> (INT (0), INT (255)));
+ ASSERT_TRUE (r0 == int_range<1> (integer_type_node, INT (0), INT (255)));
// (unsigned char)[-350,15] => [0,255].
- r0 = int_range<1> (INT (-350), INT (15));
+ r0 = int_range<1> (integer_type_node, INT (-350), INT (15));
range_cast (r0, unsigned_char_type_node);
ASSERT_TRUE (r0 == (int_range<1>
- (TYPE_MIN_VALUE (unsigned_char_type_node),
- TYPE_MAX_VALUE (unsigned_char_type_node))));
+ (unsigned_char_type_node,
+ min_limit (unsigned_char_type_node),
+ max_limit (unsigned_char_type_node))));
// Casting [-120,20] from signed char to unsigned short.
// => [0, 20][0xff88, 0xffff].
- r0 = int_range<1> (SCHAR (-120), SCHAR (20));
+ r0 = int_range<1> (signed_char_type_node, SCHAR (-120), SCHAR (20));
range_cast (r0, short_unsigned_type_node);
- r1 = int_range<1> (UINT16 (0), UINT16 (20));
- r2 = int_range<1> (UINT16 (0xff88), UINT16 (0xffff));
+ r1 = int_range<1> (short_unsigned_type_node, UINT16 (0), UINT16 (20));
+ r2 = int_range<1> (short_unsigned_type_node,
+ UINT16 (0xff88), UINT16 (0xffff));
r1.union_ (r2);
ASSERT_TRUE (r0 == r1);
// A truncating cast back to signed char will work because [-120, 20]
// is representable in signed char.
range_cast (r0, signed_char_type_node);
- ASSERT_TRUE (r0 == int_range<1> (SCHAR (-120), SCHAR (20)));
+ ASSERT_TRUE (r0 == int_range<1> (signed_char_type_node,
+ SCHAR (-120), SCHAR (20)));
// unsigned char -> signed short
// (signed short)[(unsigned char)25, (unsigned char)250]
// => [(signed short)25, (signed short)250]
- r0 = rold = int_range<1> (UCHAR (25), UCHAR (250));
+ r0 = rold = int_range<1> (unsigned_char_type_node, UCHAR (25), UCHAR (250));
range_cast (r0, short_integer_type_node);
- r1 = int_range<1> (INT16 (25), INT16 (250));
+ r1 = int_range<1> (short_integer_type_node, INT16 (25), INT16 (250));
ASSERT_TRUE (r0 == r1);
range_cast (r0, unsigned_char_type_node);
ASSERT_TRUE (r0 == rold);
// Test casting a wider signed [-MIN,MAX] to a narrower unsigned.
- r0 = int_range<1> (TYPE_MIN_VALUE (long_long_integer_type_node),
- TYPE_MAX_VALUE (long_long_integer_type_node));
+ r0 = int_range<1> (long_long_integer_type_node,
+ min_limit (long_long_integer_type_node),
+ max_limit (long_long_integer_type_node));
range_cast (r0, short_unsigned_type_node);
- r1 = int_range<1> (TYPE_MIN_VALUE (short_unsigned_type_node),
- TYPE_MAX_VALUE (short_unsigned_type_node));
+ r1 = int_range<1> (short_unsigned_type_node,
+ min_limit (short_unsigned_type_node),
+ max_limit (short_unsigned_type_node));
ASSERT_TRUE (r0 == r1);
// Casting NONZERO to a narrower type will wrap/overflow so
@@ -4999,8 +4997,9 @@ range_op_cast_tests ()
{
r0 = range_nonzero (integer_type_node);
range_cast (r0, short_integer_type_node);
- r1 = int_range<1> (TYPE_MIN_VALUE (short_integer_type_node),
- TYPE_MAX_VALUE (short_integer_type_node));
+ r1 = int_range<1> (short_integer_type_node,
+ min_limit (short_integer_type_node),
+ max_limit (short_integer_type_node));
ASSERT_TRUE (r0 == r1);
}
@@ -5010,8 +5009,8 @@ range_op_cast_tests ()
// Converting this to 32-bits signed is [-MIN_16,-1][1, +MAX_16].
r0 = range_nonzero (short_integer_type_node);
range_cast (r0, integer_type_node);
- r1 = int_range<1> (INT (-32768), INT (-1));
- r2 = int_range<1> (INT (1), INT (32767));
+ r1 = int_range<1> (integer_type_node, INT (-32768), INT (-1));
+ r2 = int_range<1> (integer_type_node, INT (1), INT (32767));
r1.union_ (r2);
ASSERT_TRUE (r0 == r1);
}
@@ -5024,17 +5023,16 @@ range_op_lshift_tests ()
{
int_range_max res;
tree big_type = long_long_unsigned_type_node;
+ unsigned big_prec = TYPE_PRECISION (big_type);
// big_num = 0x808,0000,0000,0000
- tree big_num = fold_build2 (LSHIFT_EXPR, big_type,
- build_int_cst (big_type, 0x808),
- build_int_cst (big_type, 48));
+ wide_int big_num = wi::lshift (wi::uhwi (0x808, big_prec),
+ wi::uhwi (48, big_prec));
op_bitwise_and.fold_range (res, big_type,
int_range <1> (big_type),
- int_range <1> (big_num, big_num));
+ int_range <1> (big_type, big_num, big_num));
// val = 0x8,0000,0000,0000
- tree val = fold_build2 (LSHIFT_EXPR, big_type,
- build_int_cst (big_type, 0x8),
- build_int_cst (big_type, 48));
+ wide_int val = wi::lshift (wi::uhwi (8, big_prec),
+ wi::uhwi (48, big_prec));
ASSERT_TRUE (res.contains_p (val));
}
@@ -5042,13 +5040,13 @@ range_op_lshift_tests ()
{
// unsigned VARYING = op1 << 1 should be VARYING.
int_range<2> lhs (unsigned_type_node);
- int_range<2> shift (INT (1), INT (1));
+ int_range<2> shift (unsigned_type_node, INT (1), INT (1));
int_range_max op1;
op_lshift.op1_range (op1, unsigned_type_node, lhs, shift);
ASSERT_TRUE (op1.varying_p ());
// 0 = op1 << 1 should be [0,0], [0x8000000, 0x8000000].
- int_range<2> zero (UINT (0), UINT (0));
+ int_range<2> zero (unsigned_type_node, UINT (0), UINT (0));
op_lshift.op1_range (op1, unsigned_type_node, zero, shift);
ASSERT_TRUE (op1.num_pairs () == 2);
// Remove the [0,0] range.
@@ -5065,13 +5063,13 @@ range_op_lshift_tests ()
{
// unsigned VARYING = op1 << 1 should be VARYING.
int_range<2> lhs (integer_type_node);
- int_range<2> shift (INT (1), INT (1));
+ int_range<2> shift (integer_type_node, INT (1), INT (1));
int_range_max op1;
op_lshift.op1_range (op1, integer_type_node, lhs, shift);
ASSERT_TRUE (op1.varying_p ());
// 0 = op1 << 1 should be [0,0], [0x8000000, 0x8000000].
- int_range<2> zero (INT (0), INT (0));
+ int_range<2> zero (integer_type_node, INT (0), INT (0));
op_lshift.op1_range (op1, integer_type_node, zero, shift);
ASSERT_TRUE (op1.num_pairs () == 2);
// Remove the [0,0] range.
@@ -5090,10 +5088,11 @@ range_op_rshift_tests ()
{
// unsigned: [3, MAX] = OP1 >> 1
{
- int_range_max lhs (build_int_cst (unsigned_type_node, 3),
- TYPE_MAX_VALUE (unsigned_type_node));
- int_range_max one (build_one_cst (unsigned_type_node),
- build_one_cst (unsigned_type_node));
+ int_range_max lhs (unsigned_type_node,
+ UINT (3), max_limit (unsigned_type_node));
+ int_range_max one (unsigned_type_node,
+ wi::one (TYPE_PRECISION (unsigned_type_node)),
+ wi::one (TYPE_PRECISION (unsigned_type_node)));
int_range_max op1;
op_rshift.op1_range (op1, unsigned_type_node, lhs, one);
ASSERT_FALSE (op1.contains_p (UINT (3)));
@@ -5101,8 +5100,9 @@ range_op_rshift_tests ()
// signed: [3, MAX] = OP1 >> 1
{
- int_range_max lhs (INT (3), TYPE_MAX_VALUE (integer_type_node));
- int_range_max one (INT (1), INT (1));
+ int_range_max lhs (integer_type_node,
+ INT (3), max_limit (integer_type_node));
+ int_range_max one (integer_type_node, INT (1), INT (1));
int_range_max op1;
op_rshift.op1_range (op1, integer_type_node, lhs, one);
ASSERT_FALSE (op1.contains_p (INT (-2)));
@@ -5111,9 +5111,10 @@ range_op_rshift_tests ()
// This is impossible, so OP1 should be [].
// signed: [MIN, MIN] = OP1 >> 1
{
- int_range_max lhs (TYPE_MIN_VALUE (integer_type_node),
- TYPE_MIN_VALUE (integer_type_node));
- int_range_max one (INT (1), INT (1));
+ int_range_max lhs (integer_type_node,
+ min_limit (integer_type_node),
+ min_limit (integer_type_node));
+ int_range_max one (integer_type_node, INT (1), INT (1));
int_range_max op1;
op_rshift.op1_range (op1, integer_type_node, lhs, one);
ASSERT_TRUE (op1.undefined_p ());
@@ -5122,8 +5123,8 @@ range_op_rshift_tests ()
// signed: ~[-1] = OP1 >> 31
if (TYPE_PRECISION (integer_type_node) > 31)
{
- int_range_max lhs (INT (-1), INT (-1), VR_ANTI_RANGE);
- int_range_max shift (INT (31), INT (31));
+ int_range_max lhs (integer_type_node, INT (-1), INT (-1), VR_ANTI_RANGE);
+ int_range_max shift (integer_type_node, INT (31), INT (31));
int_range_max op1;
op_rshift.op1_range (op1, integer_type_node, lhs, shift);
int_range_max negatives = range_negatives (integer_type_node);
@@ -5136,13 +5137,11 @@ static void
range_op_bitwise_and_tests ()
{
int_range_max res;
- tree min = vrp_val_min (integer_type_node);
- tree max = vrp_val_max (integer_type_node);
- tree tiny = fold_build2 (PLUS_EXPR, integer_type_node, min,
- build_one_cst (integer_type_node));
- int_range_max i1 (tiny, max);
- int_range_max i2 (build_int_cst (integer_type_node, 255),
- build_int_cst (integer_type_node, 255));
+ wide_int min = min_limit (integer_type_node);
+ wide_int max = max_limit (integer_type_node);
+ wide_int tiny = wi::add (min, wi::one (TYPE_PRECISION (integer_type_node)));
+ int_range_max i1 (integer_type_node, tiny, max);
+ int_range_max i2 (integer_type_node, INT (255), INT (255));
// [MIN+1, MAX] = OP1 & 255: OP1 is VARYING
op_bitwise_and.op1_range (res, integer_type_node, i1, i2);
@@ -5155,8 +5154,8 @@ range_op_bitwise_and_tests ()
// For 0 = x & MASK, x is ~MASK.
{
- int_range<2> zero (integer_zero_node, integer_zero_node);
- int_range<2> mask = int_range<2> (INT (7), INT (7));
+ int_range<2> zero (integer_type_node, INT (0), INT (0));
+ int_range<2> mask = int_range<2> (integer_type_node, INT (7), INT (7));
op_bitwise_and.op1_range (res, integer_type_node, zero, mask);
wide_int inv = wi::shwi (~7U, TYPE_PRECISION (integer_type_node));
ASSERT_TRUE (res.get_nonzero_bits () == inv);
@@ -5169,7 +5168,7 @@ range_op_bitwise_and_tests ()
ASSERT_TRUE (res.nonzero_p ());
// (NEGATIVE | X) is nonzero.
- i1 = int_range<1> (INT (-5), INT (-3));
+ i1 = int_range<1> (integer_type_node, INT (-5), INT (-3));
i2.set_varying (integer_type_node);
op_bitwise_or.fold_range (res, integer_type_node, i1, i2);
ASSERT_FALSE (res.contains_p (INT (0)));
@@ -5179,22 +5178,22 @@ static void
range_relational_tests ()
{
int_range<2> lhs (unsigned_char_type_node);
- int_range<2> op1 (UCHAR (8), UCHAR (10));
- int_range<2> op2 (UCHAR (20), UCHAR (20));
+ int_range<2> op1 (unsigned_char_type_node, UCHAR (8), UCHAR (10));
+ int_range<2> op2 (unsigned_char_type_node, UCHAR (20), UCHAR (20));
// Never wrapping additions mean LHS > OP1.
relation_kind code = op_plus.lhs_op1_relation (lhs, op1, op2, VREL_VARYING);
ASSERT_TRUE (code == VREL_GT);
// Most wrapping additions mean nothing...
- op1 = int_range<2> (UCHAR (8), UCHAR (10));
- op2 = int_range<2> (UCHAR (0), UCHAR (255));
+ op1 = int_range<2> (unsigned_char_type_node, UCHAR (8), UCHAR (10));
+ op2 = int_range<2> (unsigned_char_type_node, UCHAR (0), UCHAR (255));
code = op_plus.lhs_op1_relation (lhs, op1, op2, VREL_VARYING);
ASSERT_TRUE (code == VREL_VARYING);
// However, always wrapping additions mean LHS < OP1.
- op1 = int_range<2> (UCHAR (1), UCHAR (255));
- op2 = int_range<2> (UCHAR (255), UCHAR (255));
+ op1 = int_range<2> (unsigned_char_type_node, UCHAR (1), UCHAR (255));
+ op2 = int_range<2> (unsigned_char_type_node, UCHAR (255), UCHAR (255));
code = op_plus.lhs_op1_relation (lhs, op1, op2, VREL_VARYING);
ASSERT_TRUE (code == VREL_LT);
}