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

            Bug ID: 109416
           Summary: Missed constant propagation cases after reload
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sinan.lin at linux dot alibaba.com
  Target Milestone: ---

gcc splits a movdi_32bit pattern into two insns after reload in rv32, which
brings constant propagation opportunities.

e.g.
```
long long int Data;

void init() {
    Data = 0x0;
}

void init2() {
    Data = 0xf00000000;
}

void init3() {
    Data = 0xf0000000f;
}

```


asm output
```
init:
        lui     a5,%hi(Data)
        li      a3,0
        li      a4,0
        sw      a3,%lo(Data)(a5)
        sw      a4,%lo(Data+4)(a5)
        ret
init2:
        lui     a5,%hi(Data)
        li      a2,0
        li      a3,15
        sw      a2,%lo(Data)(a5)
        sw      a3,%lo(Data+4)(a5)
        ret
init3:
        lui     a5,%hi(Data)
        li      a2,15
        li      a3,15
        sw      a2,%lo(Data)(a5)
        sw      a3,%lo(Data+4)(a5)
        ret
```

could be optimized into
```
init:
        lui     a5,%hi(Data)
        sw      zero,%lo(Data)(a5)
        sw      zero,%lo(Data+4)(a5)
        ret
init2:
        lui     a5,%hi(Data)
        li      a2,15
        sw      zero,%lo(Data)(a5)
        sw      a2,%lo(Data+4)(a5)
        ret
init3:
        lui     a5,%hi(Data)
        li      a2,15
        sw      a2,%lo(Data)(a5)
        sw      a2,%lo(Data+4)(a5)
        ret
```



A similar case in AArch64
```
__int128 Data;

void init() {
    Data = 0xfffff;
}
```

output
```
init:
        adrp    x0, .LANCHOR0
        add     x0, x0, :lo12:.LANCHOR0
        mov     x2, 1048575
        mov     x3, 0
        stp     x2, x3, [x0]
        ret
```
could be optimized into

```
init:
        adrp    x0, .LANCHOR0
        add     x0, x0, :lo12:.LANCHOR0
        mov     x2, 1048575
        stp     x2, xzr, [x0]
        ret
```

Reply via email to