https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111366
--- Comment #8 from Mathieu Malaterre <malat at debian dot org> ---
Further reduced:
#include <stddef.h>
#define HWY_PRAGMA(tokens) _Pragma(#tokens)
#define HWY_PUSH_ATTRIBUTES(targets_str) HWY_PRAGMA(GCC target targets_str)
__attribute__((always_inline)) void PreventElision() { asm(""); }
#define HWY_BEFORE_NAMESPACE() HWY_PUSH_ATTRIBUTES(",cpu=power10")
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 <typename, size_t, size_t kMinArg, class Test> struct ForeachCappedR {
static void Do(size_t, size_t) {
CappedTag<int, kMinArg> d;
Test()(int(), d);
}
};
template <class Test> struct ForPartialVectors {
template <typename T> void operator()(T) {
ForeachCappedR<T, 1, 1, Test>::Do(1, 1);
}
};
struct TestFloorLog2 {
template <class T, class DF> void operator()(T, DF) { PreventElision(); }
};
void TestAllFloorLog2() { ForPartialVectors<TestFloorLog2>()(float()); }