[Bug target/95078] New: Missing fwprop for SIB address

crazylht at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue May 12 09:18:49 GMT 2020


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

            Bug ID: 95078
           Summary: Missing fwprop for SIB address
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: crazylht at gmail dot com
                CC: hjl.tools at gmail dot com
  Target Milestone: ---
            Target: i386, x86-64

cat test.c

int foo (int* p1, int* p2, int scale)
{
    int ret = *(p1 + scale * 4 + 11);
    *p2 = 3;
    int ret2 = *(p1 + scale * 4 + 11);
    return ret + ret2;
}

gcc11 -O2 test.c -S 

foo(int*, int*, int):
        sall    $2, %edx
        movslq  %edx, %rdx
        leaq    44(%rdi,%rdx,4), %rdx  --- redundant could be fwprop
        movl    (%rdx), %eax
        movl    $3, (%rsi)
        addl    (%rdx), %eax
        ret

fwprop failed to propagate this because it think cost of address
44(%rdi,%rdx,4) is more expensive than (%rdx), that's correct locally, but
under global view, if it could be propagated into both movl, leaq would be
eliminated, which benifits performance.

The ideal place to handle this issue is TER opt in pass_expand, but currently
TER only handle simple situation ---- single use and block level

 48   A pass is made through the function, one block at a time.  No cross block 
 49   information is tracked.                                                   
 50                                                                             
 51   Variables which only have one use, and whose defining stmt is considered  
 52   a replaceable expression (see ssa_is_replaceable_p) are tracked to see
whether                                                                         
 53   they can be replaced at their use location.       

Should TER be extended?

Another testcase has this issue in more complex cfg

Refer to
https://godbolt.org/z/ofjH9R


More information about the Gcc-bugs mailing list