diff options
author | Jeff Law <law@redhat.com> | 2005-07-27 16:21:48 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2005-07-27 16:21:48 +0000 |
commit | b024cc1cc08e9a7dbbc4bd8df0bb26a561e5c0bf (patch) | |
tree | ca21c19cd3ac54482070c4eb934ecff0d6f86fc4 /gcc/tree-vrp.c | |
parent | 44f9a5f01761d01e55c0c778d11d8d556227c8a5 (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.c | 11 |
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; |