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

--- Comment #7 from Mathieu Malaterre <malat at debian dot org> ---
In case this helps resolve this, here is the cvise-reduced code:

% cat skeleton_test.cc
#include <stddef.h>
#define HWY_PRAGMA(tokens) _Pragma(#tokens)
namespace hwy {
#define HWY_PUSH_ATTRIBUTES(targets_str) HWY_PRAGMA(GCC target targets_str)
inline __attribute__((always_inline)) void PreventElision(int output) {
  asm("" : "+r"(output) : : "memory");
}
} // namespace hwy
#if HWY_TARGET == HWY_PPC10
#define HWY_BEFORE_NAMESPACE() HWY_PUSH_ATTRIBUTES(",cpu=power10")
#endif
HWY_BEFORE_NAMESPACE() namespace detail {
  template <typename, size_t, int> struct CappedTagChecker {};
}
template <typename T, size_t kLimit, int kPow2 = 0>
using CappedTag = detail::CappedTagChecker<T, kLimit, kPow2>;
template <class D> size_t Lanes(D);
template <typename, size_t, size_t kMinArg, class Test> struct ForeachCappedR {
  static void Do(size_t min_lanes, size_t max_lanes) {
    CappedTag<int, kMinArg> d;
    Test()(int(), d);
    Do(min_lanes, max_lanes);
  }
};
template <class Test> struct ForPartialVectors {
  template <typename T> void operator()(T t) {
    (void)t;
    ForeachCappedR<T, 1, 1, Test>::Do(1, 1);
  }
};
struct TestFloorLog2 {
  template <class T, class DF> void operator()(T, DF df) {
    size_t count = Lanes(df);
    int sum;
    for (size_t i; count; ++i)
      hwy::PreventElision(sum);
  }
};
void TestAllFloorLog2() { ForPartialVectors<TestFloorLog2>()(float()); }


Compilation line is:

% /usr/bin/c++  -O1 -mcpu=power9 -flto=auto -c skeleton_test.cc

Reply via email to