其他分享
首页 > 其他分享> > c – 如何优化默认的if-branch

c – 如何优化默认的if-branch

作者:互联网

我有以下一点代码.考虑到如何调用foo,可以给GCC和Clang提供哪些编译器参数来优化像icc那样的if语句呢?

码:

#include <cstdlib>

int foo(int i, bool b = false)
{
   if (b) ++i;
   return ++i;
}

int boo(int i)
{
   return ++i;
}

static const bool global_b = false;
int goo(int i, bool b = global_b)
{
   if (b) ++i;
   return ++i;
}

int main(int argc, char* argv[])
{
  int i = atoi(argv[1]);
  return 2 * foo(i) + 3 * boo(i) + 7 * goo(i);
}

GCC 4.9 -O2拆卸:

foo(int, bool):
   cmp   sil, 1
   sbb   edi, -1
   lea   eax, [rdi+1]
   ret

goo(int, bool):
   cmp   sil, 1
   sbb   edi, -1
   lea   eax, [rdi+1]
   ret

boo(int):
   lea   eax, [rdi+1]
   ret

Clang 3.4 -O2拆卸:

foo(int, bool):
   movzbl %sil, %eax
   leal   1(%rdi,%rax), %eax
   ret
goo(int, bool):
   movzbl %sil, %eax
   leal   1(%rdi,%rax), %eax
   ret
boo(int):
   leal  1(%rdi), %eax
   ret

IntelCC 13 -O2反汇编:

foo(int, bool):
 incl %edi
 movl %edi, %eax
 ret
goo(int):
 incl %edi
 movl %edi, %eax
 ret       
boo(int):
 incl %edi
 movl %edi, %eax
 ret

Templatising foo我们得到以下内容:

template <typename T>
T foo_t(T i, bool b = false)
{
   if (b) ++i;
   return ++i;
}

GCC 4.9隐式内联:

add eax, 1

解决方法:

英特尔的编译器是错误的.没有像gcc的-fwhole-program这样的选项(它自动标记所有函数但主要标记为静态,即本翻译单元的本地),我们不知道是否从另一个翻译单元调用foo,因此编译器不能认为它是总是使用等于false的第二个参数调用.

标签:icc,c,optimization,gcc,gcc4-9
来源: https://codeday.me/bug/20190830/1768934.html