https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123456
Bug ID: 123456
Summary: missed optimization for redundant branches
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: 652023330028 at smail dot nju.edu.cn
Target Milestone: ---
Hello,
For the reduced test case below, GCC -O3 appears to generate some redundant
control-flow checks.
Reduced code (from ABC project
https://github.com/berkeley-abc/abc/blob/64637b8395a94aa68e67b211d4ecc21840accde1/src/opt/dsc/dsc.c#L311):
https://godbolt.org/z/Md7W9Wq1a
static long b[4];
int e(int);
int j(int l, long *m) {
int n = (l <= 4 ? 1 : 1 << l);
for (int i = 0; i < l; i++) {
if (n == 1) m[0] = b[i];
e(n);
}
return 1;
}
Optimized code of GCC -O3:
```
<bb 2> [local count: 214748368]:
if (l_6(D) > 4)
goto <bb 3>; [50.00%]
else
goto <bb 6>; [50.00%]
<bb 3> [local count: 107374184]:
if (l_6(D) == 0) #redundant
...
if (l_6(D) == 4)
goto <bb 11>; [70.25%]
else
goto <bb 13>; [29.75%]
<bb 11> [local count: 29906718]:
*m_9(D) = 0;
e (1);
if (l_6(D) != 4) #redundant
```
Redundant code produced in the generated assembly:
cmp ebx, 4
je .L6
mov QWORD PTR [rsp+16], r12
mov r12d, 4
.L8:
mov QWORD PTR [rbp+0], 0
mov edi, 1
add r12d, 1
call "e"
cmp ebx, r12d
jne .L8
mov r12, QWORD PTR [rsp+16]
GCC -O3:
"j":
sub rsp, 24
mov QWORD PTR [rsp], rbx
mov ebx, edi
mov QWORD PTR [rsp+8], rbp
mov rbp, rsi
cmp edi, 4
jle .L2
test edi, edi
je .L3a
mov ecx, edi
mov ebp, 1
mov QWORD PTR [rsp+16], r12
mov r12d, 4
sal ebp, cl
mov edi, ebp
call "e"
mov edi, ebp
call "e"
mov edi, ebp
call "e"
mov edi, ebp
call "e"
.L4:
mov edi, ebp
add r12d, 1
call "e"
cmp ebx, r12d
jne .L4
mov r12, QWORD PTR [rsp+16]
.L6:
mov rbx, QWORD PTR [rsp]
mov rbp, QWORD PTR [rsp+8]
mov eax, 1
add rsp, 24
ret
.L2:
test edi, edi
jle .L6
mov QWORD PTR [rsi], 0
mov edi, 1
call "e"
cmp ebx, 1
je .L6
mov QWORD PTR [rbp+0], 0
mov edi, 1
call "e"
cmp ebx, 2
je .L6
mov QWORD PTR [rbp+0], 0
mov edi, 1
call "e"
cmp ebx, 4
jne .L6
.L5:
mov QWORD PTR [rbp+0], 0
mov edi, 1
call "e"
cmp ebx, 4
je .L6
mov QWORD PTR [rsp+16], r12
mov r12d, 4
.L8:
mov QWORD PTR [rbp+0], 0
mov edi, 1
add r12d, 1
call "e"
cmp ebx, r12d
jne .L8
mov r12, QWORD PTR [rsp+16]
jmp .L6
.L3:
mov QWORD PTR [rsi], 0
mov edi, 1
call "e"
mov QWORD PTR [rbp+0], 0
mov edi, 1
call "e"
mov QWORD PTR [rbp+0], 0
mov edi, 1
call "e"
jmp .L5