如何优化负载和存储?

时间:2012-11-18 17:33:59

标签: optimization gcc load store

我正在尝试在不同的目标上执行一堆操作,例如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,但这不起作用。

2 个答案:

答案 0 :(得分:0)

这取决于操作。 Gcc无法找出

的高级优化
int a(int b, int c)
{
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  return c;
}

答案 1 :(得分: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;
}