[Bug middle-end/72795] New: Missed optimization of external-linkage variables in presence of barriers

ahmad at a3f dot at gcc-bugzilla@gcc.gnu.org
Wed Aug 3 16:58:00 GMT 2016


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

            Bug ID: 72795
           Summary: Missed optimization of external-linkage variables in
                    presence of barriers
           Product: gcc
           Version: 6.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ahmad at a3f dot at
  Target Milestone: ---

Godbolt link: https://godbolt.org/g/egb73f

         int x;
  static int y;

  int f() {     x = 1; asm volatile("":::"memory"); x = 2; return x; }
  int g() {     y = 1; asm volatile("":::"memory"); y = 2; return y; }
  int h() { int z = 1; asm volatile("":::"memory"); z = 2; return z; }

on GCC 6.1 with -O2 for AMD64 generates following assembly:

  f():
        movl    $1, x(%rip)
        movl    $2, x(%rip)
        movl    $2, %eax
        ret
  g():
        movl    $2, %eax
        ret
  h():
        movl    $2, %eax
        ret

The question is: Was optimizing the non-volatile write in g() and h() the
intended behavior?
And if so, shouldn't same optimization be applied when the variable is of
external linkage (f)?

Replacing the compiler barrier with a full memory barrier gives same behavior.


I also tried same with clang and icc. Clang does as GCC does, icc doesn't
optimize g(), but optimizes h().


More information about the Gcc-bugs mailing list