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
This commit is contained in:
parent
b940ce0e35
commit
880031e1f9
@ -1,3 +1,10 @@
|
|||||||
|
2005-07-27 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
|
* 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 <dorit@il.ibm.com>
|
2005-07-27 Dorit Nuzman <dorit@il.ibm.com>
|
||||||
|
|
||||||
PR tree-optimization/23073
|
PR tree-optimization/23073
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2005-07-27 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
|
* gcc.c-torture/execute/pr22630.c: New test.
|
||||||
|
|
||||||
2005-07-27 Dorit Nuzman <dorit@il.ibm.com>
|
2005-07-27 Dorit Nuzman <dorit@il.ibm.com>
|
||||||
|
|
||||||
PR tree-optimization/23073
|
PR tree-optimization/23073
|
||||||
|
23
gcc/testsuite/gcc.c-torture/execute/pr22630.c
Normal file
23
gcc/testsuite/gcc.c-torture/execute/pr22630.c
Normal file
@ -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;
|
||||||
|
}
|
@ -3297,6 +3297,8 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1)
|
|||||||
the two sets. */
|
the two sets. */
|
||||||
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
|
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
|
||||||
bitmap_and_into (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);
|
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. */
|
the two sets. */
|
||||||
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
|
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
|
||||||
bitmap_and_into (vr0->equiv, vr1->equiv);
|
bitmap_and_into (vr0->equiv, vr1->equiv);
|
||||||
|
else if (vr0->equiv && !vr1->equiv)
|
||||||
|
bitmap_clear (vr0->equiv);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
goto no_meet;
|
goto no_meet;
|
||||||
@ -3329,6 +3333,13 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1)
|
|||||||
{
|
{
|
||||||
if (vr1->type == VR_ANTI_RANGE)
|
if (vr1->type == VR_ANTI_RANGE)
|
||||||
copy_value_range (vr0, vr1);
|
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
|
else
|
||||||
goto no_meet;
|
goto no_meet;
|
||||||
|
Loading…
Reference in New Issue
Block a user