https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110891
Bug ID: 110891 Summary: [14 Regression] Dead Code Elimination Regression since r14-2674-gd0de3bf9175 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: --- https://godbolt.org/z/njdE3xof4 Given the following code: void foo(void); static int a, c = 7, d, o, q; static int *b = &a, *f, *j = &d, *n = &c, *ae; static short e, m; static short *i = &e; static char r; void __assert_fail(char *, char *, int, char *) __attribute__((__noreturn__)); static const short g(); static void h(); static int *k(int) { (*i)++; *j ^= *b; return &a; } static void l(unsigned p) { int *aa = &o; h(); o = 5 ^ g() && p; if (f == &d || f == &c || f == &a) ; else { foo(); __assert_fail("", "", 3, __PRETTY_FUNCTION__); } *aa ^= *n; if (*aa) if (!(((p) >= 0) && ((p) <= 0))) { __builtin_unreachable(); } k(p); } static const short g() { return q; } static void h() { unsigned ag = c; d = ag > r ? ag : 0; ae = k(c); f = ae; if (ae == &d || ae == &c || ae == &a) ; else __assert_fail("", "", 4, __PRETTY_FUNCTION__); } int main() { l(a); m || (*b |= 64); *b &= 5; } gcc-trunk -O2 does not eliminate the call to foo: main: subq $8, %rsp movl c(%rip), %eax movl %eax, d(%rip) call k.isra.0 cmpq $c, %rax movq %rax, f(%rip) sete %cl cmpq $a, %rax sete %dil cmpq $d, %rax sete %dl orb %cl, %dl jne .L4 testb %dil, %dil je .L15 .L4: cmpq $d, %rax je .L6 testb %cl, %cl jne .L6 testb %dil, %dil je .L16 .L6: call k.isra.0 andl $5, a(%rip) xorl %eax, %eax addq $8, %rsp ret .L16: call foo movl $.LC0, %esi movl $__PRETTY_FUNCTION__.1, %ecx movl $3, %edx movq %rsi, %rdi call __assert_fail .L15: movl $.LC0, %esi movl $__PRETTY_FUNCTION__.0, %ecx movl $4, %edx movq %rsi, %rdi call __assert_fail gcc-13.2.0 -O2 eliminates the call to foo: main: subq $8, %rsp movl c(%rip), %eax movl %eax, d(%rip) call k.isra.0 cmpq $c, %rax movq %rax, f(%rip) sete %dl cmpq $d, %rax sete %cl orb %cl, %dl jne .L4 cmpq $a, %rax jne .L6 .L4: call k.isra.0 andl $5, a(%rip) xorl %eax, %eax addq $8, %rsp ret .L6: movl $.LC0, %esi movl $__PRETTY_FUNCTION__.0, %ecx movl $4, %edx movq %rsi, %rdi call __assert_fail Bisects to r14-2674-gd0de3bf9175