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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-02-28
     Ever confirmed|0                           |1

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I can reproduce it also with simplified:
struct A { int a; };
struct B { struct A *b; };
struct C { struct B *c; };

__attribute__((noipa)) bool
foo (struct A *p)
{
  asm volatile ("" : : "r" (p) : "memory");
  return false;
}

__attribute__((noipa)) bool
bar (struct A *p, void *q)
{
  asm volatile ("" : : "r" (p), "r" (q) : "memory");
  return false;
}

__attribute__((noipa)) int
baz (int x)
{
  asm volatile ("" : : "r" (x) : "memory");
  return 0;
}

__attribute__((noipa)) void
qux (struct C *p)
{
  struct A *a;
  bool b;
  int c;

  if (!p->c) __builtin_abort ();
  a = p->c->b;

  b = (a->a == 4)
        && (foo (a)
            || bar (a, 0));

  c = baz (0);
  baz (b);
}

int
main ()
{
  struct A a = { 4 };
  struct B b = { &a };
  struct C c = { &b };
  qux (&c);
  return 0;
}

compiled with -g -O2 by trunk gcc on x86_64-linux.  If I do
b qux
r
s
s
s
then I get:
(gdb) b qux
Breakpoint 1 at 0x400440: qux. (2 locations)
(gdb) r
Starting program: /home/jakub/src/gcc/obj08/gcc/vau 
Missing separate debuginfos, use: dnf debuginfo-install
glibc-2.26-24.fc27.x86_64

Breakpoint 1, qux(C*) () at vau.c:33
33        if (!p->c) __builtin_abort ();
Missing separate debuginfos, use: dnf debuginfo-install
libgcc-7.3.1-2.fc27.x86_64
(gdb) s
34        a = p->c->b;
(gdb) s
36        b = (a->a == 4)
(gdb) s
[Inferior 1 (process 25359) exited normally]

Reply via email to