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

            Bug ID: 69657
           Summary: [6 Regression] abs() not inlined after including
                    math.h
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wdijkstr at arm dot com
  Target Milestone: ---

Since a recent C++ header change abs() no longer gets inlined if we include an
unrelated header before it.

#include <math.h>
#include <cstdlib>

int
wrap_abs (int x)
{
  return abs (x) + std::abs(x);
}


Until recently GCC6 with -O2 -S produced for AArch64:

_Z8wrap_absi:
        cmp     w0, wzr
        csneg   w0, w0, w0, ge
        lsl     w0, w0, 1
        ret

However trunk GCC6 now emits:

_Z8wrap_absi:
        stp     x29, x30, [sp, -16]!
        add     x29, sp, 0
        bl      abs
        lsl     w0, w0, 1
        ldp     x29, x30, [sp], 16

This may result in significant slowdowns as it adds a call and PLT indirection
to execute a 3-instruction function. There might be other builtin functions
that are affected in a similar way.

Reply via email to