繁体   English   中英

为什么clang 6.0编译器通过在-N处开始索引并计数为零,而clang 11.0从0开始并计数为N来进行优化?

Why does the clang 6.0 compiler optimize by starting indexes at -N and counting to zero, but clang 11.0 starts at 0 and counts to N?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

对于下面的代码,clang 6.0和11.0在其编译程序集上有细微的差别。

#include <stdint.h>

#define SIZE (1L << 16)
    
void test(uint8_t * restrict a,  uint8_t * restrict b) {
  uint64_t i;

  for (i = 0; i < SIZE; i++) {
    a[i] += b[i];
  } 
}

当我在clang 6.0中使用参数-O1进行编译时,得到以下输出:

test:                                   # @test
        mov     rax, -65536
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        movzx   ecx, byte ptr [rsi + rax + 65536]
        add     byte ptr [rdi + rax + 65536], cl
        add     rax, 1
        jne     .LBB0_1
        ret

请注意,编译器将循环从“ 0到65536”索引更改为“ -65536到0”。 我认为这非常聪明,因为它利用了以下事实:如果结果为零,则add程序集会设置ZF标志,从而节省指令。 不幸的是,当我在clang 11.0中使用相同的参数运行相同的代码时,我得到以下代码:

test:                                   # @test
        xor     eax, eax
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        movzx   ecx, byte ptr [rsi + rax]
        add     byte ptr [rdi + rax], cl
        add     rax, 1
        cmp     rax, 65536
        jne     .LBB0_1
        ret

注意这次,它保留了“ 0到65536”的索引,并在每个循环的末尾添加了cmp指令。 另外,虽然这是一个特定的示例,但这并不是我编写的代码所独有的。 它在保持-O3仍然存在,并且也启用了矢量化

是什么赋予了? 最初的优化实际上没有效果吗? 处理器改变了以消除to俩吗?

问题暂未有回复.您可以查看右边的相关问题.
2 与clang 6.0的静态链接

我试图从使用ubuntu 16.04的clang 6.0和cmake 3.5.1创建的二进制文件中删除以下动态依赖项: 虽然在gcc命令行中添加-static会删除上述所有动态依赖项,但是我想使用clang 6.0 是否可以在ubuntu 16.04上使用clang 6.0创建完整 ...

2018-11-06 13:43:19 0 75   clang++
6 我如何看待编译器进行的优化

是否有内置的方法可以查看go编译器进行的优化或go编译器生成的代码,例如,我如何知道是否将函数内联? ...

2016-05-05 04:59:33 1 59   go
7 编译器优化

我刚学会了编译器巧妙地用函数和变量替换调用,实际上用它们代表的代码替换它们。 考虑到这一点,第二种方法实际上会在下面更好(由于清晰度),实际上运行速度与第一种方法一样快? 第二种方法: ...

8 如何编译clang用作AVR的编译器?

我想交叉编译clang用作avr的编译器(更详细的arduino)。 我觉得我应该像下一个那样做: 从android ndk创建独立的工具链 使用正确的CC和CXX参数进行编译。 还有其他吗? 它是否支持--target = avr或如何编译? 它会像IDE自动完 ...

9 Xcode 11.0的Core Plot iOS编译器错误-Swift

我有一个使用CorePlot iOS库的应用程序。 使用Xcode 10编译时,此应用程序运行良好。但是,升级到Xcode 11.0后,出现以下错误消息: 隐式转换将签名更改:“ CGColorRenderingIntent”(又名“ enum CGColorRenderingInten ...

10 如何安装MS C#6.0编译器?

我正在尝试编译某人在使用C#6.0功能时创建的C#项目。 在以前的.NET版本中,当前的C#编译器已自动安装并准备与.NET Framework一起运行。 显然,情况已不再如此。 我目前在我的机器上安装了.NET 4.6.1,但调用csc告诉我: 该链接将我转发给Github上 ...

2016-08-22 22:03:04 1 15078   c#/ c#-6.0
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM