https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99357
Bug ID: 99357
Summary: Missed Dead Code Elimination Opportunity
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: theodoridisgr at gmail dot com
Target Milestone: ---
Compiling the following code with -O3 -S
static int a = 0;
extern void bar(void);
int main() {
if (a)
bar();
a = 0;
return 0;
}
results in the following asm:
main:
.LFB0:
.cfi_startproc
movl a(%rip), %ecx
testl %ecx, %ecx
jne .L8
movl $0, a(%rip)
xorl %eax, %eax
ret
.L8:
pushq %rax
.cfi_def_cfa_offset 16
call bar
xorl %eax, %eax
movl $0, a(%rip)
popq %rdx
.cfi_def_cfa_offset 8
ret
.cfi_endproc
Even though the branch calling bar is never executed, code for it is still
generated. If the a=0 assignment is removed, then the generated code is
simplified to:
main:
.LFB0:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
gcc -v:
Using built-in specs.
Target: x86_64-pc-linux-gnu
Configured with: ../gcc_source/configure
Thread model: posix
gcc version 11.0.1 20210302 (experimental) (GCC)