提示C编译器(GCC或Clang)可能的变量值/范围[重复]

ryoqjall  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(97)

此问题在此处已有答案

Can I hint the optimizer by giving the range of an integer?(4个答案)
三年前关闭了。
在下面的代码中,只进行一次比较,因为编译器知道条件是互斥的,我们总是输入第二个条件,因为bar将是必要的〉32:

int foo(int bar) {
    if (bar <= 64)
        return 1;
    if (bar > 32) {
        printf("Too many elements");
    }
    return 0;
}

现在,假设我知道bar总是大于64。由于系统、配置或其他输入的原因,我怎么能提示编译器根本不进行比较,就像如果if (bar <= 64) return被编译了一样,除非它实际上没有保存在最终的ASM中。
比如:

int foo(int bar) {
    @precond(bar > 64);
    if (bar > 32) {
        printf("Too many elements");
    }
    return 0;
}

是我唯一的解决方案写例如LLVM通行证?

kq4fsx7k

kq4fsx7k1#

您可以在GCC中使用__builtin_unreachable

if (bar > 32) {
  __builtin_unreachable();
}

Clang中的__builtin_assume

__builtin_assume(bar <= 32);

MSVC中的__assume

__assume(bar <= 32);

在C++23中,你也可以使用可移植语法

[[assume(bar <= 32)]];

相关问题