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

            Bug ID: 124659
           Summary: Potential misoptimization involving __m128i pointer
                    aliasing under -O2
           Product: gcc
           Version: 15.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: 522024330006 at smail dot nju.edu.cn
  Target Milestone: ---

Compiler explorer:https://godbolt.org/z/ehGc3e4jE

Program:
```c
#include <immintrin.h>
#include <stdio.h>

int main() {
    int i;

    __m128i vec = _mm_set_epi32(0, 1, 2, 3);

    for (i = 0; i < 4; ++i) {
        printf("%d", i);
        int x = ((int*)&vec)[i];

        if (x != i)
            break;
    }

    return 0;
}
```
Results:
-O0 output: 0 (Immediately breaks because x is 3)
-O2 output: 01 (Breaks at i=2)

When accessing elements of an SSE vector (__m128i) via an int* cast, GCC
produces different results between -O0 and -O2. While I understand this may
touch upon Strict Aliasing rules, the -O2 output is particularly
counter-intuitive regarding the expected little-endian memory layout.

Reply via email to