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