https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120425
Bug ID: 120425
Summary: GCC-compiled with -O{1,2,s,3} program got segfault
from GCC 12.1
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: congli at smail dot nju.edu.cn
Target Milestone: ---
Starting with GCC version 12.1, compiling the following t.c using optimization
flags -O1, -O2, -Os, or -O3 results in a segmentation fault at runtime.
```
$ cat t.c
unsigned a[] = {
0, 4, 8, 4, 124634137, 5,
5, 5, 249268274, 2044508324, 0, 4,
5, 1, 3887607047, 2428444049, 8, 1789927666,
4089016648, 4, 50548861, 3, 107580753, 2211677639,
0, 2, 4251122042, 2321926636, 7, 5,
5, 7, 7073096, 6, 2, 2,
1006888145, 607687, 101629, 3, 901097722, 1119000684,
6, 8065728, 1, 1, 705015759, 5,
651767980, 6, 4, 104598, 565507253, 1,
3485111705, 3099436303, 4, 1594198024, 30930, 70347812,
795835527, 1483230225, 5, 3060149565, 2, 4,
2563907772, 4023717930, 907459465, 112637215, 3, 904427059,
2013776290, 6, 4, 3775830040, 3, 3,
9, 7, 802195444, 6, 8001368, 4066508878,
70925, 3092731, 2181625025, 3, 706088902, 4,
2344532202, 2, 1, 366619977, 3, 5,
1303535960, 6, 7007092, 3569037538, 70817, 1,
3, 3554079995, 6, 6, 2909243462, 6,
7, 7, 1, 708648649, 8, 654459306,
6048, 4, 1466479909, 544179635, 10523913, 5,
4, 702138776, 0, 2, 504918807, 783551873,
3082640443, 9, 4, 2596254646, 7068, 1957810842,
5, 2647816111, 70997, 1943803523, 0, 4,
0, 2053790376, 3826175755, 3, 3, 2097651377,
4027552580, 2265490386, 2, 1762050814, 5, 5,
5, 1852507879, 6, 0, 6, 2,
708143, 5, 397917763, 7, 604390888, 8,
953729732, 6, 3518719985, 60999, 1068828381, 9,
0, 8, 906185462, 1090812512, 3747672003, 9,
5, 1, 4, 60834842, 628085408, 1382605366,
3423369109, 8078467, 570562233, 400815, 3317316542, 608,
4, 1555261956, 1, 5, 3, 1541320221,
607071920, 0, 2, 40735498, 2617837225, 1,
3087877, 83908371, 4, 803740692, 2075208622, 213261112,
3, 90285, 2094854071, 1, 2029012, 0,
2, 0, 1, 5, 1873836001, 7,
4, 200368, 4, 6, 2405801727, 5,
5, 1, 5067896, 608007406, 1308918612, 8,
808555105, 3495958263, 1, 5, 8, 3654703836,
1088359270, 0, 9, 9, 202900863, 7,
108, 0, 1404277552, 0, 207493, 3453421203,
1423857449, 1, 3009837614, 3294710456, 1567103746, 711928724,
3020668471, 3272380065, 5, 755167117};
int b, c[] = {1911263494, 774465782, 4379194, 669572660, -1452495846,
-1658729425, 1103267782, -90393310, 1635864740, -1,
-1238002948, -351663323, -576056573, 1233623753, -1844776976,
-1531764644, -319456054, 1797911602, -684072473, -1155699931};
int h(int i) {
unsigned e = 4294967295;
for (int d = 0; d < i; ++d) {
e = e >> 8 ^ a[(e ^ c[d]) & 255];
e = e >> 8 ^ a[(e ^ c[d] >> 8) & 255];
e = e >> 8 ^ a[(e ^ c[d] >> 16) & 255];
e = e >> 8 ^ a[(e ^ c[d] >> 24) & 255];
}
e = e ^ 4294967295;
return e;
}
int main() {
int f = 987751161, g = -1211051206;
goto aq;
g:
f = -b + g - 1767812960;
aq:
b = -f;
if ((h(20) + 1788482227) * b >= 0)
return 0;
while (h(0))
__builtin_abort();
goto g;
}
$ gcc -O1 t.c
$ ./a.out # <-- segfault
```
See also Compiler Explore: https://godbolt.org/z/5v4dq5M7M