是否针对C标准进行了有条件的移动优化?

yeshengm :

使用条件移动(汇编cmov)来优化?:C中的条件表达式是一种常见的优化方法。但是,C标准说:

第一个操作数被求值;在它的评估与第二个或第三个操作数的评估(无论哪个被评估)之间都有一个序列点。仅当第一个操作数不等于0时,才对第二个操作数求值;仅当第一个操作数等于0时,才计算第三个操作数;结果是第二个或第三个操作数的值(以所评估的为准),转换为下面描述的类型。110)

例如下面的C代码

#include <stdio.h>

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    int c= a > b ? a + 1 : 2 + b;
    printf("%d", c);
    return 0;
}

将生成优化的相关asm代码,如下所示:

call    __isoc99_scanf
movl    (%rsp), %esi
movl    4(%rsp), %ecx
movl    $1, %edi
leal    2(%rcx), %eax
leal    1(%rsi), %edx
cmpl    %ecx, %esi
movl    $.LC1, %esi
cmovle  %eax, %edx
xorl    %eax, %eax
call    __printf_chk

根据标准,条件表达式将只评估一个分支。但是这里两个分支都被评估,这违反了标准的语义。是否针对C标准进行了优化?还是许多编译器优化与语言标准不一致?

安蒂·哈帕拉(Antti Haapala):

由于“按原样规则”,即C11 5.1.2.3p6优化是合法的

一致的实现只是需要产生一个程序,当运行产生相同的可观察行为作为使用抽象语义程序的执行将产生该标准的其余部分仅描述了这些抽象语义

编译后的程序在内部执行的操作完全无关紧要,唯一重要的是,在程序结束时,它没有任何其他可观察到的行为,只是读取ab并打印出值a + 1b + 2取决于哪个ab更大,除非发生导致行为不确定的事件。(错误的输入导致a,b未初始化,因此访问未定义;也可能发生范围错误和有符号的溢出。)如果发生未定义的行为,则所有投注均关闭。


由于必须严格根据抽象语义来评估对volatile变量的访问,因此可以通过使用以下方法摆脱条件移动volatile

#include <stdio.h>

int main() {
    volatile int a, b;
    scanf("%d %d", &a, &b);
    int c = a > b ? a + 1 : 2 + b;
    printf("%d", c);
    return 0;
}

编译为

        call    __isoc99_scanf@PLT
        movl    (%rsp), %edx
        movl    4(%rsp), %eax
        cmpl    %eax, %edx
        jg      .L7
        movl    4(%rsp), %edx
        addl    $2, %edx
.L3:
        leaq    .LC1(%rip), %rsi
        xorl    %eax, %eax
        movl    $1, %edi
        call    __printf_chk@PLT

        [...]

.L7:
        .cfi_restore_state
        movl    (%rsp), %edx
        addl    $1, %edx
        jmp     .L3

通过我的GCC Ubuntu 7.2.0-8ubuntu3.2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否对JavaScript引擎尾部调用(TCO)进行了优化?

Java编译器是否针对不同的语言环境进行了翻译?

如何确定Swift是否使用优化进行了编译

针对App Store中的iPhone 6信息文本进行了优化

微观优化,是否已通过现代浏览器进行了优化?

是否对克隆语句进行了优化?

Kotlin的Float,Int等是否已针对JVM中的内置类型进行了优化?

Python是否有条件NOT语句

有没有办法找到针对智能屏幕设备进行了优化的操作列表?

Node.js:异步函数中是否对尾部调用进行了优化?

如何检查我的应用程序是否已针对Android进行了电池优化配置?

将数据框投射到数据集后的选择是否进行了优化?

是否针对默认的相等运算符进行了C ++ 20功能测试?

Visual Studio是否针对超线程微处理器进行了优化?

是否对if(0)和if(1)语句进行了优化?

htaccess是否有条件

需要针对现有条件的php循环

Ubuntu是否针对多核CPU进行了优化?

针对循环python进行了优化

是否仅对Azure表存储分区键查询进行了优化?

苹果是否已删除“针对iPhone 6和iPhone 6 Plus进行了优化”?

对有条件的行进行求和

Ubuntu是否已针对KRACK攻击进行了修补?

是否有条件检查位置

在XML文件中具有所有参数是否进行了优化?

OpenCV是否在调试模式下进行了优化?

Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

数组是否在 jOOQ 和 PostgreSQL 中进行了优化?

这个着色器是否有条件对性能不利,可以优化吗?