mbox series

[v3,0/6] Remove UB and optimize ilogbf/ilogb

Message ID 20250429164007.2928271-1-adhemerval.zanella@linaro.org
Headers show
Series Remove UB and optimize ilogbf/ilogb | expand

Message

Adhemerval Zanella Netto April 29, 2025, 4:29 p.m. UTC
From a recent experiment to build glibc with -fsanitize=undefined [1], I
found that both the float and double ilogb triggered UB due to the use
of shift with a signed integer.

This patchset fixes the UB issues on both implementations by
reimplementing them with slightly better code.

Along with this patch, I also optimized the implementation to remove the
need for the error handling wrapper and handle error cases inline 
(like recent newer implementations).  These required considering the
already-in-place optimizations and arch-specific implementations.

For m68k I kept the implementations in place, while for i686 the old ones
use x87 math instruction which seems to be slower on recent hardware (and
thus these are removed in favor of the generic implementation).

The loongarch was straightforward to adapt to keep the fclass.d usage.

The powerpc64le xsxexpdp/xsxexpqp turned out to not be an improvement over
the new generic implementation, at least for float and double. The last
patch refactors the code to use only for float128, along with the wrapper
removal (which improved performance a bit).

[1] https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/azanella/ubsan-undef

Adhemerval Zanella (6):
  math: Remove UB and optimize double ilogb
  math: Optimize double ilogb/llogb
  math: Remove UB and optimize double ilogbf
  math: Optimize float ilogb/llogb
  math: Remove i386 ilogb/ilogbf/llogb/llogbf
  powerpc: Use generic ilogb/ilogbf and refactor ilogbf128

 sysdeps/i386/fpu/e_ilogb.S                    | 41 ------------
 sysdeps/i386/fpu/e_ilogbf.S                   | 41 ------------
 sysdeps/i386/fpu/math_err.c                   |  1 -
 sysdeps/ieee754/dbl-64/e_ilogb.c              | 64 +------------------
 sysdeps/ieee754/dbl-64/math_config.h          |  2 +
 sysdeps/ieee754/dbl-64/math_err.c             | 32 ++++++++++
 sysdeps/ieee754/dbl-64/w_ilogb-impl.h         | 37 +++++++++++
 sysdeps/ieee754/dbl-64/w_ilogb.c              | 52 +++++++++++++++
 sysdeps/ieee754/dbl-64/w_llogb.c              |  2 +
 sysdeps/ieee754/flt-32/e_ilogbf.c             | 44 +------------
 sysdeps/ieee754/flt-32/math_config.h          |  2 +
 sysdeps/ieee754/flt-32/math_errf.c            | 33 ++++++++++
 sysdeps/ieee754/flt-32/w_ilogbf-impl.h        | 38 +++++++++++
 sysdeps/ieee754/flt-32/w_ilogbf.c             | 53 +++++++++++++++
 sysdeps/ieee754/flt-32/w_llogbf.c             |  2 +
 sysdeps/loongarch/fpu/e_ilogbf.c              | 40 +-----------
 .../fpu/{e_ilogb.c => w_ilogb-impl.h}         | 12 ++--
 sysdeps/loongarch/fpu/w_ilogbf-impl.h         | 37 +++++++++++
 sysdeps/m68k/m680x0/fpu/math_err.c            |  1 -
 sysdeps/m68k/m680x0/w_ilogb.c                 |  2 +
 sysdeps/m68k/m680x0/w_ilogbf.c                |  2 +
 sysdeps/m68k/m680x0/w_llogb.c                 |  2 +
 sysdeps/m68k/m680x0/w_llogbf.c                |  2 +
 .../powerpc/powerpc64/le/fpu/e_ilogbf128.c    |  1 +
 .../powerpc/powerpc64/le/fpu/e_llogbf128.c    |  1 +
 .../powerpc64/le/fpu/multiarch/Makefile       |  2 +-
 .../powerpc64/le/fpu/w_ilogb_template.c       | 30 ---------
 .../powerpc64/le/fpu/w_ilogbf128-impl.h       | 57 +++++++++++++++++
 .../powerpc64/le/fpu/w_ilogbf128-power9.c     |  1 +
 .../powerpc/powerpc64/le/fpu/w_ilogbf128.c    | 51 +++++++++++++++
 .../powerpc64/le/fpu/w_llogbf128-power9.c     |  1 +
 .../powerpc/powerpc64/le/fpu/w_llogbf128.c    |  2 +
 32 files changed, 421 insertions(+), 267 deletions(-)
 delete mode 100644 sysdeps/i386/fpu/e_ilogb.S
 delete mode 100644 sysdeps/i386/fpu/e_ilogbf.S
 delete mode 100644 sysdeps/i386/fpu/math_err.c
 create mode 100644 sysdeps/ieee754/dbl-64/w_ilogb-impl.h
 create mode 100644 sysdeps/ieee754/dbl-64/w_ilogb.c
 create mode 100644 sysdeps/ieee754/dbl-64/w_llogb.c
 create mode 100644 sysdeps/ieee754/flt-32/w_ilogbf-impl.h
 create mode 100644 sysdeps/ieee754/flt-32/w_ilogbf.c
 create mode 100644 sysdeps/ieee754/flt-32/w_llogbf.c
 rename sysdeps/loongarch/fpu/{e_ilogb.c => w_ilogb-impl.h} (86%)
 create mode 100644 sysdeps/loongarch/fpu/w_ilogbf-impl.h
 delete mode 100644 sysdeps/m68k/m680x0/fpu/math_err.c
 create mode 100644 sysdeps/m68k/m680x0/w_ilogb.c
 create mode 100644 sysdeps/m68k/m680x0/w_ilogbf.c
 create mode 100644 sysdeps/m68k/m680x0/w_llogb.c
 create mode 100644 sysdeps/m68k/m680x0/w_llogbf.c
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/e_ilogbf128.c
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/e_llogbf128.c
 delete mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_ilogb_template.c
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_ilogbf128-impl.h
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_ilogbf128-power9.c
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_ilogbf128.c
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_llogbf128-power9.c
 create mode 100644 sysdeps/powerpc/powerpc64/le/fpu/w_llogbf128.c