https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118097
--- Comment #1 from David Binderman <dcb314 at hotmail dot com> ---
Reduced C code:
void printf(...);
int crc32_tab[256];
int crc32_context = 4294967295, g_27, g_64, g_90 = 3, func_2___trans_tmp_4,
main_i, main_j;
int *g_26 = &g_27;
char g_76 = 232;
void crc32_byte(char b) {
crc32_context =
crc32_context >> 8 & 16777215 ^ crc32_tab[(crc32_context ^ b) & 255];
}
void transparent_crc(long val, char *vname) {
crc32_context =
crc32_context >> 8 & 16777215 ^ crc32_tab[(crc32_context ^ val) & 255];
crc32_byte(val >> 8);
crc32_byte(val >> 6);
crc32_byte(val >> 24);
crc32_byte(val >> 32);
crc32_byte(val >> 40);
crc32_byte(val >> 8);
crc32_byte(val >> 6);
printf("...checksum after hashing %s : %lX\n", vname,
crc32_context ^ 4294967295);
}
void func_2(int *) {
long __trans_tmp_5;
int *l_1710 = &g_90;
func_2___trans_tmp_4 = 7 - (__trans_tmp_5 >= g_90) - 33;
*l_1710 = func_2___trans_tmp_4 |= 1;
}
void func_1() {
int __trans_tmp_1;
*g_26 = 4294967288;
func_2(&__trans_tmp_1);
}
void main(int) {
for (; main_i < 256; main_i++) {
unsigned crc = main_i;
main_j = 8;
for (; main_j; main_j--)
if (crc & 1)
crc = crc >> 1 ^ 3988292384;
else
crc >>= 1;
crc32_tab[main_i] = crc;
}
func_1();
transparent_crc(g_27, "");
transparent_crc(g_64, "");
transparent_crc(g_76, "");
transparent_crc(3, "");
transparent_crc(g_90, "g_90");
}
I had a go at trying to find the one flag in -O2 that caused this
bug and got nowhere.
I think that multiple flags in -O2 (but not -O1) are causing the problem.