https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106379
Bug ID: 106379 Summary: DCE depends on order Product: gcc Version: 12.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: tmayerl at student dot ethz.ch Target Milestone: --- In some cases, the compiler's ability to eliminate dead code depends on the order of the sub-expressions within the if. GCC detects that the if expression in the following code snippet evaluates to false and thus removes the dead code: #include <stdio.h> #include <stdbool.h> static void __attribute__ ((noinline)) DCEMarker0_() {printf("DCE2.0");} void f(bool c, bool s) { if (((!c == !s) && !(c) && s)) { DCEMarker0_(); } } In the following snippet the expressions are swapped (the semantics stay the same). However, GCC cannot eliminate the dead code anymore: #include <stdio.h> #include <stdbool.h> static void __attribute__ ((noinline)) DCEMarker0_() {printf("DCE2.0");} void f(bool c, bool s) { if ((!s == !c) && s && !(c)) { DCEMarker0_(); } } This can also be seen via the following Compiler Explorer link: https://godbolt.org/z/vTqhc46qY