c - 为什么LLVM要为同一个程序多加两条指令?

标签 c gcc assembly llvm instructions

我正在编译这个 C 程序并比较生成的汇编代码:

int main(){ return 0; }

GCC给出这个主要功能(cc hello.c -S):

_main:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    $0, %eax
    leave
    ret

LLVM给出这个主要功能(clang hello.c -S):

_main:
Leh_func_begin0:
    pushq   %rbp
Ltmp0:
    movq    %rsp, %rbp
Ltmp1:
    movl    $0, %eax
    movl    $0, -4(%rbp)
    popq    %rbp
    ret
Leh_func_end0:

movl $0, -4(%rbp)popq %rbp 有什么用?在堆栈上移动一些东西然后直接弹出它对我来说似乎没用。

最佳答案

movl $0, -4(%rbp) 指令已失效,因为这是未优化的代码。尝试将 -O 传递给两个编译器,看看有什么变化。

关于c - 为什么LLVM要为同一个程序多加两条指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4903912/

相关文章:

C++11 类内引用成员初始化生成错误拷贝

c++ - x64 程序集双字上的符号扩展

assembly - 如何将 XMM 128 位寄存器拆分为两个 64 位整数寄存器?

mysql - C Realloc 追加字符串 MySQL 连接器

c++ - 如何找到未初始化的堆栈变量

c - _mm_stream_load_si128 (movntdqa) 是否修改其参数指向的内存?

assembly - 我如何获得负股息的正模

objective-c - 在 iOS 中读取文件时出现 malloc 错误

c - GCC 编译器中的优化对溢出条件有什么影响

linux - ubuntu make 显示完整命令