我使用clang用-S -emit-llvm
编译此代码:
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
}
为什么会添加这些指令?我不确定,但似乎是在复制这个论点。
答案 0 :(得分:2)
这是因为你没有运行mem2reg传递。这些变量被认为占用了堆栈上的空间并被分配了。
如果你试试
opt --mem2reg filename.ll -S
你会看到你得到的东西与你的期望相似。
mem2reg也是O1,O2和O3的一部分。
mem2reg传递尝试将“变量”转换为llvm temporaries。它仅对那些未被采用的变量执行此操作。