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

Reply via email to