https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109943
Bug ID: 109943
Summary: [13/14 Regression] Missed Dead Code Elimination when
using __builtin_unreachable since
r13-6834-g41ade3399bd
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: theodort at inf dot ethz.ch
Target Milestone: ---
void foo(void);
static int b = 5;
static int *c = &b;
static char(a)(char d, char g) {
;
return d % g;
}
static void e(unsigned char d, unsigned g) {
char h = a(g, d);
if (h)
if ((d) >= 0) {
foo();
};
}
static void f(int d) { e(b, d); }
int main() {
f(*c);
*c = 0;
}
gcc-trunk -O3 generates:
main:
movl $0, b(%rip)
xorl %eax, %eax
ret
However, including additional info via __builtin_unreachable results to worse
code:
void foo(void);
static int b = 5;
static int *c = &b;
static char(a)(char d, char g) {
if ((g) <= 0) {
__builtin_unreachable();
}
return d % g;
}
static void e(unsigned char d, unsigned g) {
char h = a(g, d);
if (h)
if ((d) >= 0) {
foo();
};
}
static void f(int d) { e(b, d); }
int main() {
f(*c);
*c = 0;
}
gcc-trunk (and 13) -O3 generates:
main:
movl b(%rip), %ecx
movsbl %cl, %eax
movzbl %cl, %ecx
cltd
idivl %ecx
testl %edx, %edx
jne .L11
movl $0, b(%rip)
xorl %eax, %eax
ret
.L11:
pushq %rax
call foo
xorl %edx, %edx
xorl %eax, %eax
movl %edx, b(%rip)
popq %rcx
ret
https://godbolt.org/z/n34Tsr3vq
gcc-12 can generate optimized code for both cases
Started with r13-6834-g41ade3399bd