[PATCH] D74826: [compiler-rt] [builtins] Fix logb / logbl tests

Luís Marques via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 19 05:20:04 PST 2020


luismarques created this revision.
luismarques added reviewers: rupprecht, delcypher.
Herald added subscribers: llvm-commits, Sanitizers, s.egerton, lenary, PkmX, simoncook, dberris.
Herald added projects: Sanitizers, LLVM.

Like was done before in D67999 <https://reviews.llvm.org/D67999> for `logbf`, this patch fixes the tests for the internal compiler-rt implementations of `logb` and `logbl` to consider all NaN equivalent. Not doing so was resulting in test failures for riscv64, since the the NaNs had different signs, but the spec doesn't specify the NaN signedness or payload.

The patch also fixes the test failure error message for `logbl`: the incorrect function name, and the `%a` format not being applicable to format the long double.

This addresses bug 44244 (https://bugs.llvm.org/show_bug.cgi?id=44244).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D74826

Files:
  compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c
  compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c


Index: compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c
===================================================================
--- compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c
+++ compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c
@@ -27,18 +27,20 @@
 int test__compiler_rt_logbl(fp_t x) {
   fp_t crt_value = __compiler_rt_logbl(x);
   fp_t libm_value = logbl(x);
-  // Compare actual rep, e.g. to avoid NaN != the same NaN
-  if (toRep(crt_value) != toRep(libm_value)) {
+  // Compare the values, considering all NaNs equivalent, as the spec doesn't
+  // specify the NaN signedness/payload.
+  if (crt_value != libm_value &&
+      !(crt_isnan(crt_value) && crt_isnan(libm_value))) {
     // Split expected values into two for printf
     twords x_t, crt_value_t, libm_value_t;
     x_t.all = toRep(x);
     crt_value_t.all = toRep(crt_value);
     libm_value_t.all = toRep(libm_value);
     printf(
-        "error: in __compiler_rt_logb(%a [%llX %llX]) = %a [%llX %llX] !=  %a "
+        "error: in __compiler_rt_logbl([%llX %llX]) = [%llX %llX] !=  "
         "[%llX %llX]\n",
-        x, x_t.s.high, x_t.s.low, crt_value, crt_value_t.s.high,
-        crt_value_t.s.low, libm_value, libm_value_t.s.high, libm_value_t.s.low);
+        x_t.s.high, x_t.s.low, crt_value_t.s.high, crt_value_t.s.low,
+        libm_value_t.s.high, libm_value_t.s.low);
     return 1;
   }
   return 0;
Index: compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c
===================================================================
--- compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c
+++ compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c
@@ -20,8 +20,10 @@
 int test__compiler_rt_logb(fp_t x) {
   fp_t crt_value = __compiler_rt_logb(x);
   fp_t libm_value = logb(x);
-  // Compare actual rep, e.g. to avoid NaN != the same NaN
-  if (toRep(crt_value) != toRep(libm_value)) {
+  // Compare the values, considering all NaNs equivalent, as the spec doesn't
+  // specify the NaN signedness/payload.
+  if (crt_value != libm_value &&
+      !(crt_isnan(crt_value) && crt_isnan(libm_value))) {
     printf("error: in __compiler_rt_logb(%a [%lX]) = %a [%lX] !=  %a [%lX]\n",
            x, toRep(x), crt_value, toRep(crt_value), libm_value,
            toRep(libm_value));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74826.245381.patch
Type: text/x-patch
Size: 2284 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200219/dd408901/attachment.bin>


More information about the llvm-commits mailing list