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

            Bug ID: 64755
           Summary: Error in optimization with std::array
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nubcrack at yahoo dot es

Created attachment 34556
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34556&action=edit
They are 3 files bug.cpp (contain the code to compile), bug.O1 and bug.O2
(contain the assembly code generated by g++) witch return 0 in O1 or -1 in O2..

The code provide access to emulated registers of x86:

-class basic_reg represent an x86 register. Could be registers that have access
to higher and lower part (ex: eax -> _,ax -> ah,al). Or registers that don't
need this access (ex: al, ah).
-class basic_registers represent a container of basic_reg (ex: 8 general
purpose registers in x86).
-class basic_registry_wrapper contain the address of the registers of size
16bits or 32bits of the container in class basic_registers and provide easy
access to specific register (ex: eax).

The code in main is a piece of unit test, trying to test that when registers
are modified by basic_registry_wrapper and accessed by basic_registers the
value accessed is the same (even if different parts of the registers are
request or set. Setting AX need to modify the lower part of EAX.

In the attach files .O1 (generated with g++ -S -O1 -o .O1 .cpp) return 0 (no
error) as expected and the .O2 (generated with g++ -S -O2 -o .O2 .cpp) return
-1 (error).

In the two assembly output the code is optimized away completely. When the
default constructor of basic_registers (line "basic_registers() :
m_registers{0} {}") is removed the code work in O1, O2 and O3.

Reply via email to