MSVC:优化x * 0.f.

时间:2017-12-10 18:37:03

标签: c++ visual-c++

我有一些函数包含一些x * 0.f表达式。如果我使用编译标志/fp:fast,那些就会被优化掉。但显然无法用#pragma float_control(...)设置此标志 - 不确定原因。因此,我尝试使用__assume(...)内在函数来触发某些变量的优化步骤 - 但是根据不起作用的汇编输出。任何人都有另一个想法如何触发fp:某些函数的快速语义?

示例:https://godbolt.org/g/KDQw9X

1 个答案:

答案 0 :(得分:0)

显然我错过了documentation ...

中的重要部分

这是snippet,适用于MSVC和GCC

// GCC
#if defined(__GNUC__)
#define USERLIB_PRAGMA(x) _Pragma(#x)
// MSVC
#elif defined(_MSC_VER)
#define USERLIB_PRAGMA(x) __pragma(x)
// Fallback
#else
#define USERLIB_PRAGMA(x)
#endif

// GCC
#if defined(__GNUC__)
#define USERLIB_FAST_MATH_BEGIN \
    USERLIB_PRAGMA(GCC push_options) \
    USERLIB_PRAGMA(GCC optimize("fast-math")) \

#define USERLIB_FAST_MATH_END \
    USERLIB_PRAGMA(GCC pop_options) \

// MSVC
#elif defined(_MSC_VER)
#define USERLIB_FAST_MATH_BEGIN \
    USERLIB_PRAGMA(float_control(except, off, push)) \
    USERLIB_PRAGMA(float_control(precise, off, push)) \

#define USERLIB_FAST_MATH_END \
    USERLIB_PRAGMA(float_control(pop)) \
    USERLIB_PRAGMA(float_control(pop)) \

// Fallback
#else
#define USERLIB_FAST_MATH_BEGIN
#define USERLIB_FAST_MATH_END
#endif

float a(float x) {
    return 0.f * x;
}

USERLIB_FAST_MATH_BEGIN
float b(float x) {
    return 0.f * x;
}
USERLIB_FAST_MATH_END

float c(float x) {
    return 0.f * x;
}