diff options
author | Jeff Law <law@redhat.com> | 2005-07-27 10:21:48 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2005-07-27 10:21:48 -0600 |
commit | 880031e1f9c134581537c61af91d89b7bb033dc7 (patch) | |
tree | ca21c19cd3ac54482070c4eb934ecff0d6f86fc4 /gcc/tree-vrp.c | |
parent | b940ce0e35a52e4a337cb3726d21945ef0b99465 (diff) | |
download | gcc-880031e1f9c134581537c61af91d89b7bb033dc7.zip gcc-880031e1f9c134581537c61af91d89b7bb033dc7.tar.gz gcc-880031e1f9c134581537c61af91d89b7bb033dc7.tar.bz2 |
tree-vrp.c (vrp_meet): Intersect the equivalency sets when meeting a VR_ANTI_RANGE with a VR_RANGE.
* 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.
From-SVN: r102432
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 e7d877d..58fb7ef 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; |