https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86638

--- Comment #1 from Tom de Vries <vries at gcc dot gnu.org> ---
F.i., take pr56154-1.c:
...
     1  /* PR debug/56154 */
     2  /* { dg-do run } */
     3  /* { dg-options "-g" } */
     4  /* { dg-additional-sources "pr56154-aux.c" } */
     5
     6  #include "../nop.h"
     7
     8  union U { int a, b; };
     9  volatile int z;
    10
    11  __attribute__((noinline, noclone)) int
    12  foo (int fd, union U x)
    13  {
    14    int result = x.a != 0;
    15    if (fd != 0)
    16      result = x.a == 0;
    17    asm (NOP : : : "memory");  /* { dg-final { gdb-test pr56154-1.c:17
"x.a" "4" } } */
    18    z = x.a;
    19    x.a = 6;
    20    asm (NOP : : : "memory");  /* { dg-final { gdb-test pr56154-1.c:20
"x.a" "6" } } */
    21    return result;
    22  }
    23
    24  void
    25  test_main (void)
    26  {
    27    union U u = { .a = 4 };
    28    foo (0, u);
    29  }
...

which fails like this:
...
FAIL: gcc.dg/guality/pr56154-1.c -Og -DPREVENT_OPTIMIZATION  line
pr56154-1.c:20 x.a == 6
...

Without -ftree-sra, we have:
...
$ grep DEBUG pr56154-1.c.228t.optimized | grep -v BEGIN_STMT
  # DEBUG result => result_7
  # DEBUG result => result_9
  # DEBUG result => result_5
...

and with -ftree-sra, we have:
...
$ grep DEBUG pr56154-1.c.228t.optimized | grep -v BEGIN_STMT
  # DEBUG x$a => x$a_11
  # DEBUG result => result_5
  # DEBUG result => result_7
  # DEBUG result => result_3
  # DEBUG x$a => 6
...

In general, we might be able to improve the situation by emitting var_location
at expand for non-ssa vars that we emit in registers.

But in this case it won't help us, because the store of 6 to x.a is already
removed by dce by the time we arrive at expand.

Using the fkeep-vars-live patch, we manage to prevent the dce, and are able to
print the '6' value of x one line later, at line 21, but not at line 20, due to
a "DEBUG x RESET".

AFAIU, the var-tracking manages to deduce from the artificial use inserted by
fkeep-vars-live that x is in reg si at ret, but it can't deduce that the store
of 6 into reg si is also related to x.
...
        .loc 1 19 3 is_stmt 1
        .loc 1 19 7 is_stmt 0
        movl    $6, %esi
.LVL4:
        # DEBUG x RESET
        .loc 1 20 3 is_stmt 1
        nop
        .loc 1 21 3
.LVL5:
        # DEBUG x => si
        .loc 1 22 1 is_stmt 0
        ret
...
But, if we'd insert the var_location of x at expand (maybe after every assign
to x), we could deduce that the store of 6 is related to x, and we'd be able to
print the value of x at line 20.

Reply via email to