aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2005-10-15 14:30:36 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2005-10-15 10:30:36 -0400
commit2d33a2effdaf3e8405a2fa05c3bf863ce6c4f1ee (patch)
treee93d789fc90c9149fee14d5a02bbc1646291a9e8 /gcc/tree-vrp.c
parent7b71de26446ee7729f8d0440edebb80c0f26db8d (diff)
downloadgcc-2d33a2effdaf3e8405a2fa05c3bf863ce6c4f1ee.zip
gcc-2d33a2effdaf3e8405a2fa05c3bf863ce6c4f1ee.tar.gz
gcc-2d33a2effdaf3e8405a2fa05c3bf863ce6c4f1ee.tar.bz2
re PR tree-optimization/23141 (ACATS FAIL c45651a fixed point wrong code)
PR 23141 PR 23142 * tree-vrp.c (vrp_meet): Fix the intersection of equivalence sets VR0->EQUIV and VR1->EQUIV when meeting a range and an anti-range. (vrp_visit_phi_node): Only prevent infinite iterations when the previous result and the new result are both VR_RANGEs. From-SVN: r105436
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index e9d6c81..7642ced2 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3497,8 +3497,11 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1)
&& !symbolic_range_p (vr1)
&& !value_ranges_intersect_p (vr0, vr1))
{
+ /* Copy most of VR1 into VR0. Don't copy VR1's equivalence
+ set. We need to compute the intersection of the two
+ equivalence sets. */
if (vr1->type == VR_ANTI_RANGE)
- copy_value_range (vr0, vr1);
+ set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
/* The resulting set of equivalences is the intersection of
the two sets. */
@@ -3609,7 +3612,7 @@ vrp_visit_phi_node (tree phi)
/* To prevent infinite iterations in the algorithm, derive ranges
when the new value is slightly bigger or smaller than the
previous one. */
- if (lhs_vr->type == VR_RANGE)
+ if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE)
{
if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
{