Issue 203776
Summary [LoopFullUnroll] cause crazy suboptimal codegen
Labels
Assignees
Reporter Andarwinux
    https://godbolt.org/z/fcKdPcr5Y
```c
void test(const float * restrict a, float * restrict b) {
    for (int i = 0; i < 16; ++i) {
        if (b[i] != 0)
            b[i] = a[i] + b[i];
 else
            b[i] = 1;
 }
}
```
-fno-unroll-loops
```asm
.LCPI0_0:
        .long 0x3f800000
test:
        vmovups zmm0, zmmword ptr [rsi]
        vxorps xmm1, xmm1, xmm1
        vbroadcastss    zmm2, dword ptr [rip + .LCPI0_0]
 vcmpneqps       k1, zmm0, zmm1
        vaddps  zmm2 {k1}, zmm0, zmmword ptr [rdi]
        vmovups zmmword ptr [rsi], zmm2
 vzeroupper
        ret
```
-funroll-loops
```asm
.LCPI0_0:
 .long   0x3f800000
test:
        vmovss  xmm2, dword ptr [rsi]
 vmovss  xmm0, dword ptr [rip + .LCPI0_0]
        vxorps  xmm1, xmm1, xmm1
 vucomiss        xmm2, xmm1
        vmovaps xmm3, xmm0
        jne .LBB0_1
        jnp     .LBB0_2
.LBB0_1:
        vaddss  xmm3, xmm2, dword ptr [rdi]
.LBB0_2:
        vmovss  dword ptr [rsi], xmm3
        vmovss xmm2, dword ptr [rsi + 4]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_3
        jnp .LBB0_4
.LBB0_3:
        vaddss  xmm1, xmm2, dword ptr [rdi + 4]
.LBB0_4:
        vmovss  dword ptr [rsi + 4], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 8]
        vucomiss        xmm2, xmm1
        jne     .LBB0_5
 jnp     .LBB0_6
.LBB0_5:
        vaddss  xmm3, xmm2, dword ptr [rdi + 8]
.LBB0_6:
        vmovss  dword ptr [rsi + 8], xmm3
        vmovss xmm2, dword ptr [rsi + 12]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_7
        jnp .LBB0_8
.LBB0_7:
        vaddss  xmm1, xmm2, dword ptr [rdi + 12]
.LBB0_8:
        vmovss  dword ptr [rsi + 12], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 16]
        vucomiss        xmm2, xmm1
        jne     .LBB0_9
 jnp     .LBB0_10
.LBB0_9:
        vaddss  xmm3, xmm2, dword ptr [rdi + 16]
.LBB0_10:
        vmovss  dword ptr [rsi + 16], xmm3
        vmovss xmm2, dword ptr [rsi + 20]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_11
        jnp .LBB0_12
.LBB0_11:
        vaddss  xmm1, xmm2, dword ptr [rdi + 20]
.LBB0_12:
        vmovss  dword ptr [rsi + 20], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 24]
        vucomiss        xmm2, xmm1
        jne     .LBB0_13
 jnp     .LBB0_14
.LBB0_13:
        vaddss  xmm3, xmm2, dword ptr [rdi + 24]
.LBB0_14:
        vmovss  dword ptr [rsi + 24], xmm3
        vmovss xmm2, dword ptr [rsi + 28]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_15
        jnp .LBB0_16
.LBB0_15:
        vaddss  xmm1, xmm2, dword ptr [rdi + 28]
.LBB0_16:
        vmovss  dword ptr [rsi + 28], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 32]
        vucomiss        xmm2, xmm1
        jne     .LBB0_17
 jnp     .LBB0_18
.LBB0_17:
        vaddss  xmm3, xmm2, dword ptr [rdi + 32]
.LBB0_18:
        vmovss  dword ptr [rsi + 32], xmm3
        vmovss xmm2, dword ptr [rsi + 36]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_19
        jnp .LBB0_20
.LBB0_19:
        vaddss  xmm1, xmm2, dword ptr [rdi + 36]
.LBB0_20:
        vmovss  dword ptr [rsi + 36], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 40]
        vucomiss        xmm2, xmm1
        jne     .LBB0_21
 jnp     .LBB0_22
.LBB0_21:
        vaddss  xmm3, xmm2, dword ptr [rdi + 40]
.LBB0_22:
        vmovss  dword ptr [rsi + 40], xmm3
        vmovss xmm2, dword ptr [rsi + 44]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_23
        jnp .LBB0_24
.LBB0_23:
        vaddss  xmm1, xmm2, dword ptr [rdi + 44]
.LBB0_24:
        vmovss  dword ptr [rsi + 44], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 48]
        vucomiss        xmm2, xmm1
        jne     .LBB0_25
 jnp     .LBB0_26
.LBB0_25:
        vaddss  xmm3, xmm2, dword ptr [rdi + 48]
.LBB0_26:
        vmovss  dword ptr [rsi + 48], xmm3
        vmovss xmm2, dword ptr [rsi + 52]
        vucomiss        xmm2, xmm1
 vmovaps xmm1, xmm0
        jne     .LBB0_27
        jnp .LBB0_28
.LBB0_27:
        vaddss  xmm1, xmm2, dword ptr [rdi + 52]
.LBB0_28:
        vmovss  dword ptr [rsi + 52], xmm1
        vxorps xmm1, xmm1, xmm1
        vmovaps xmm3, xmm0
        vmovss  xmm2, dword ptr [rsi + 56]
        vucomiss        xmm2, xmm1
        jne     .LBB0_29
 jnp     .LBB0_30
.LBB0_29:
        vaddss  xmm3, xmm2, dword ptr [rdi + 56]
.LBB0_30:
        vmovss  dword ptr [rsi + 56], xmm3
        vmovss xmm2, dword ptr [rsi + 60]
        vucomiss        xmm2, xmm1
        jne .LBB0_31
        jnp     .LBB0_32
.LBB0_31:
        vaddss  xmm0, xmm2, dword ptr [rdi + 60]
.LBB0_32:
        vmovss  dword ptr [rsi + 60], xmm0
 ret
```
SLP is unlikely to be able to handle such cases, so report this as LoopFullUnroll issue.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to