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