From 880031e1f9c134581537c61af91d89b7bb033dc7 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 27 Jul 2005 10:21:48 -0600 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.c-torture/execute/pr22630.c | 23 +++++++++++++++++++ gcc/tree-vrp.c | 11 +++++++++ 4 files changed, 45 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr22630.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0f5218b7e2d..968809f6d49 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-07-27 Jeff Law + + * 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. + 2005-07-27 Dorit Nuzman PR tree-optimization/23073 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cffece4810e..e01e8c5a026 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-07-27 Jeff Law + + * gcc.c-torture/execute/pr22630.c: New test. + 2005-07-27 Dorit Nuzman PR tree-optimization/23073 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr22630.c b/gcc/testsuite/gcc.c-torture/execute/pr22630.c new file mode 100644 index 00000000000..d3a564999ba --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr22630.c @@ -0,0 +1,23 @@ +void abort (void); + +int j; + +void bla (int *r) +{ + int *p, *q; + + p = q = r; + if (!p) + p = &j; + + if (p != q) + j = 1; +} + +int main (void) +{ + bla (0); + if (!j) + abort (); + return 0; +} 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; -- 2.30.2