1

我试图在不同的目标上执行一堆操作,例如 ARM、Bfin ......但是每次我用 C 编写一个简单的代码然后为每个操作编译它时,它都有 2 个加载和一个存储,这是不必要的对于每个操作。

    ldr     r2, [fp, #-24]
    ldr     r3, [fp, #-28]
    add     r3, r2, r3
    str     r3, [fp, #-20]
    ldr     r2, [fp, #-36]
    ldr     r3, [fp, #-40]
    add     r3, r2, r3
    str     r3, [fp, #-32]
    ldr     r2, [fp, #-44]
    ldr     r3, [fp, #-48]
    add     r3, r2, r3
    str     r3, [fp, #-20]
    ldr     r3, [fp, #-16]
    add     r3, r3, #1
    str     r3, [fp, #-16]

当我打开任何优化选项时,甚至-O1,它都会简单地计算结果并将其存储在输出中:

    subl    $24, %esp
    movl    $4, 4(%esp)
    movl    $.LC0, (%esp)

无论如何,我可以在不一遍又一遍地获取相同变量的情况下进行操作吗?我试过了gcc -fgcse-lm-fgcse-sm但没有奏效。

4

2 回答 2

0

这取决于操作。Gcc 无法为

int a(int b, int c)
{
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  return c;
}
于 2012-11-19T10:34:01.637 回答
0

如果您想在 gcc 中进行基准测试并避免优化器的常量折叠和死代码消除,您需要使用非常量作为输入并确保结果到达某个地方。

例如,而不是使用

int main(int argc, char** argv) {
    int a = 1;
    int b = 2;

    start_clock();
    int c =  a + b;
    int d =  c + a;
    int e =  d + b;
    stop_clock();
    output_time_needed();

    return 0;
}

你应该使用类似的东西

int main(int argc, char** argv) {
    int a = argc;
    int b = argc + 1;

    start_clock();
    int c =  a + b;
    int d =  c + a;
    int e =  d + b;
    stop_clock();
    output_time_needed();

    return e;
}
于 2012-11-19T10:59:47.820 回答