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