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

            Bug ID: 109829
           Summary: Optimizing __builtin_signbit(x) ? -x : x or abs for FP
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com
  Target Milestone: ---

Consider the following 2 functions:

__float128 abs1(__float128 x) { return __builtin_fabsf128(x); }
__float128 abs2(__float128 x) { return __builtin_signbit(x) ? -x : x; }

They should provide the same results, however the codegen is different:

abs1(__float128):
        pand    xmm0, XMMWORD PTR .LC0[rip]
        ret
abs2(__float128):
        movmskps        eax, xmm0
        test    al, 8
        je      .L4
        pxor    xmm0, XMMWORD PTR .LC1[rip]
.L4:
        ret


Looks like match.pd miss the __builtin_signbit(x) ? -x : x ->
__builtin_fabs*(x) pattern.

Playground: https://godbolt.org/z/bsxeozGqv

Reply via email to