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.