[英]GCC __builtin_expect checking pointer nullability of temporary during constexpr context results in strange run time behavior
[英]gcc cold function attribute vs builtin_expect behavior
从 gcc function 属性: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html冷属性可以提示 gcc 分区调用者的冷到 2 部分:正常部分(保留部分)和冷部分分离 function
寒冷的
函数上的冷属性用于通知编译器 function 不太可能被执行。 function 针对大小而不是速度进行了优化,并且在许多目标上它被放置在文本部分的一个特殊小节中,因此所有冷功能都显示在一起,从而改善了程序非冷部分的代码局部性。 分支预测机制将导致在代码中调用冷函数的路径标记为不太可能。 因此,将用于处理不太可能的情况(例如 perror)的函数标记为冷函数以改进在极少数情况下调用标记函数的热函数的优化是有用的。
当配置文件反馈可用时,通过 -fprofile-use,自动检测冷函数并忽略此属性。
这是一个例子https://godbolt.org/z/j7sK4hd48
然而,像__builtin_expect(int, int)这样的其他提示不能提示编译器进行这种优化,相反,编译器只会将unexpected放在 function 的底部。但不会将它们分开并拆分为另一个 function,就像 function 属性冷做一样。
GCC 是否计划支持__builtin_expect的此类优化? 如果没有,我们可以做其他努力来实现这种效果吗?
另一方面,Clang 似乎不支持这种拆分热/冷鳕鱼来分离 function,或者我可能不见了?
实际上,LLVM 已经支持这个优化。LLVM 有选项 hot-cold-split=true 来做这个。在 x86 后端,有一个选项 -split-machine-functions 来做这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.