https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90106

            Bug ID: 90106
           Summary: builtin sqrt() ignoring libm's sqrt call result
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fredericopissarra at gmail dot com
  Target Milestone: ---

GCC 7.3 and 8.2 (from Ubuntu 18.04 and MinGW-w64) seems to generate wrong code
for sqrtf() -- and sqrt() -- for multiple platforms (tested under x86-64 and
ARM Arch64, gcc 7.3, and Arch32 with gcc 6.3). Try to compile this simple
function:

  /* test.c */
  #include <math.h>
  float f( float x ) { return sqrtf( x ); }

And I've got, for x86-64 using SSE:

  # Compiled with gcc -O2 -S test.c
  f:
    pxor %xmm2,%xmm2
    sqrtss %xmm0,%xmm1
    ucomiss %xmm0,%xmm2
    ja .L8
    movaps %xmm1,%xmm0
    ret
  .L8:
    subq $24,%rsp
    movss %xmm1, 12(%rsp)    # save xmm1 from sqrtss
    call  sqrtf@PLT
    movss 12(%rsp),%xmm1     # restore xmm1.
    addq $24,%rsp
    movaps %xmm1,%xmm0       # use xmm1 anyway?!
    ret

Notice, when 0 > x sqrt@PLT is called, but the result is ignored.
A similar code is created by GCC for ARM.

As expected, -ffast-math, creates:

f:
  sqrtss %xmm0,%xmm0
  ret

Which is correct.

My environment:

  $ gcc --version
  gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

  $ gcc-8 --version
  gcc-8 (Ubuntu 8.2.0-1ubuntu2~18.04) 8.2.0

  $  arm-none-eabi-gcc --version
  arm-none-eabi-gcc (15:6.3.1+svn253039-1build1) 6.3.1 20170620

  $  aarch64-linux-gnu-gcc --version
  aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.3.0-27ubuntu1~18.04) 7.3.0

  $  uname -srvp
  Linux 4.15.0-47-generic #50-Ubuntu SMP Wed Mar 13 10:44:52 UTC 2019 x86_64

  $  lsb_release -a
  No LSB modules are available.
  Distributor ID:       Ubuntu
  Description:  Ubuntu 18.04.2 LTS
  Release:      18.04
  Codename:     bionic

Reply via email to