Issue 202316
Summary [X86] failed to eliminate redundant vroundsd/vroundss before vcvttsd2si/vcvttss2si
Labels
Assignees
Reporter Andarwinux
    https://godbolt.org/z/svnqhq3jo

```c
#include <math.h>

long _lroundf (float x){return (long)roundf(x);}

long _lround (double x){return (long)round(x);}

long long _llroundf (float x){return (long long)roundf(x);}

long long _llround (double x){return (long long)round(x);}
```
gcc
```asm
"_lroundf":
        vmovss  xmm1, DWORD PTR .LC2[rip]
        vmovaps xmm2, xmm0
        vmovss  xmm0, DWORD PTR .LC0[rip]
        vandps  xmm1, xmm1, xmm2
        vorps   xmm0, xmm0, xmm1
        vaddss  xmm0, xmm0, xmm2
        vcvttss2si      rax, xmm0
 ret
"_lround":
        vmovsd  xmm1, QWORD PTR .LC5[rip]
 vmovapd xmm2, xmm0
        vmovsd  xmm0, QWORD PTR .LC3[rip]
        vandpd xmm1, xmm1, xmm2
        vorpd   xmm0, xmm0, xmm1
        vaddsd  xmm0, xmm0, xmm2
        vcvttsd2si      rax, xmm0
        ret
"_llroundf":
 vmovss  xmm1, DWORD PTR .LC2[rip]
        vmovaps xmm2, xmm0
 vmovss  xmm0, DWORD PTR .LC0[rip]
        vandps  xmm1, xmm1, xmm2
 vorps   xmm0, xmm0, xmm1
        vaddss  xmm0, xmm0, xmm2
 vcvttss2si      rax, xmm0
        ret
"_llround":
        vmovsd  xmm1, QWORD PTR .LC5[rip]
        vmovapd xmm2, xmm0
        vmovsd  xmm0, QWORD PTR .LC3[rip]
        vandpd  xmm1, xmm1, xmm2
        vorpd   xmm0, xmm0, xmm1
        vaddsd  xmm0, xmm0, xmm2
        vcvttsd2si      rax, xmm0
 ret
.LC0:
        .long   1056964607
.LC3:
        .long   -1
 .long   1071644671
.LC5:
        .long   0
        .long -2147483648
```
clang
```asm
.LCPI0_0:
        .long 0x3effffff
.LCPI0_1:
        .long   0x80000000
_lroundf:
 vpbroadcastd    xmm1, dword ptr [rip + .LCPI0_0]
        vpternlogd xmm1, xmm0, dword ptr [rip + .LCPI0_1]{1to4}, 248
        vaddss  xmm0, xmm0, xmm1
        vroundss        xmm0, xmm0, xmm0, 11
        vcvttss2si rax, xmm0
        ret

.LCPI1_0:
        .quad 0x3fdfffffffffffff
.LCPI1_1:
        .quad   0x8000000000000000
_lround:
 vpbroadcastq    xmm1, qword ptr [rip + .LCPI1_0]
        vpternlogq xmm1, xmm0, qword ptr [rip + .LCPI1_1]{1to2}, 248
        vaddsd  xmm0, xmm0, xmm1
        vroundsd        xmm0, xmm0, xmm0, 11
        vcvttsd2si rax, xmm0
        ret

.LCPI2_0:
        .long 0x3effffff
.LCPI2_1:
        .long   0x80000000
_llroundf:
 vpbroadcastd    xmm1, dword ptr [rip + .LCPI2_0]
        vpternlogd xmm1, xmm0, dword ptr [rip + .LCPI2_1]{1to4}, 248
        vaddss  xmm0, xmm0, xmm1
        vroundss        xmm0, xmm0, xmm0, 11
        vcvttss2si rax, xmm0
        ret

.LCPI3_0:
        .quad 0x3fdfffffffffffff
.LCPI3_1:
        .quad 0x8000000000000000
_llround:
        vpbroadcastq    xmm1, qword ptr [rip + .LCPI3_0]
        vpternlogq      xmm1, xmm0, qword ptr [rip + .LCPI3_1]{1to2}, 248
        vaddsd  xmm0, xmm0, xmm1
        vroundsd xmm0, xmm0, xmm0, 11
        vcvttsd2si      rax, xmm0
 ret
```
lllvm's problem is failing to realize that vround is redundant here, otherwise it is doing better than gcc.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to