【发布时间】:2020-06-13 22:28:00
【问题描述】:
在下面的代码中,只会做一个比较,因为编译器知道条件是互斥的,我们总是会输入第二个条件,因为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 通行证的唯一解决方案吗?
【问题讨论】:
-
有什么用? IMO X-Y 问题。
-
我认为这里不需要详细说明,它是用于高速网络优化的。根据预测的输入专门化代码。我稍微改变了问题,使其更清晰并说明输入。
-
我觉得你可以使用GCC的
__builtin_expect:blog.man7.org/2012/10/how-much-do-builtinexpect-likely-and.html -
感谢@ForceBru,但这只是一个提示,会保留分支。它只会确保最可能的代码不在跳转路径上。我想删除跳转部分。我想 __builtin_enforced 也许:p
-
请注意,写通行证真的非常简单。