llvm / llvm/llvm-project

[LoopFullUnroll] cause crazy suboptimal codegen

Open
#203,776 3 comments 0 reactions 1 assignee Claimed by @VachanVY View on GitHub
loopoptim missed-optimization
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

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.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.