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

            Bug ID: 100021
           Summary: [9/10/11 Regression] std::clamp unprofitable
                    vectorization on -march=nehalem/.../broadwell
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nok.raven at gmail dot com
  Target Milestone: ---

//#include <algorithm>
namespace std
{
    template<typename _Tp>
    constexpr const _Tp&
    clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi)
    {
      return (__val < __lo) ? __lo : (__hi < __val) ? __hi : __val;
    }
}

int foo(int x, int y) {
    return std::clamp(x - y, -1, 1);
}

https://godbolt.org/z/6534c1ff1 either GCC makes unprofitable vectorization or
LLVM MCA calculation is wrong.

Affected targets are
-march=nehalem/westmere/sandybridge/ivybridge/haswell/broadwell.

I do not know why it is vectorized on -O2 in the first place; could not find a
switch which triggers it, and doing -O1 + everything -O2 supposed to be
enabling does not reproduce the -O2 behavior.

Reply via email to