【发布时间】:2015-07-16 09:27:51
【问题描述】:
我正在通过 Clang 学习 LLVM IR,发现 C 函数如下:
int inc(int x)
{
return x+1;
}
生成此 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
}
我的问题是确切地知道为什么它首先分配一个本地 (x.addr) 存储,然后从中加载。
【问题讨论】:
-
没关系,
mem2regpass 会处理所有多余的allocas。 -
@SK-logic:现在主要是 SROA :)
-
@EliBendersky:你为什么说“它主要是聚合的标量替换”?
-
@Stringer:我的意思是在今天的优化管道中,SROA 进行了这种转换(分配到 SSA 值)