https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95971
Bug ID: 95971 Summary: [10 regression] Optimizer converts a false boolean value into a true boolean value Product: gcc Version: 10.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: other Assignee: unassigned at gcc dot gnu.org Reporter: 0xe2.0x9a.0x9b at gmail dot com Target Milestone: --- Hello. I have found an optimization issue that is triggered by the -O2 optimization option in GCC 10.1.0. The source code (see below) contains an infinite while(cond){} loop. The loop condition is expected to always evaluate to true. The optimizer incorrectly derives that the loop condition evaluates to false and removes the loop. It is possible that the issue is related to optimizations of the delete operator in C++. Reproducibility: g++ 10.1.0 -O0: not reproducible g++ 10.1.0 -O1: not reproducible g++ 10.1.0 -O2: REPRODUCIBLE g++ 10.1.0 -O3: not reproducible g++ 9.3.0 -O2: not reproducible clang++ 10 -O2: not reproducible Full source code: $ cat a.cc void xbool(bool value); struct A { char *a = (char*)1; ~A() { delete a; } bool isZero() { return a == (void*)0; } }; int main() { A a; xbool(a.isZero()); while(!a.isZero()); xbool(a.isZero()); // This line isn't required to trigger the issue return 0; } $ cat b.cc void xbool(bool value) {} $ cat Makefile test: g++ -c -O2 a.cc g++ -c b.cc g++ -o a a.o b.o time ./a Dump of assembler code for function main: push %rbp xor %edi,%edi // %rdi := false sub $0x10,%rsp movq $0x1,0x8(%rsp) callq xbool(bool) mov $0x1,%edi // %rdi := true callq xbool(bool) lea 0x8(%rsp),%rdi callq A::~A() add $0x10,%rsp xor %eax,%eax pop %rbp retq mov %rax,%rbp jmpq main.cold In the assembler code: The compiler correctly passes zero (false) in the 1st call to function xbool(bool), then incorrectly passes one (true) in the 2nd call to function xbool(bool). The source code initializes A::a to (char*)1 in order to keep the code as small as possible to trigger the issue. A::a could have been initialized to a valid delete-able heap address, but this would unnecessarily enlarge the source code. The GCC version string on my machine is "g++ (Gentoo 10.1.0-r1 p2) 10.1.0". Please confirm the reproducibility of this issue.