On 12/12/2011 08:00 PM, Andrew Pinski wrote:
On Mon, Dec 12, 2011 at 6:53 PM, Sandra Loosemore
<san...@codesourcery.com>  wrote:
The test case in the attached patch gets stuck in an infinite loop in
find_comparison_args in CSE when compiled for MIPS at -O2.  This bug has
been present at least as far back as GCC 4.5 and probably much earlier than
that.

The problem is that the inner loop over equivalences in the hash table is
finding something that rewrites to exactly the same expression that we've
already got in the outer loop, and there is no test for circular rewrites.

This patch fixes the specific problem in the test case by skipping over
equivalences that would rewrite to exactly the same expression as on the
current iteration.  But, it's not clear that there can't also be cycles of
length>  1.  I don't see much point in getting fancy here (I assume that if
this were a common problem it would have been reported and fixed long before
now) so I just added a simple limit on the number of iterations to be sure
the outer loop always terminates.

I regression-tested this in a GCC 4.5-based build for mips-linux-gnu and
also did a full bootstrap and regression test for i686-pc-linux-gnu on
mainline head.  OK to check in on mainline?

This is http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50380 .

Hmmmm. It looks to me like the patch that allegedly fixes the problem on mainline may do so by coincidence. At least, it's not obvious to me that it does something to ensure that the loop in find_comparison_args always terminates.....

-Sandra

Reply via email to