为什么clang编译器将这些指令放在每个带参数的函数的开头?

时间:2017-02-27 12:15:56

标签: clang llvm llvm-ir

我使用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
}

为什么会添加这些指令?我不确定,但似乎是在复制这个论点。

1 个答案:

答案 0 :(得分:2)

这是因为你没有运行mem2reg传递。这些变量被认为占用了堆栈上的空间并被分配了。

如果你试试 opt --mem2reg filename.ll -S 你会看到你得到的东西与你的期望相似。

mem2reg也是O1,O2和O3的一部分。

mem2reg传递尝试将“变量”转换为llvm temporaries。它仅对那些未被采用的变量执行此操作。