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



             Bug #: 54693

           Summary: VTA guality issues with loops

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: debug

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: ja...@gcc.gnu.org

                CC: aol...@gcc.gnu.org





Something that has been reported privately to me - gcc -g -O2:

__attribute__((noinline, noclone)) void

foo (char *str, char c)

{

  asm volatile ("" : : "r" (str), "r" (c) : "memory");

  *str = c;

}



int

main ()

{

  int i;

  char c;

  char arr[11];



  for (i = 0; i < 10; i++)

    {

      c = 0x30 + i;

      foo (&arr[i], c);

    }



  __builtin_printf ("arr = %s\n", arr);

  return 0;

}



In 4.7.x the c variable in main is available in the whole loop (just not in the

prologue, but that is kind of expected when it is not initialized there), but

the i variable is available only in the prologue (0, correctly) and very short

part of the loop.  In 4.8.0

http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=185129

change made it even worse, the ivopts pass changes there the debug insns for i

to point to D#2 which is initialized to NULL right away.



As for the problem common to 4.7.x and 4.8.0, I think the issue is that vrp1

transforms:

  <bb 2>:

  # DEBUG i => 0

  goto <bb 4>;



  <bb 3>:

...

  # DEBUG i => i_10



  <bb 4>:

  # i_1 = PHI <0(2), i_10(3)>

  # DEBUG i => i_1

  if (i_1 <= 9)

    goto <bb 3>;

  else

    goto <bb 5>;

into:

  <bb 2>:

  # DEBUG i => 0

  goto <bb 6>;



  <bb 3>:

  # i_16 = PHI <i_1(4), i_14(6)>

...

  # DEBUG i => i_10



  <bb 4>:

  # i_1 = PHI <i_10(3)>

  # DEBUG i => i_1

  if (i_1 != 10)

    goto <bb 3>;

  else

    goto <bb 5>;

...

  <bb 6>:

  # i_14 = PHI <0(2)>

  # DEBUG i => i_14

  goto <bb 3>;



(still fine), but the debug insn no longer references the PHI), then dce1 comes

in, and I guess in some cfg cleanup makes this into:

  <bb 2>:

  # DEBUG i => 0

  # DEBUG i => 0



  <bb 3>:

  # i_16 = PHI <i_10(3), 0(2)>

...

  # DEBUG i => i_10

  # DEBUG i => i_10

  if (i_10 != 10)

    goto <bb 3>;

  else

    goto <bb 4>;



Note, in neither case ... contains any # DEBUG i => something stmts.

The problem with this is that vrp together with dce transformations effectively

moved the almost the end of the bb only, it is no longer at the start of the

loop where it used to be before the transformations.  Would be nice if we could

figure out that for the two blocks we have DEBUG stmts that refer to

corresponding PHI arguments (i_16 above) and that we should insert

  # DEBUG i => i_16

at the start of bb 3, because previously if going from bb 2 there is # DEBUG i

=> 0 and if going from bb 3 there is # DEBUG i => i_10.



Alex, what do you think?  As for IVOPTS, haven't looked at that at all yet.

Reply via email to