为什么 gcc 不优化立即数?
Why does gcc not optimize the immediate?
无论优化级别如何,在汇编级别加载立即值的指针加载的值略有不同,在取消引用时使用固定偏移量进行更正。
例如
int test(){
int *tmp = (int*)0x30000004;
tmp[0]++;
return tmp[1];
}
使用 mips-linux-gnu-gcc-8 -O3 -nostdlib test.c -c
编译生成以下程序集:
Disassembly of section .text:
00000000 <test>:
0: 3c033000 lui v1,0x3000
4: 8c640004 lw a0,4(v1)
8: 8c620008 lw v0,8(v1)
c: 24840001 addiu a0,a0,1
10: 03e00008 jr ra
14: ac640004 sw a0,4(v1)
如您所见,$v1
寄存器加载了 0x30000000
,然后偏移量全部移动了 +4
。
为什么 GCC 这样做?
是否可以停用?
最终目标是得到这样的东西:
Disassembly of section .text:
00000000 <test>:
li v1,0x30000004
lw a0,0(v1)
lw v0,4(v1)
addiu a0,a0,1
jr ra
sw a0,0(v1)
一旦启用优化,预期结果就会发生变化,-O1
。
在使用 -O1
+ -fno*
标记将其变成 -O0
进行测试后,我得出的结论是,有一个隐藏的优化正在进行,无法在时刻.
相关:
由于无法禁用隐藏优化,我将只使用按预期输出的旧版本编译器。
无论优化级别如何,在汇编级别加载立即值的指针加载的值略有不同,在取消引用时使用固定偏移量进行更正。
例如
int test(){
int *tmp = (int*)0x30000004;
tmp[0]++;
return tmp[1];
}
使用 mips-linux-gnu-gcc-8 -O3 -nostdlib test.c -c
编译生成以下程序集:
Disassembly of section .text:
00000000 <test>:
0: 3c033000 lui v1,0x3000
4: 8c640004 lw a0,4(v1)
8: 8c620008 lw v0,8(v1)
c: 24840001 addiu a0,a0,1
10: 03e00008 jr ra
14: ac640004 sw a0,4(v1)
如您所见,$v1
寄存器加载了 0x30000000
,然后偏移量全部移动了 +4
。
为什么 GCC 这样做?
是否可以停用?
最终目标是得到这样的东西:
Disassembly of section .text:
00000000 <test>:
li v1,0x30000004
lw a0,0(v1)
lw v0,4(v1)
addiu a0,a0,1
jr ra
sw a0,0(v1)
一旦启用优化,预期结果就会发生变化,-O1
。
在使用 -O1
+ -fno*
标记将其变成 -O0
进行测试后,我得出的结论是,有一个隐藏的优化正在进行,无法在时刻.
相关:
由于无法禁用隐藏优化,我将只使用按预期输出的旧版本编译器。