为什么 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 进行测试后,我得出的结论是,有一个隐藏的优化正在进行,无法在时刻.

相关:

由于无法禁用隐藏优化,我将只使用按预期输出的旧版本编译器。