相关疑难解决方法(0)

为什么icc无法以合理的方式处理编译时分支提示?

开发人员可以使用__builtin_expect 内置函数来帮助编译器了解分支可能走向哪个方向.

将来,我们可能会为此目的获得一个标准属性,但截至今天至少全部clang,iccgcc支持非标准属性__builtin_expect.

但是,icc当你使用它时,似乎会生成奇怪的代码1.也就是说,无论使用哪个方向进行预测,使用内置函数的代码都严格地比没有内置代码的代码更糟糕.

以下面的玩具功能为例:

int foo(int a, int b)
{
  do {
     a *= 77;
  } while (b-- > 0);  
  return a * 77;
}
Run Code Online (Sandbox Code Playgroud)

在三个编译器中,icc唯一一个将其编译为3个指令的最佳标量循环:

foo(int, int):
..B1.2:                         # Preds ..B1.2 ..B1.1
        imul      edi, edi, 77                                  #4.6
        dec       esi                                           #5.12
        jns       ..B1.2        # Prob 82%                      #5.18
        imul      eax, edi, 77                                  #6.14
        ret          
Run Code Online (Sandbox Code Playgroud)

无论 …

c optimization x86 built-in icc

10
推荐指数
1
解决办法
338
查看次数

标签 统计

built-in ×1

c ×1

icc ×1

optimization ×1

x86 ×1