https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81403
Bug ID: 81403 Summary: wrong code at -O3 Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: babokin at gmail dot com Target Milestone: --- gcc rev250140, x86_64. > cat f.cpp #include <iostream> short var_9 = 19581; unsigned char var_33 = 21; long int var_55 = 286697804684061197L; long int var_59 = -1962393262513510540L; long int var_71 = 4731868609112929952L; long int var_773 = -4784633456247777769L; short var_776 = 5894; long int var_1321 = 7573221950916697355L; unsigned char uc = 217; void foo() { if (var_55) var_71 = 0; if (var_9 != ~(0 < uc)) var_773 = 0; else var_776 = 1 / ~var_9 * -1; if (var_33) var_59 = ~var_9 & 10393; var_1321 = ~var_9; } int main() { foo(); std::cout << "var_59 = " << var_59 << " (8320 expected)\n"; return 0; } > g++ -w -O3 -o out f.cpp; ./out var_59 = -19582 (8320 expected) > g++ -w -O2 -o out f.cpp; ./out var_59 = 8320 (8320 expected) > g++ -w -O0 -o out f.cpp; ./out var_59 = 8320 (8320 expected)