【发布时间】:2014-08-21 06:17:10
【问题描述】:
我有以下代码。鉴于 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
模板化 foo 我们得到以下结果:
template <typename T>
T foo_t(T i, bool b = false)
{
if (b) ++i;
return ++i;
}
GCC 4.9 被隐式内联:
add eax, 1
【问题讨论】:
-
嗯,ICC 的代码生成器只是……错了。
-
@TC:您能详细说明一下吗?结果来自:gcc.godbolt.org
-
ICC 生成的代码根本不检查 bool 参数。由于
foo具有外部链接,因此可以在不同的翻译单元中将true作为第二个参数调用,因此代码生成根本不正确。 -
你试过
gcc -O3吗? -
@firda: 是的,这里是:foo(int, bool): cmp sil, 1 sbb edi, -1 lea eax, [rdi+1] ret
标签: c++ gcc optimization icc gcc4.9