Str*_*ger 1 llvm clang llvm-ir
我正在通过Clang学习LLVM IR,并发现C函数如:
int inc(int x)
{
return x+1;
}
Run Code Online (Sandbox Code Playgroud)
生成此IR(优化已关闭):
define i32 @inc(i32 %x) #0 {
entry:
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%0 = load i32, i32* %x.addr, align 4
%add = add nsw i32 %0, 1
ret i32 %add
}
Run Code Online (Sandbox Code Playgroud)
我的问题是确切地知道为什么它首先分配一个本地(x.addr)商店,然后从它加载.
因为这是未经优化的代码.Clang(前端)花费不多(几乎任何?)时间来弄清楚如何使它发出的代码最佳.它将它留给后端优化(LLVM).局部变量在未优化模式下"在堆栈上",这意味着alloca.它还意味着x具有可寻址的位置,以后可能会或可能不会使用.如果没有优化,编译器就不会知道它是否会被使用,所以保守地生成一个可添加的位置.
int inc(int x)
{
x = x + 1;
int* px = &x;
return x;
}
Run Code Online (Sandbox Code Playgroud)
现在Clang发出:
define i32 @inc(i32 %x) #0 {
entry:
%x.addr = alloca i32, align 4
%px = alloca i32*, align 8
store i32 %x, i32* %x.addr, align 4
%0 = load i32, i32* %x.addr, align 4
%add = add nsw i32 %0, 1
store i32 %add, i32* %x.addr, align 4
store i32* %x.addr, i32** %px, align 8
%1 = load i32, i32* %x.addr, align 4
ret i32 %1
}
Run Code Online (Sandbox Code Playgroud)
现在查看%x.addr用于指针的地址?
当然,如果你通过优化器运行它,你会得到:
define i32 @inc(i32 %x) #0 {
entry:
%add = add nsw i32 %x, 1
ret i32 %add
}
Run Code Online (Sandbox Code Playgroud)
这可能更符合您对编译器的期望.
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |