diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2019-06-07 22:18:24 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2019-06-07 22:18:24 +0000 |
commit | 1ef8f50e4f37e251aaf8d3c258d8c7ae9f1f7a38 (patch) | |
tree | 740fe04d5cffd31dadb65f99b1e591bd49569e96 /gcc/tree-vrp.c | |
parent | f32ee8a25ee82ae4139eaf6357366683352c7068 (diff) | |
download | gcc-1ef8f50e4f37e251aaf8d3c258d8c7ae9f1f7a38.zip gcc-1ef8f50e4f37e251aaf8d3c258d8c7ae9f1f7a38.tar.gz gcc-1ef8f50e4f37e251aaf8d3c258d8c7ae9f1f7a38.tar.bz2 |
Split up value_range::intersect into base (value_range_base) and
derived versions (value_range).
From-SVN: r272058
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 93 |
1 files changed, 62 insertions, 31 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index fdda64c..d94de2b 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -6020,30 +6020,26 @@ intersect_ranges (enum value_range_kind *vr0type, } -/* Intersect the two value-ranges *VR0 and *VR1 and store the result - in *VR0. This may not be the smallest possible such range. */ +/* Helper for the intersection operation for value ranges. Given two + value ranges VR0 and VR1, return the intersection of the two + ranges. This may not be the smallest possible such range. */ -void -value_range::intersect_helper (value_range *vr0, const value_range *vr1) +value_range_base +value_range_base::intersect_helper (const value_range_base *vr0, + const value_range_base *vr1) { /* If either range is VR_VARYING the other one wins. */ if (vr1->varying_p ()) - return; + return *vr0; if (vr0->varying_p ()) - { - vr0->deep_copy (vr1); - return; - } + return *vr1; /* When either range is VR_UNDEFINED the resulting range is VR_UNDEFINED, too. */ if (vr0->undefined_p ()) - return; + return *vr0; if (vr1->undefined_p ()) - { - vr0->set_undefined (); - return; - } + return *vr1; value_range_kind vr0type = vr0->kind (); tree vr0min = vr0->min (); @@ -6053,28 +6049,34 @@ value_range::intersect_helper (value_range *vr0, const value_range *vr1) /* Make sure to canonicalize the result though as the inversion of a VR_RANGE can still be a VR_RANGE. Work on a temporary so we can fall back to vr0 when this turns things to varying. */ - value_range tem; + value_range_base tem; tem.set_and_canonicalize (vr0type, vr0min, vr0max); /* If that failed, use the saved original VR0. */ if (tem.varying_p ()) - return; - vr0->update (tem.kind (), tem.min (), tem.max ()); + return *vr0; - /* If the result is VR_UNDEFINED there is no need to mess with - the equivalencies. */ - if (vr0->undefined_p ()) - return; + return tem; +} - /* The resulting set of equivalences for range intersection is the union of - the two sets. */ - if (vr0->m_equiv && vr1->m_equiv && vr0->m_equiv != vr1->m_equiv) - bitmap_ior_into (vr0->m_equiv, vr1->m_equiv); - else if (vr1->m_equiv && !vr0->m_equiv) +void +value_range_base::intersect (const value_range_base *other) +{ + if (dump_file && (dump_flags & TDF_DETAILS)) { - /* All equivalence bitmaps are allocated from the same obstack. So - we can use the obstack associated with VR to allocate vr0->equiv. */ - vr0->m_equiv = BITMAP_ALLOC (vr1->m_equiv->obstack); - bitmap_copy (m_equiv, vr1->m_equiv); + fprintf (dump_file, "Intersecting\n "); + dump_value_range (dump_file, this); + fprintf (dump_file, "\nand\n "); + dump_value_range (dump_file, other); + fprintf (dump_file, "\n"); + } + + *this = intersect_helper (this, other); + + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "to\n "); + dump_value_range (dump_file, this); + fprintf (dump_file, "\n"); } } @@ -6089,7 +6091,36 @@ value_range::intersect (const value_range *other) dump_value_range (dump_file, other); fprintf (dump_file, "\n"); } - intersect_helper (this, other); + + /* If THIS is varying we want to pick up equivalences from OTHER. + Just special-case this here rather than trying to fixup after the + fact. */ + if (this->varying_p ()) + this->deep_copy (other); + else + { + value_range_base tem = intersect_helper (this, other); + this->update (tem.kind (), tem.min (), tem.max ()); + + /* If the result is VR_UNDEFINED there is no need to mess with + equivalencies. */ + if (!undefined_p ()) + { + /* The resulting set of equivalences for range intersection + is the union of the two sets. */ + if (m_equiv && other->m_equiv && m_equiv != other->m_equiv) + bitmap_ior_into (m_equiv, other->m_equiv); + else if (other->m_equiv && !m_equiv) + { + /* All equivalence bitmaps are allocated from the same + obstack. So we can use the obstack associated with + VR to allocate this->m_equiv. */ + m_equiv = BITMAP_ALLOC (other->m_equiv->obstack); + bitmap_copy (m_equiv, other->m_equiv); + } + } + } + if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "to\n "); |