https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106380
Bug ID: 106380 Summary: DCE depends on datatype used (bool vs unsigned) 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 datatype used (bool vs unsigned). 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 s, bool c) { if (((!s == !c) && c && !(s))) { DCEMarker0_(); } } In the following snippet the datatype is switched to unsigned (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(unsigned s, unsigned c) { if (((!s == !c) && c && !(s))) { DCEMarker0_(); } } This can also be seen via the following Compiler Explorer link: https://godbolt.org/z/aMcEvEaYa (Might be related to 106379)