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)
  • [Bug c/106380] New: DCE depend... tmayerl at student dot ethz.ch via Gcc-bugs

Reply via email to