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

            Bug ID: 86699
           Summary: Memory load optimization (-O2) bug
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nikita.o.p at yandex dot ru
  Target Milestone: ---

Created attachment 44451
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44451&action=edit
Memory ordering load bug

The bug is related to some internal code structure, so tried to reproduce the
situation as close as possible. mingw with -O2 optimization flag loads
memset-ed value on the first load of atomic (just struct name) value read and
initialized value (right value) at the second load call.

Reproducer is attached.

Fixes: 
* Removing volatile keyword 
* Changing int32_t to unsigned long 
* Other reduction of code complexity 
What is wrong with this code? Is it a bug? GCC7 does not have this issue.

I tried to open a bug on MinGW tracker, but they said, that this place is more
relevant.

Output:
Expected:0 Value first: 4294967295
Expected:0 Value second: 0

Environment:

Windows Server 2016

gcc -v Using built-in specs. COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=d:/mingwcompilers/mingw_15.4_gcc_7.3.0/bin/../libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32 Configured with: ../src/configure
--enable-languages=c,c++ --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32
--target=x86_64-w64-mingw32 --disable-multilib --prefix=/c/temp/gcc/dest
--with-sysroot=/c/temp/gcc/dest --disable-libstdcxx-pch
--disable-libstdcxx-verbose --disable-nls --disable-shared
--disable-win32-registry --with-tune=haswell --enable-threads=posix
--enable-libgomp Thread model: posix gcc version 7.3.0 (GCC)

ld -v GNU ld (GNU Binutils) 2.29.1

Reply via email to