From b2db922002d6d95cc0fc2f7965c9a5ba81c6cf5a Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 5 Sep 2006 08:36:39 +0000 Subject: [PATCH] re PR tree-optimization/28905 (ICE in compare_name_with_value, at tree-vrp.c:3557) 2006-09-05 Richard Guenther PR tree-optimization/28905 * tree-vrp.c (fix_equivalence_set): Manually implement !value_ranges_intersect_p to also handle symbolic ranges. * gcc.c-torture/compile/pr28905.c: New testcase. From-SVN: r116696 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr28905.c | 11 +++++++++++ gcc/tree-vrp.c | 16 ++++++++++------ 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr28905.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b4490c4f8cf..30a49bb379f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-09-05 Richard Guenther + + PR tree-optimization/28905 + * tree-vrp.c (fix_equivalence_set): Manually implement + !value_ranges_intersect_p to also handle symbolic ranges. + 2006-09-05 Richard Guenther PR middle-end/28935 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a4cda0f8c6..a1946dddf41 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-09-05 Richard Guenther + + PR tree-optimization/28905 + * gcc.c-torture/compile/pr28905.c: New testcase. + 2006-09-05 Richard Guenther PR middle-end/28935 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr28905.c b/gcc/testsuite/gcc.c-torture/compile/pr28905.c new file mode 100644 index 00000000000..83a381ab8c9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr28905.c @@ -0,0 +1,11 @@ +/* We used to ICE here because after VRP we ended up with + non-compatible ranges in a value-range equivalences set. */ +void code_comment (int size) +{ + int i; + for (i = 0; i < size; i++) + if (i) + if (i < 0) + if (i < 0) + return; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 5f532114757..a2127446a85 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -774,14 +774,18 @@ fix_equivalence_set (value_range_t *vr_p) value_range_t *equiv_vr = vr_value[i]; if (equiv_vr->type == VR_VARYING - || equiv_vr->type == VR_UNDEFINED - || symbolic_range_p (equiv_vr)) + || equiv_vr->type == VR_UNDEFINED) continue; - if (equiv_vr->type == VR_RANGE - && vr_p->type == VR_RANGE - && !value_ranges_intersect_p (vr_p, equiv_vr)) - bitmap_set_bit (to_remove, i); + if (vr_p->type == VR_RANGE + && equiv_vr->type == VR_RANGE) + { + /* Two ranges have an empty intersection if their end points + are outside of the other range. */ + if (compare_values (equiv_vr->min, vr_p->max) == 1 + || compare_values (equiv_vr->max, vr_p->min) == -1) + bitmap_set_bit (to_remove, i); + } else if ((equiv_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE) || (equiv_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE)) {