Allow copying of symbolic ranges to an irange.
This fixes an ICE when trying to copy a legacy value_range containing a symbolic to a multi-range: min = make_ssa_name (type); max = build_int_cst (type, 55); value_range vv (min, max); int_range<2> vr = vv; gcc/ChangeLog: * range-op.cc (multi_precision_range_tests): Normalize symbolics when copying to a multi-range. * value-range.cc (irange::copy_legacy_range): Add test.
This commit is contained in:
parent
27eac88a3f
commit
80cbca3246
2 changed files with 32 additions and 2 deletions
|
@ -3453,6 +3453,21 @@ multi_precision_range_tests ()
|
|||
small = big;
|
||||
ASSERT_TRUE (small == int_range<1> (INT (21), INT (21), VR_ANTI_RANGE));
|
||||
|
||||
// Copying a legacy symbolic to an int_range should normalize the
|
||||
// symbolic at copy time.
|
||||
{
|
||||
tree ssa = make_ssa_name (integer_type_node);
|
||||
value_range legacy_range (ssa, INT (25));
|
||||
int_range<2> copy = legacy_range;
|
||||
ASSERT_TRUE (copy == int_range<2> (vrp_val_min (integer_type_node),
|
||||
INT (25)));
|
||||
|
||||
// Test that copying ~[abc_23, abc_23] to a multi-range yields varying.
|
||||
legacy_range = value_range (ssa, ssa, VR_ANTI_RANGE);
|
||||
copy = legacy_range;
|
||||
ASSERT_TRUE (copy.varying_p ());
|
||||
}
|
||||
|
||||
range3_tests ();
|
||||
}
|
||||
|
||||
|
|
|
@ -92,7 +92,12 @@ irange::copy_legacy_range (const irange &src)
|
|||
else if (src.varying_p ())
|
||||
set_varying (src.type ());
|
||||
else if (src.kind () == VR_ANTI_RANGE)
|
||||
set (src.min (), src.max (), VR_ANTI_RANGE);
|
||||
{
|
||||
if (src.legacy_mode_p () && !range_has_numeric_bounds_p (&src))
|
||||
set_varying (src.type ());
|
||||
else
|
||||
set (src.min (), src.max (), VR_ANTI_RANGE);
|
||||
}
|
||||
else if (legacy_mode_p () && src.maybe_anti_range ())
|
||||
{
|
||||
int_range<3> tmp (src);
|
||||
|
@ -101,7 +106,17 @@ irange::copy_legacy_range (const irange &src)
|
|||
VR_ANTI_RANGE);
|
||||
}
|
||||
else
|
||||
set (src.min (), src.max (), VR_RANGE);
|
||||
{
|
||||
// If copying legacy to int_range, normalize any symbolics.
|
||||
if (src.legacy_mode_p () && !range_has_numeric_bounds_p (&src))
|
||||
{
|
||||
value_range cst (src);
|
||||
cst.normalize_symbolics ();
|
||||
set (cst.min (), cst.max ());
|
||||
return;
|
||||
}
|
||||
set (src.min (), src.max ());
|
||||
}
|
||||
}
|
||||
|
||||
// Swap min/max if they are out of order. Return TRUE if further
|
||||
|
|
Loading…
Add table
Reference in a new issue