https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113265

            Bug ID: 113265
           Summary: [Regression] Missed optimization for redundancy
                    computation elimination may be due to constant
                    propagation about 0 too late
           Product: gcc
           Version: 14.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, we noticed that maybe there is a missed optimization for redundancy
computation elimination.

https://godbolt.org/z/drfejE5cP

int x,y,z;
void func(int a, int b){
    a=b-x;
    b=a;
    y=0;
    z=(y+a)/(-b);
}

GCC -O3 :
func(int, int):
        mov     ecx, DWORD PTR x[rip]
        mov     eax, esi
        mov     DWORD PTR y[rip], 0
        sub     eax, ecx
        sub     ecx, esi
        cdq
        idiv    ecx
        mov     DWORD PTR z[rip], eax
        ret

Earlier GCC versions get the expected optimizations:
Expected code (GCC 7.5):
func(int, int):
        mov     DWORD PTR y[rip], 0
        mov     DWORD PTR z[rip], -1
        ret

The following code is optimized by gcc as expected:
void func2(int a, int b){
    a=b-x;
    b=a;
    y=0;
    z=(0+a)/(-b);
}

Comparing the code for func and func2 and their ccp1(tree), we suspect that
this issue may be caused by too late propagation about y=0.

Thank you very much for your time and effort! We look forward to hearing from
you

Reply via email to