On 20/10/2021 20:13, Paul Floyd wrote:

On 10/20/21 16:16, Paul FLOYD wrote:

Message du 20/10/21 17:14

De : "Vladislav Yaglamunov"

A : valgrind-users@lists.sourceforge.net

Copie à :

Objet : [Valgrind-users] Cubic root of zero gives wrong result with clang 64-bit

I am using Valgrind 3.17.0 and noticed a strange behavior while running a code compiled with clang:

#include

int main() {

     long double x = std::cbrtl(0.0L);

     printf("%Lf", x);

     return 0;

}

I just did a test with g++. I had to modify the code a bit to prevent the compiler replacing the cbrtl() call with just a zero:

#include <cmath>

#include <

int main() {

volatile long double arg{0.0L};

long double x = std::cbrtl(arg);

printf("%Lf", x);

return 0;

}

This seems to work OK, both default and -m32.

The asm for that is

00000000004011a5 :

4011a5: 55              push %rbp

4011a6: 48 89 e5        mov %rsp,%rbp

4011a9: 48 83 ec 20     sub $0x20,%rsp

4011ad: d9 ee           fldz

4011af: db 7d e0        fstpt -0x20(%rbp)

4011b2: db 6d e0        fldt -0x20(%rbp)

4011b5: 48 8d 64 24 f0  lea -0x10(%rsp),%rsp

4011ba: db 3c 24        fstpt (%rsp)

4011bd: e8 8e fe ff ff  callq 401050

4011c2: 48 83 c4 10     add $0x10,%rsp

4011c6: db 7d f0        fstpt -0x10(%rbp)

4011c9: ff 75 f8        pushq -0x8(%rbp)

4011cc: ff 75 f0        pushq -0x10(%rbp)

4011cf: bf 04 20 40 00  mov $0x402004,%edi

4011d4: b8 00 00 00 00  mov $0x0,%eax

4011d9: e8 62 fe ff ff  callq 401040

4011de: 48 83 c4 10     add $0x10,%rsp

4011e2: b8 00 00 00 00  mov $0x0,%eax

4011e7: c9              leaveq

4011e8: c3              retq

Well, it works with clang++:

FreeBSD clang version 11.0.1 (g...@github.com:llvm/llvm-project.git llvmorg-11.0.

1-0-g43ff75f2c3fe)

Target: x86_64-unknown-freebsd13.0

I also tried clang++ 8, 9 and 12.

The asm for clang++12 for my modified code is

0000000000201920 <main>:

 201920:       55                      push   %rbp

 201921:       48 89 e5                mov    %rsp,%rbp

 201924:       48 83 ec 40             sub    $0x40,%rsp

 201928:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)

 20192f:       d9 ee                   fldz

 201931:       db 7d e0                fstpt  -0x20(%rbp)


201934:       db 6d e0                fldt   -0x20(%rbp)
201937:       48 89 e0                mov    %rsp,%rax
20193a:       db 38                   fstpt  (%rax)
20193c:       e8 bf 00 00 00          call   201a00 <cbrtl@plt>
201941:       db 7d d0                fstpt  -0x30(%rbp)
201944:       db 6d d0                fldt   -0x30(%rbp)
201947:       48 89 e0                mov    %rsp,%rax
20194a:       db 38                   fstpt  (%rax)
20194c:       bf c9 05 20 00          mov    $0x2005c9,%edi
201951:       31 c0                   xor    %eax,%eax
201953:       e8 b8 00 00 00          call   201a10 <printf@plt>
201958:       31 c0                   xor    %eax,%eax
20195a:       48 83 c4 40             add    $0x40,%rsp
20195e:       5d                      pop    %rbp
20195f:       c3                      ret

Can you post the asm that you are getting ? I'll see if I can try clang on Fedora 34.


Third time lucky. Reproduced on Fedora 34 with clang++

clang version 12.0.1 (Fedora 12.0.1-1.fc34)

0000000000401140 <main>:
 401140:       55                      push   %rbp
 401141:       48 89 e5                mov    %rsp,%rbp
 401144:       48 83 ec 40             sub    $0x40,%rsp
 401148:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
 40114f:       d9 ee                   fldz
 401151:       db 7d e0                fstpt  -0x20(%rbp)
 401154:       db 6d e0                fldt   -0x20(%rbp)
 401157:       48 89 e0                mov    %rsp,%rax
 40115a:       db 38                   fstpt  (%rax)
 40115c:       e8 df fe ff ff          callq  401040 <cbrtl@plt>
 401161:       db 7d d0                fstpt  -0x30(%rbp)
 401164:       db 6d d0                fldt   -0x30(%rbp)
 401167:       48 89 e0                mov    %rsp,%rax
 40116a:       db 38                   fstpt  (%rax)
 40116c:       bf 10 20 40 00          mov    $0x402010,%edi
 401171:       31 c0                   xor    %eax,%eax
 401173:       e8 b8 fe ff ff          callq  401030 <printf@plt>
 401178:       31 c0                   xor    %eax,%eax
 40117a:       48 83 c4 40             add    $0x40,%rsp
 40117e:       5d                      pop    %rbp

 40117f:       c3                      retq


That looks very much like what I saw on FreeBSD.


Unless someone else has an Idea this is going to need some debugging inside Valgrind.


A+

Paul





_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to