我编写了以下 C 代码,其中变量 X 被分配了两次:
int main()
{
int x;
x = 10;
x = 20;
return 0;
}
使用以下命令编译并生成 IR 表示
clang -emit-llvm -c ssa.c
红外生成
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
entry:
%retval = alloca i32, align 4
%x = alloca i32, align 4
store i32 0, i32* %retval
store i32 10, i32* %x, align 4
store i32 20, i32* %x, align 4
ret i32 0
}
如果我对 SSA 格式的理解是正确的,我们应该在本例中将 x1 和 x2 视为生成的两个 LLVM IR 变量并分别分配两个值 10 和 20。是否有一些我们应该编译以获得 SSA IR 表示的特定选项,或者我对 IR 表示的理解不正确?请指教。
编辑:正如在一个答案中所建议的,使用 -mem2reg 优化传递给了我以下输出
clang -c -emit-llvm ssa.c -o ssa.bc
opt -mem2reg ssa.bc -o ssa.opt.bc
llvm-dis ssa.opt.bc
cat ssa.opt.ll
生成的结果 IR
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
entry:
ret i32 0
}
看起来整个 x 分配都使用 mem2reg 优化进行了优化。还有其他方法可以生成和保留不同的 x 值吗?