aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-09-15 17:33:48 +0200
committerAldy Hernandez <aldyh@redhat.com>2020-09-17 12:51:54 +0200
commit80cbca32464ae05931c0ae425eec7d1f373946eb (patch)
tree2b70518f772436d94a175d5cc07cfafdd2ebf1c2 /gcc/value-range.cc
parent27eac88a3f23ef7efbbd725504963cffc71dcad4 (diff)
downloadgcc-80cbca32464ae05931c0ae425eec7d1f373946eb.zip
gcc-80cbca32464ae05931c0ae425eec7d1f373946eb.tar.gz
gcc-80cbca32464ae05931c0ae425eec7d1f373946eb.tar.bz2
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.
Diffstat (limited to 'gcc/value-range.cc')
-rw-r--r--gcc/value-range.cc19
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 20aa4f1..ed2c322 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -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