C++ ICC是否无法优化简单的惯用结构?
这两个函数做同样的事情,我希望一个好的编译器能为它们生成相同的程序集 : : : (C++ ICC是否无法优化简单的惯用结构?,c++,optimization,icc,C++,Optimization,Icc,这两个函数做同样的事情,我希望一个好的编译器能为它们生成相同的程序集 : : : (-O3没有帮助) 那么,icc不是一个像样的编译器吗?对于我没有预料到的特定情况,区分这两种实现是否正确?我需要降低对一个好的编译器能做什么的期望吗?奇怪的是,如果参数是无符号的,它将为f1生成与您在f2@bolov中看到的代码相同的代码,我并不奇怪,因为对于有符号整数,I%2可以生成三个不同的值(-1、0和1)。但是ICC没有意识到,当结果与0进行比较时,-1和1之间的区别是不相关的。为了回答你的(基于非主题意
-O3
没有帮助)
那么,icc不是一个像样的编译器吗?对于我没有预料到的特定情况,区分这两种实现是否正确?我需要降低对一个好的编译器能做什么的期望吗?奇怪的是,如果参数是
无符号的
,它将为f1
生成与您在f2
@bolov中看到的代码相同的代码,我并不奇怪,因为对于有符号整数,I%2
可以生成三个不同的值(-1、0和1)。但是ICC没有意识到,当结果与0进行比较时,-1和1之间的区别是不相关的。为了回答你的(基于非主题意见的)问题:仅仅通过1(人为的,甚至不是完全的)优化案例来判断编译器只是。。。选择任何编译器。为此选择任何软件。您肯定会发现1种情况下,它的性能不是最佳的。这就是人类编写的软件的本质。当人工智能接管世界,出现人工智能编写的软件时,事情可能会改变。但我不会屏住呼吸。@bolov:比性能更重要的是编译器是否能生成在软件所需的所有情况下都能有效运行的代码。据我所知,要使gcc或clang在这方面表现得和icc一样好,唯一的方法就是禁用许多优化。奇怪的是,如果参数是无符号的
,它将为f1
生成与您在f2
@bolov中看到的代码相同的代码,依我看,考虑到有符号的整数,i%2
可以生成三个不同的值(-1、0和1)。但是ICC没有意识到,当结果与0进行比较时,-1和1之间的区别是不相关的。为了回答你的(基于非主题意见的)问题:仅仅通过1(人为的,甚至不是完全的)优化案例来判断编译器只是。。。选择任何编译器。为此选择任何软件。您肯定会发现1种情况下,它的性能不是最佳的。这就是人类编写的软件的本质。当人工智能接管世界,出现人工智能编写的软件时,事情可能会改变。但我不会屏住呼吸。@bolov:比性能更重要的是编译器是否能生成在软件所需的所有情况下都能有效运行的代码。据我所知,使gcc或clang在这方面表现得和icc一样好的唯一方法是禁用许多优化。
bool f1(int value) { return value % 2 == 0; }
bool f2(int value) { return ! (value & 1); }
f1(int):
mov eax, edi
not eax
and eax, 1
ret
f2(int):
mov eax, edi
not eax
and eax, 1
ret
f1(int): # @f1(int)
test dil, 1
sete al
ret
f2(int): # @f2(int)
test dil, 1
sete al
ret
f1(int):
and edi, -2147483647 #1.37
jge ..B1.4 # Prob 50% #1.37
sub edi, 1 #1.37
or edi, -2 #1.37
inc edi #1.37
..B1.4: # Preds ..B1.1 ..B1.5
xor eax, eax #1.42
cmp edi, 1 #1.42
setb al #1.42
ret #1.42
f2(int):
not edi #3.40
and edi, 1 #3.40
mov eax, edi #3.40
ret #3.40