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

            Bug ID: 73434
           Summary: [6 Regression] Wrong code with casting, branches and
                    aliasing
           Product: gcc
           Version: 6.1.1
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gcc at thecybershadow dot net
  Target Milestone: ---

/////////////////// test.c //////////////////
#include <assert.h>

typedef struct { unsigned char x; } A;
typedef struct { unsigned char x; } B;

int idx = 0;

A objs[1] = {{0}};

int main()
{
    B *b = (B*)&objs[idx];
    b->x++;
    if (b->x)      // Always true
        b->x = 0;  // Always executed
    assert(!b->x); // b->x should always be 0
    return 0;
}
/////////////////////////////////////////////

Works fine with:

gcc -O1
gcc -O2 -fno-strict-aliasing

Assert fails with:

gcc -O2
gcc -O1 -fstrict-aliasing

Even though -fno-strict-aliasing makes a difference, the variable is accessed
through a single pointer.

Reproducible with:
- 6.1.0 on i686-w64-mingw32 from msys2
- 6.1.1 on x86_64-pc-linux-gnu from Arch Linux
- 6.1.1 on arm-linux-gnueabihf from ppa:ubuntu-toolchain-r/test

Not reproducible with 5.4.0.

Reply via email to