aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2005-07-27 16:21:48 +0000
committerJeff Law <law@redhat.com>2005-07-27 16:21:48 +0000
commitb024cc1cc08e9a7dbbc4bd8df0bb26a561e5c0bf (patch)
treeca21c19cd3ac54482070c4eb934ecff0d6f86fc4 /gcc/tree-vrp.c
parent44f9a5f01761d01e55c0c778d11d8d556227c8a5 (diff)
* tree-vrp.c (vrp_meet): Intersect the equivalency sets when
meeting a VR_ANTI_RANGE with a VR_RANGE. When intersecting equivalency sets, correctly handle the case were vr0 has an equivalency set, but vr1 does not. * gcc.c-torture/execute/pr22630.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@102432 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index e7d877d7d58..58fb7ef017f 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3297,6 +3297,8 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1)
the two sets. */
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
bitmap_and_into (vr0->equiv, vr1->equiv);
+ else if (vr0->equiv && !vr1->equiv)
+ bitmap_clear (vr0->equiv);
set_value_range (vr0, vr0->type, min, max, vr0->equiv);
}
@@ -3314,6 +3316,8 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1)
the two sets. */
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
bitmap_and_into (vr0->equiv, vr1->equiv);
+ else if (vr0->equiv && !vr1->equiv)
+ bitmap_clear (vr0->equiv);
}
else
goto no_meet;
@@ -3329,6 +3333,13 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1)
{
if (vr1->type == VR_ANTI_RANGE)
copy_value_range (vr0, vr1);
+
+ /* The resulting set of equivalences is the intersection of
+ the two sets. */
+ if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
+ bitmap_and_into (vr0->equiv, vr1->equiv);
+ else if (vr0->equiv && !vr1->equiv)
+ bitmap_clear (vr0->equiv);
}
else
goto no_meet;