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

            Bug ID: 82689
           Summary: merging writes of different types to the same location
           Product: gcc
           Version: 7.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vanyacpp at gmail dot com
  Target Milestone: ---

Consider the following code:

#include <cstdint>

union x
{
    std::int64_t a;
    std::uint64_t b;
};

void f(x& xx, bool flag, std::int64_t value)
{
    if (flag)
        xx.a = value;
    else
        xx.b = value;
}

The function f is written with standard compliance in mind so it tries to write
only that member that will be lately used/read.

The hope is that the compiler is able to optimize the redundant if.

And most compilers (clang, MSVC, icc) are able to optimize this function to a
single store instruction.

GCC optimized it to a single store (to some extend). Here what it generated:

f:
  test sil, sil
  mov QWORD PTR [rdi], rdx
  jne .L5
  rep ret
.L5:
  rep ret

The expected behavior is that the function is optimized to a single store by
GCC too.

Reply via email to