1
我用铛编译此代码-S -emit-llvm
:为什么clang编译器将这些指令放在每个带参数的函数的开始处?
int sub2(int n) {
return n - 2
}
,这是它输出的代码:
; Function Attrs: nounwind
define i32 @_Z4sub2i(i32) #0 {
%2 = alloca i32, align 4
store i32 %0, i32* %2, align 4
%3 = load i32, i32* %2, align 4
%4 = sub nsw i32 %3, 2
ret i32 %4
}
不过,我可以写相同的功能:
define i32 @sub2(i32) #0 {
%2 = sub i32 %0, 2
ret i32 %2
}
它为什么添加这些指令?我对此并不确定,但似乎它是在抄袭论证。
您是否启用了优化?显示你用来编译的标志 –
@ChrisBeck我用过了'-S -emit-llvm' – user6245072
它将参数复制到局部变量。用'-S -emit-llvm'生成未优化的代码,所以可以用'-S -emit-llvm -O3'或'-O2'来看看不同的东西。为什么它不是自动优化的?因为你没有要求编译器做魔术,所以它会生成一个表示,它可能在预生成AST(基于SSA)中生成。 –