template<unsigned N = 255>
class GTY((user)) int_range : public irange
{
so people can use
int_range x;
and get the max range by default?
Indeed, I had forgotten about default template arguments, the only
problem is
int_range x;
is valid in c++17, but previous to that we have to do
int_range<> x;
Its a bit ugly, and possibly a bit less natural, But it does show the
intent.
If we eventually go this route, I will note that we should decide
whether we want to obscure the fact that an int_range<> or int_range is
no longer a tiny object.
(gdb) p sizeof(int_range<1>)
$4 = 32
(gdb) p sizeof(int_range<2>)
$5 = 48
(gdb) p sizeof(widest_irange)
$6 = 4096
At least with int_range_max the intent is very clear.
However, it does seem like int_range_max is the more prevalent use
except for small temporary ranges we know fit (a VARYING, or a small
range with just two end-points).
So I think the 2 basic choices are:
int_range<> r;
int_range_max r;
I'm thinking 'int_range_max'? but I really don't feel strongly one
way or the other... Eventually we'll probably end up with c++17 and
we
can revert to 'int_range' everywhere.
If we go with the _max suffix, then we should stick to the "int_range"
pattern for consistency.. in hindsight, 'widest_irange' should have
been
'widest_int_range'.
Int_range_max works for me.
Sounds good to me. See attached patch.
I have also renamed the deceptive irange3 to int_range3.
Committed.
gcc/ChangeLog:
* range-op.cc (range_operator::fold_range): Rename widest_irange
to int_range_max.
(operator_div::wi_fold): Same.
(operator_lshift::op1_range): Same.
(operator_rshift::op1_range): Same.
(operator_cast::fold_range): Same.
(operator_cast::op1_range): Same.
(operator_bitwise_and::remove_impossible_ranges): Same.
(operator_bitwise_and::op1_range): Same.
(operator_abs::op1_range): Same.
(range_cast): Same.
(widest_irange_tests): Same.
(range3_tests): Rename irange3 to int_range3.
(int_range_max_tests): Rename from widest_irange_tests.
Rename widest_irange to int_range_max.
(operator_tests): Rename widest_irange to int_range_max.
(range_tests): Same.
* tree-vrp.c (find_case_label_range): Same.
* value-range.cc (irange::irange_intersect): Same.
(irange::invert): Same.
* value-range.h: Same.
---
gcc/range-op.cc | 132 ++++++++++++++++++++++-----------------------
gcc/tree-vrp.c | 4 +-
gcc/value-range.cc | 4 +-
gcc/value-range.h | 2 +-
4 files changed, 71 insertions(+), 71 deletions(-)
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index b7b708b488b..fbf78be0a3c 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -160,7 +160,7 @@ range_operator::fold_range (irange &r, tree type,
return true;
}
- widest_irange tmp;
+ int_range_max tmp;
r.set_undefined ();
for (unsigned x = 0; x < num_lh; ++x)
for (unsigned y = 0; y < num_rh; ++y)
@@ -1367,7 +1367,7 @@ operator_div::wi_fold (irange &r, tree type,
// Then divide by the non-zero positive numbers, if any.
if (wi::gt_p (divisor_max, wi::zero (prec), sign))
{
- widest_irange tmp;
+ int_range_max tmp;
wi_cross_product (tmp, type, dividend_min, dividend_max,
wi::one (prec), divisor_max);
r.union_ (tmp);
@@ -1567,7 +1567,7 @@ operator_lshift::op1_range (irange &r,
//
// Perform a logical rshift by doing the rshift as unsigned.
tree unsigned_type = unsigned_type_for (type);
- widest_irange unsigned_lhs = lhs;
+ int_range_max unsigned_lhs = lhs;
range_cast (unsigned_lhs, unsigned_type);
rshift_op = range_op_handler (RSHIFT_EXPR, unsigned_type);
rshift_op->fold_range (lb, unsigned_type, unsigned_lhs, shifted);
@@ -1611,7 +1611,7 @@ operator_rshift::op1_range (irange &r,
{
// Folding the original operation may discard some impossible
// ranges from the LHS.
- widest_irange lhs_refined;
+ int_range_max lhs_refined;
op_rshift.fold_range (lhs_refined, type, int_range<1> (type), op2);
lhs_refined.intersect (lhs);
if (lhs_refined.undefined_p ())
@@ -1619,8 +1619,8 @@ operator_rshift::op1_range (irange &r,
r.set_undefined ();
return true;
}
- widest_irange shift_range (shift, shift);
- widest_irange lb, ub;
+ int_range_max shift_range (shift, shift);
+ int_range_max lb, ub;
op_lshift.fold_range (lb, type, lhs_refined, shift_range);
// LHS
// 0000 0111 = OP1 >> 3
@@ -1632,7 +1632,7 @@ operator_rshift::op1_range (irange &r,
fold_build2 (LSHIFT_EXPR, type,
build_minus_one_cst (type),
shift));
- widest_irange mask_range (build_zero_cst (type), mask);
+ int_range_max mask_range (build_zero_cst (type), mask);
op_plus.fold_range (ub, type, lb, mask_range);
r = lb;
r.union_ (ub);
@@ -1786,7 +1786,7 @@ operator_cast::fold_range (irange &r, tree type
ATTRIBUTE_UNUSED,
// Then process any additonal pairs by unioning with their results.
for (unsigned x = 1; x < inner.num_pairs (); ++x)
{
- widest_irange tmp;
+ int_range_max tmp;
fold_pair (tmp, x, inner, outer);
r.union_ (tmp);
if (r.varying_p ())
@@ -1811,7 +1811,7 @@ operator_cast::op1_range (irange &r, tree type,
{
// We want to insert the LHS as an unsigned value since it
// would not trigger the signed bit of the larger type.
- widest_irange converted_lhs = lhs;
+ int_range_max converted_lhs = lhs;
range_cast (converted_lhs, unsigned_type_for (lhs_type));
range_cast (converted_lhs, type);
// Start by building the positive signed outer range for the type.
@@ -1826,14 +1826,14 @@ operator_cast::op1_range (irange &r, tree type,
lim = wi::mask (TYPE_PRECISION (lhs_type), true,
TYPE_PRECISION (type));
// Add this to the unsigned LHS range(s).
- widest_irange lim_range (type, lim, lim);
- widest_irange lhs_neg;
+ int_range_max lim_range (type, lim, lim);
+ int_range_max lhs_neg;
range_op_handler (PLUS_EXPR, type)->fold_range (lhs_neg,
type,
converted_lhs,
lim_range);
// And union this with the entire outer types negative range.
- widest_irange neg (type,
+ int_range_max neg (type,
wi::min_value (TYPE_PRECISION (type),
SIGNED),
lim - 1);
@@ -1846,7 +1846,7 @@ operator_cast::op1_range (irange &r, tree type,
return true;
}
- widest_irange tmp;
+ int_range_max tmp;
if (TYPE_PRECISION (lhs_type) == TYPE_PRECISION (type))
tmp = lhs;
else
@@ -1984,7 +1984,7 @@ operator_bitwise_and::remove_impossible_ranges
(irange &r,
tree type = r.type ();
int prec = TYPE_PRECISION (type);
int leading_zeros = wi::clz (mask);
- widest_irange impossible_ranges;
+ int_range_max impossible_ranges;
/* We know that starting at the most significant bit, any 0 in the
mask means the resulting range cannot contain a 1 in that same
@@ -2315,10 +2315,10 @@ operator_bitwise_and::op1_range (irange &r, tree
type,
r.set_undefined ();
for (unsigned i = 0; i < lhs.num_pairs (); ++i)
{
- widest_irange chunk (lhs.type (),
+ int_range_max chunk (lhs.type (),
lhs.lower_bound (i),
lhs.upper_bound (i));
- widest_irange res;
+ int_range_max res;
simple_op1_range_solver (res, type, chunk, op2);
r.union_ (res);
}
@@ -2872,7 +2872,7 @@ operator_abs::op1_range (irange &r, tree type,
return true;
}
// Start with the positives because negatives are an impossible result.
- widest_irange positives = range_positives (type);
+ int_range_max positives = range_positives (type);
positives.intersect (lhs);
r = positives;
// Then add the negative of each pair:
@@ -3284,7 +3284,7 @@ range_op_handler (enum tree_code code, tree type)
void
range_cast (irange &r, tree type)
{
- widest_irange tmp = r;
+ int_range_max tmp = r;
range_operator *op = range_op_handler (CONVERT_EXPR, type);
// Call op_convert, if it fails, the result is varying.
if (!op->fold_range (r, type, tmp, int_range<1> (type)))
@@ -3321,84 +3321,84 @@ build_range3 (int a, int b, int c, int d, int e,
int f)
static void
range3_tests ()
{
- typedef int_range<3> irange3;
- irange3 r0, r1, r2;
- irange3 i1, i2, i3;
+ typedef int_range<3> int_range3;
+ int_range3 r0, r1, r2;
+ int_range3 i1, i2, i3;
// ([10,20] U [5,8]) U [1,3] ==> [1,3][5,8][10,20].
- r0 = irange3 (INT (10), INT (20));
- r1 = irange3 (INT (5), INT (8));
+ r0 = int_range3 (INT (10), INT (20));
+ r1 = int_range3 (INT (5), INT (8));
r0.union_ (r1);
- r1 = irange3 (INT (1), INT (3));
+ r1 = int_range3 (INT (1), INT (3));
r0.union_ (r1);
ASSERT_TRUE (r0 == build_range3 (1, 3, 5, 8, 10, 20));
// [1,3][5,8][10,20] U [-5,0] => [-5,3][5,8][10,20].
- r1 = irange3 (INT (-5), INT (0));
+ r1 = int_range3 (INT (-5), INT (0));
r0.union_ (r1);
ASSERT_TRUE (r0 == build_range3 (-5, 3, 5, 8, 10, 20));
// [10,20][30,40] U [50,60] ==> [10,20][30,40][50,60].
- r1 = irange3 (INT (50), INT (60));
- r0 = irange3 (INT (10), INT (20));
- r0.union_ (irange3 (INT (30), INT (40)));
+ r1 = int_range3 (INT (50), INT (60));
+ r0 = int_range3 (INT (10), INT (20));
+ r0.union_ (int_range3 (INT (30), INT (40)));
r0.union_ (r1);
ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
// [10,20][30,40][50,60] U [70, 80] ==> [10,20][30,40][50,60][70,80].
- r1 = irange3 (INT (70), INT (80));
+ r1 = int_range3 (INT (70), INT (80));
r0.union_ (r1);
r2 = build_range3 (10, 20, 30, 40, 50, 60);
- r2.union_ (irange3 (INT (70), INT (80)));
+ r2.union_ (int_range3 (INT (70), INT (80)));
ASSERT_TRUE (r0 == r2);
// [10,20][30,40][50,60] U [6,35] => [6,40][50,60].
r0 = build_range3 (10, 20, 30, 40, 50, 60);
- r1 = irange3 (INT (6), INT (35));
+ r1 = int_range3 (INT (6), INT (35));
r0.union_ (r1);
- r1 = irange3 (INT (6), INT (40));
- r1.union_ (irange3 (INT (50), INT (60)));
+ r1 = int_range3 (INT (6), INT (40));
+ r1.union_ (int_range3 (INT (50), INT (60)));
ASSERT_TRUE (r0 == r1);
// [10,20][30,40][50,60] U [6,60] => [6,60].
r0 = build_range3 (10, 20, 30, 40, 50, 60);
- r1 = irange3 (INT (6), INT (60));
+ r1 = int_range3 (INT (6), INT (60));
r0.union_ (r1);
- ASSERT_TRUE (r0 == irange3 (INT (6), INT (60)));
+ ASSERT_TRUE (r0 == int_range3 (INT (6), INT (60)));
// [10,20][30,40][50,60] U [6,70] => [6,70].
r0 = build_range3 (10, 20, 30, 40, 50, 60);
- r1 = irange3 (INT (6), INT (70));
+ r1 = int_range3 (INT (6), INT (70));
r0.union_ (r1);
- ASSERT_TRUE (r0 == irange3 (INT (6), INT (70)));
+ ASSERT_TRUE (r0 == int_range3 (INT (6), INT (70)));
// [10,20][30,40][50,60] U [35,70] => [10,20][30,70].
r0 = build_range3 (10, 20, 30, 40, 50, 60);
- r1 = irange3 (INT (35), INT (70));
+ r1 = int_range3 (INT (35), INT (70));
r0.union_ (r1);
- r1 = irange3 (INT (10), INT (20));
- r1.union_ (irange3 (INT (30), INT (70)));
+ r1 = int_range3 (INT (10), INT (20));
+ r1.union_ (int_range3 (INT (30), INT (70)));
ASSERT_TRUE (r0 == r1);
// [10,20][30,40][50,60] U [15,35] => [10,40][50,60].
r0 = build_range3 (10, 20, 30, 40, 50, 60);
- r1 = irange3 (INT (15), INT (35));
+ r1 = int_range3 (INT (15), INT (35));
r0.union_ (r1);
- r1 = irange3 (INT (10), INT (40));
- r1.union_ (irange3 (INT (50), INT (60)));
+ r1 = int_range3 (INT (10), INT (40));
+ r1.union_ (int_range3 (INT (50), INT (60)));
ASSERT_TRUE (r0 == r1);
// [10,20][30,40][50,60] U [35,35] => [10,20][30,40][50,60].
r0 = build_range3 (10, 20, 30, 40, 50, 60);
- r1 = irange3 (INT (35), INT (35));
+ r1 = int_range3 (INT (35), INT (35));
r0.union_ (r1);
ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
}
static void
-widest_irange_tests ()
+int_range_max_tests ()
{
- widest_irange big;
+ int_range_max big;
unsigned int nrange;
// Build a huge multi-range range.
@@ -3410,7 +3410,7 @@ widest_irange_tests ()
ASSERT_TRUE (big.num_pairs () == nrange);
// Verify that we can copy it without loosing precision.
- widest_irange copy (big);
+ int_range_max copy (big);
ASSERT_TRUE (copy.num_pairs () == nrange);
// Inverting it should produce one more sub-range.
@@ -3423,9 +3423,9 @@ widest_irange_tests ()
// Test that [10,10][20,20] does NOT contain 15.
{
- widest_irange i1 (build_int_cst (integer_type_node, 10),
+ int_range_max i1 (build_int_cst (integer_type_node, 10),
build_int_cst (integer_type_node, 10));
- widest_irange i2 (build_int_cst (integer_type_node, 20),
+ int_range_max i2 (build_int_cst (integer_type_node, 20),
build_int_cst (integer_type_node, 20));
i1.union_ (i2);
ASSERT_FALSE (i1.contains_p (build_int_cst (integer_type_node, 15)));
@@ -3463,9 +3463,9 @@ operator_tests ()
tree max = vrp_val_max (integer_type_node);
tree tiny = fold_build2 (PLUS_EXPR, integer_type_node, min,
build_one_cst (integer_type_node));
- widest_irange res;
- widest_irange i1 (tiny, max);
- widest_irange i2 (build_int_cst (integer_type_node, 255),
+ int_range_max res;
+ int_range_max i1 (tiny, max);
+ int_range_max i2 (build_int_cst (integer_type_node, 255),
build_int_cst (integer_type_node, 255));
// [MIN+1, MAX] = OP1 & 255: OP1 is VARYING
@@ -3497,20 +3497,20 @@ operator_tests ()
// unsigned: [3, MAX] = OP1 >> 1
{
- widest_irange lhs (build_int_cst (unsigned_type_node, 3),
+ int_range_max lhs (build_int_cst (unsigned_type_node, 3),
TYPE_MAX_VALUE (unsigned_type_node));
- widest_irange one (build_one_cst (unsigned_type_node),
+ int_range_max one (build_one_cst (unsigned_type_node),
build_one_cst (unsigned_type_node));
- widest_irange op1;
+ int_range_max op1;
op_rshift.op1_range (op1, unsigned_type_node, lhs, one);
ASSERT_FALSE (op1.contains_p (UINT (3)));
}
// signed: [3, MAX] = OP1 >> 1
{
- widest_irange lhs (INT (3), TYPE_MAX_VALUE (integer_type_node));
- widest_irange one (INT (1), INT (1));
- widest_irange op1;
+ int_range_max lhs (INT (3), TYPE_MAX_VALUE (integer_type_node));
+ int_range_max one (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)));
}
@@ -3518,10 +3518,10 @@ operator_tests ()
// This is impossible, so OP1 should be [].
// signed: [MIN, MIN] = OP1 >> 1
{
- widest_irange lhs (TYPE_MIN_VALUE (integer_type_node),
+ int_range_max lhs (TYPE_MIN_VALUE (integer_type_node),
TYPE_MIN_VALUE (integer_type_node));
- widest_irange one (INT (1), INT (1));
- widest_irange op1;
+ int_range_max one (INT (1), INT (1));
+ int_range_max op1;
op_rshift.op1_range (op1, integer_type_node, lhs, one);
ASSERT_TRUE (op1.undefined_p ());
}
@@ -3529,11 +3529,11 @@ operator_tests ()
// signed: ~[-1] = OP1 >> 31
if (TYPE_PRECISION (integer_type_node) > 31)
{
- widest_irange lhs (INT (-1), INT (-1), VR_ANTI_RANGE);
- widest_irange shift (INT (31), INT (31));
- widest_irange op1;
+ int_range_max lhs (INT (-1), INT (-1), VR_ANTI_RANGE);
+ int_range_max shift (INT (31), INT (31));
+ int_range_max op1;
op_rshift.op1_range (op1, integer_type_node, lhs, shift);
- widest_irange negatives = range_negatives (integer_type_node);
+ int_range_max negatives = range_negatives (integer_type_node);
negatives.intersect (op1);
ASSERT_TRUE (negatives.undefined_p ());
}
@@ -3823,7 +3823,7 @@ range_tests ()
ASSERT_TRUE (r0.nonzero_p ());
multi_precision_range_tests ();
- widest_irange_tests ();
+ int_range_max_tests ();
operator_tests ();
}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index a165164bb40..f7b0692a407 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3827,7 +3827,7 @@ find_case_label_range (gswitch *switch_stmt, const
irange *range_of_op)
tree label = gimple_switch_label (switch_stmt, i);
tree case_high
= CASE_HIGH (label) ? CASE_HIGH (label) : CASE_LOW (label);
- widest_irange label_range (CASE_LOW (label), case_high);
+ int_range_max label_range (CASE_LOW (label), case_high);
label_range.intersect (range_of_op);
if (label_range == *range_of_op)
return label;
@@ -3849,7 +3849,7 @@ find_case_label_range (gswitch *switch_stmt, const
irange *range_of_op)
tree case_high = CASE_HIGH (max_label);
if (!case_high)
case_high = CASE_LOW (max_label);
- widest_irange label_range (CASE_LOW (min_label), case_high);
+ int_range_max label_range (CASE_LOW (min_label), case_high);
if (!types_compatible_p (label_range.type (), range_of_op->type ()))
range_cast (label_range, range_of_op->type ());
label_range.intersect (range_of_op);
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 93164b7e2e2..20aa4f114c9 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -1690,7 +1690,7 @@ irange::irange_intersect (const irange &r)
signop sign = TYPE_SIGN (TREE_TYPE(m_base[0]));
unsigned bld_pair = 0;
unsigned bld_lim = m_max_ranges;
- widest_irange r2 (*this);
+ int_range_max r2 (*this);
unsigned r2_lim = r2.num_pairs ();
unsigned i2 = 0;
for (unsigned i = 0; i < r.num_pairs (); )
@@ -1827,7 +1827,7 @@ irange::invert ()
unsigned i = 0;
wi::overflow_type ovf;
// Construct leftmost range.
- widest_irange orig_range (*this);
+ int_range_max orig_range (*this);
unsigned nitems = 0;
wide_int tmp;
// If this is going to underflow on the MINUS 1, don't even bother
diff --git a/gcc/value-range.h b/gcc/value-range.h
index 1ab39939703..8497791c7b3 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -174,7 +174,7 @@ typedef int_range<1> value_range;
// This is an "infinite" precision irange for use in temporary
// calculations.
-typedef int_range<255> widest_irange;
+typedef int_range<255> int_range_max;
// Returns true for an old-school value_range as described above.
inline bool
--
2.26.2