This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Hopelessly broken loop_father, loop_depth


On Sun, Aug 12, 2012 at 2:02 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Sat, Aug 11, 2012 at 11:16 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
>> Lots of test cases fail with the attached patch.
>
> Lots still fail after correcting the verifier :-)
>
> 920723-1.c: In function 'f':
> 920723-1.c:14:1: error: bb 13 has loop depth 2, should be 1
>  f (int count, vector_t * pos, double r, double *rho)
>  ^
> 920723-1.c:14:1: error: bb 14 has loop depth 2, should be 1
> 920723-1.c:14:1: internal compiler error: in verify_loop_structure, at
> cfgloop.c:1598

That's a pre-existing bug in unswitching.  When unswitching
simplifies the condition it unswitches on using simplify_using_entry_checks
it may turn an inner loop into an exit to an endless loop.  But it does
not modify the loop stucture according to this change.

void foo (int x, int r)
{
loop4:
  if (r >= x)
    {
      goto loop4_latch;
    }
  else
    {
loop5:
      if (r >= x)
        goto loop4_latch;
      goto loop5;
    }
loop4_latch:
  goto loop4;
}

simplified testcase that even fails at -O1.  We mostly rely on cfg-cleanup
to fixup loops for us, so this is one case it does not handle properly.

The quest of keeping loops up-to-date is hard ... but thanks for the checking
code ;)

Richard.

> Ciao!
> Steven


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]