------- Comment #6 from rguenth at gcc dot gnu dot org 2006-09-02 10:15 -------
The problem is, that for
i_1: VARYING
size_3: VARYING
i_4: ~[0, 0] EQUIVALENCES: { } (0 elements)
i_5: [-INF, -1] EQUIVALENCES: { i_6 i_7 } (2 elements)
i_6: ~[0, 0] EQUIVALENCES: { i_7 } (1 elements)
i_7: [0, size_3 - 1] EQUIVALENCES: { i_1 } (1 elements)
i_5 contains VRs in the equivalences set that are not compatible (i_7).
fix_equivalence_set is supposed to prevent that, but somehow it doesn't.
Simplified testcase:
void code_comment (int size)
{
int i;
for (i = 0; i < size; i++)
if (i)
if (i < 0)
if (i < 0)
return;
}
the problem seems to be that [0, size-1] is not removed because it is a
symbolic range. Still it can never overlap with [-INF, -1].
I think that this "fixing" of equivalence sets is very fragile in the
presence of symbolic ranges in the equivalence set, but I have a patch
that handles the above case.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28905