https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95643
Bug ID: 95643 Summary: Optimizer fails to realize that a variable tested twice in a row is the same both times Product: gcc Version: 10.1.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: josephcsible at gmail dot com Target Milestone: --- Consider this code, compiled at -O3: extern int e; void f(int x, int y) { if(y) { if(y && !x) __builtin_unreachable(); if(x) ++e; } } GCC 10.1 on AMD64 produces the following assembly: f: testl %edi, %edi je .L1 testl %esi, %esi jne .L10 .L1: ret .L10: addl $1, e(%rip) ret Godbolt link: https://godbolt.org/z/Z75QTM The "y" in "if(y && !x)" is necessarily true, but GCC doesn't realize this, since changing "if(y && !x)" to the equivalent "if(!x)" results in much better assembly: f: testl %esi, %esi je .L1 addl $1, e(%rip) .L1: ret We should be able to generate this assembly even with the redundant check of "y".