c++ - 乘以0优化

标签 c++ c optimization

假设我有:

double f(const double *r) {
    return 0*(r[0]*r[1]);
}

如果值可能是 inf 或 nan,编译器是否应该能够优化段,还是必须执行操作?

gcc -O3 -S test.c:

        .file   "test.c"
        .text
        .p2align 4,,15
.globl f
        .type   f, @function
f:
.LFB0:
        .cfi_startproc
        movsd   (%rdi), %xmm0
        mulsd   8(%rdi), %xmm0
        mulsd   .LC0(%rip), %xmm0
        ret
        .cfi_endproc
.LFE0:
        .size   f, .-f
        .section        .rodata.cst8,"aM",@progbits,8
        .align 8
.LC0:
        .long   0
        .long   0
        .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
        .section        .note.GNU-stack,"",@progbits

似乎没有消除?

啊哈:

gcc -O3  -ffast-math  -S test.c

        .file   "test.c"
        .text
        .p2align 4,,15
.globl f
        .type   f, @function
f:
.LFB0:
        .cfi_startproc
        xorpd   %xmm0, %xmm0
        ret
        .cfi_endproc
.LFE0:
        .size   f, .-f
        .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
        .section        .note.GNU-stack,"",@progbits

最佳答案

阻止优化的不仅是 infNaN,它也是符号 - 0.0 * 负面的东西是 -0.0,否则是0.0,所以你实际上必须计算r[0]*r[1]的符号。

关于c++ - 乘以0优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4956033/

相关文章:

c - C 中 printf() 的异常行为?

python - 如何优化此 Google App Engine 代码?

optimization - 对 CUDA 内核中的不同部分进行计时

c++ - 错误使: *** with g++

c++ - Debian 上的 Qt5 示例包

将二进制转换为十六进制再转换为十进制

c - 如何在 C 中使用动态多维数组?

algorithm - 具有适当比率约束和重量约束的背包算法

c++ - 二进制搜索树析构函数 C++

java - 用于在 xUnit 测试模式中检索代码指标的工具?