http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47782

           Summary: Infinite cycle generates segmentation fault in targets
                    without cbranch support
           Product: gcc
           Version: 4.5.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: middle-end
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: paulo.ma...@csr.com


Created attachment 23378
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=23378
patch to assert !can_compare_p

I have tested this with gcc 4.5.2. It doesn't happen in 4.4.4. 
There's a possibility for an infinite loop between two dojump.c functions:

do_jump_by_parts_greater_rtx

and

do_compare_rtx_and_jump

One condition needs to be met: !can_compare_p(code, mode, ccp_jump).
As far as I understand from the code this is when the target doesn't implement
cbranch<mode>.

Unfortunately you can't reproduce it straightforwardly with i386 since it
implements cbranch<mode> but by patching gcc with the no-cbranch.patch you can
make gcc think there's no cbranch<mode>.

The minimized and modified testcase is _mulhi3.i.

You'll be able to reproduce this on a 64bit. If you have a 32bit you might
reproduce it without any changes but you can also try (but it is untested) the
substitutions s/DI/SI and s/TI/DI.

Run the line:
<pathtogccbuild>/cc1 -O2 _muldi3.i

I have seen two behaviours... either you get a segmentation fault or an
infinite loop that will eat all your memory if you don't limit it.

In the meantime I am trying to sort out what the problem is.

Reply via email to