Emmmer created this revision.
Emmmer added reviewers: MaskRay, liaolucy, craig.topper, DavidSpickett.
Emmmer added projects: LLDB, LLDB test suite on simulator.
Herald added subscribers: jsji, sunshaoce, VincentWu, luke957, StephenFan, 
vkmr, luismarques, sameer.abuasal, JDevlieghere, pengfei, s.egerton, Jim, PkmX, 
rogfer01, shiva0217, kito-cheng, simoncook, arichardson.
Herald added a project: All.
Emmmer requested review of this revision.
Herald added subscribers: lldb-commits, pcwang-thead.

When I try to run some unit tests, I met this problem

  [ RUN      ] DumpDataExtractorTest.Formats
  
/home/emmmer/git/llvm-project/lldb/unittests/Core/DumpDataExtractorTest.cpp:90: 
Failure
  Expected equality of these values:
    expected
      Which is: "{-nan -nan nan nan}"
    result.GetString()
      Which is: "{nan nan nan nan}"
  [  FAILED  ] DumpDataExtractorTest.Formats (25 ms)

So I extracted a minimal repro from `lldb/source/Core/DumpDataExtractor.cpp:53 
half2float(uint16_t half)` .

  #include <stdio.h>
  #include <math.h>
  #include <stdint.h>
  #include <string.h>
  
  int main() {
    float f = 0;
    *(uint32_t *) &f = 0xffffe000;
    float w = f * ldexpf(1, -112);
    printf("%f(%x)\n", w, *(uint32_t *) &w);
    return 0;
  }

On x86_64 it runs correctly.

  GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
  Copyright (C) 2021 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  This GDB was configured as "x86_64-linux-gnu".
  Reading symbols from nan...
  (gdb) b main
  Breakpoint 1 at 0x113d: file nan.c, line 7.
  (gdb) r
  Starting program: /home/emmmer/nan
  
  Breakpoint 1, main () at nan.c:7
  7         float f = 0;
  (gdb) n
  8         *(uint32_t *) &f = 0xffffe000;
  (gdb) n
  9         float w = f * ldexpf(1, -112);
  (gdb) n
  10        printf("%f(%x)\n", w, *(uint32_t *) &w);
  (gdb) p w
  $1 = -nan(0x7fe000)  \\ -nan expected
  (gdb) p f
  $2 = -nan(0x7fe000)

But on riscv64, it seems to meet some problem.

  c
  GNU gdb (GDB) openEuler 11.1-2.oe2203
  Copyright (C) 2021 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  Reading symbols from nan...
  (gdb) b main
  Breakpoint 1 at 0x105e8: file nan.c, line 7.
  (gdb) r
  Starting program: /root/nan
  [Thread debugging using libthread_db enabled]
  Using host libthread_db library "/usr/lib64/libthread_db.so.1".
  
  Breakpoint 1, main () at nan.c:7
  7         float f = 0;
  (gdb) n
  n8        *(uint32_t *) &f = 0xffffe000;
  (gdb) n
  9         float w = f * ldexpf(1, -112);
  (gdb) n
  10        printf("%f(%x)\n", w, *(uint32_t *) &w);
  (gdb) p w
  $1 = nan(0x400000)  \\ -nan expected
  (gdb) p f
  $2 = -nan(0x7fe000)

The problem occurs after line 9, the nan payload got lost after the float 
multiplication.

The problem only happens when running float16 tests, due to riscv standard does 
not enforce NaN payload propagation 
<https://github.com/riscv/riscv-isa-manual/blob/f518c259c008f926eba4aba67804f62531b6e94b/src/f.tex#L282>,
 so I would like to turn it off temporarily on the riscv platform, until more 
investigations are taken.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D129736

Files:
  lldb/unittests/Core/DumpDataExtractorTest.cpp


Index: lldb/unittests/Core/DumpDataExtractorTest.cpp
===================================================================
--- lldb/unittests/Core/DumpDataExtractorTest.cpp
+++ lldb/unittests/Core/DumpDataExtractorTest.cpp
@@ -199,9 +199,11 @@
   TestDump(std::vector<uint16_t>{0xabcd, 0x1234},
            lldb::Format::eFormatVectorOfFloat16, "{-0.0609436 0.000757217}");
 
+#if !defined(__riscv)
   // quiet/signaling NaNs.
   TestDump(std::vector<uint16_t>{0xffff, 0xffc0, 0x7fff, 0x7fc0},
            lldb::Format::eFormatVectorOfFloat16, "{-nan -nan nan nan}");
+#endif
   // +/-Inf.
   TestDump(std::vector<uint16_t>{0xfc00, 0x7c00},
            lldb::Format::eFormatVectorOfFloat16, "{-inf inf}");


Index: lldb/unittests/Core/DumpDataExtractorTest.cpp
===================================================================
--- lldb/unittests/Core/DumpDataExtractorTest.cpp
+++ lldb/unittests/Core/DumpDataExtractorTest.cpp
@@ -199,9 +199,11 @@
   TestDump(std::vector<uint16_t>{0xabcd, 0x1234},
            lldb::Format::eFormatVectorOfFloat16, "{-0.0609436 0.000757217}");
 
+#if !defined(__riscv)
   // quiet/signaling NaNs.
   TestDump(std::vector<uint16_t>{0xffff, 0xffc0, 0x7fff, 0x7fc0},
            lldb::Format::eFormatVectorOfFloat16, "{-nan -nan nan nan}");
+#endif
   // +/-Inf.
   TestDump(std::vector<uint16_t>{0xfc00, 0x7c00},
            lldb::Format::eFormatVectorOfFloat16, "{-inf inf}");
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to