【问题标题】:Why does gcc not optimize the immediate?为什么 gcc 不优化即时?
【发布时间】:2021-11-22 18:03:29
【问题描述】:

无论优化级别如何,在程序集级别加载立即值的指针都会加载一个稍微不同的值,在取消引用时使用固定偏移量进行更正。

例如

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)

【问题讨论】:

标签: gcc optimization mips


【解决方案1】:

一旦启用优化,预期结果就会发生变化,-O1

在使用-O1 + -fno* 标志将其转换为-O0 进行测试后,我得出的结论是目前无法禁用隐藏的优化。

相关:g++ O1 is not equal to O0 with all related optimization flags

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

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2016-09-04
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2016-09-22
    相关资源
    最近更新 更多