gcc 优化器会根据编译时常量推导出数学表达式吗?

jvlzgdj9  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(119)

如果我有一些依赖于输入的数学方程,这些输入可以是零或非零(模板参数,在编译时已知),优化器是否会评估这些方程并优化它知道将评估为0或1的表达式。
例如:

double x = y * Eval<type>::value;

如果Eval<type>::value0,则x将始终是0

double x = exp(y * Eval<type>::value);

如果Eval<type>::value0,则x将始终是1
优化器能否解决这个问题,并在代码中的其他地方用01替换x,或者这些计算将在运行时执行?
我正在使用gcc 4.7和-O3

kpbwa7wx

kpbwa7wx1#

编辑:我错了,编译器在使用浮点数时会按预期工作。

好吧,-O3中的gcc 4.6.3似乎确实做到了这一点,只要表达式是整数相关的。
示例代码:

#include <cstdio>
inline int x(double y)
{
   if (y == 0)
      printf("Hello bob3\n");
   else
      printf("Why do I bother\n");

};

const int c = 0;

int main()
{
   int f;
   scanf("%d",&f);

   x(f * c);
}

生成的程序集

.file   "foo.cpp"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "%d"
.LC1:
    .string "Hello bob3"
    .section    .text.startup,"ax",@progbits
    .p2align 4,,15
    .globl  main
    .type   main, @function
main:
.LFB13:
    .cfi_startproc
    subq    $24, %rsp
    .cfi_def_cfa_offset 32
    movl    $.LC0, %edi
    xorl    %eax, %eax
    leaq    12(%rsp), %rsi
    call    scanf
    movl    $.LC1, %edi
    call    puts
    xorl    %eax, %eax
    addq    $24, %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE13:
    .size   main, .-main
    .ident  "GCC: (Debian 4.6.3-1) 4.6.3"
    .section    .note.GNU-stack,"",@progbits

相关问题