2017-02-27 11 views
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 
} 

它为什么添加这些指令?我对此并不确定,但似乎它是在抄袭论证。

+0

您是否启用了优化?显示你用来编译的标志 –

+0

@ChrisBeck我用过了'-S -emit-llvm' – user6245072

+2

它将参数复制到局部变量。用'-S -emit-llvm'生成未优化的代码,所以可以用'-S -emit-llvm -O3'或'-O2'来看看不同的东西。为什么它不是自动优化的?因为你没有要求编译器做魔术,所以它会生成一个表示,它可能在预生成AST(基于SSA)中生成。 –

回答

2

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

如果您尝试 opt --mem2reg filename.ll -S 您会看到您得到的内容与您的预期相似。

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

mem2reg传递尝试将“变量”转换为llvm临时对象。它只为那些不采取地址的变量做这个。

相关问题