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)