我编写以下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
生成生成的红外
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
entry:
ret i32 0
}
看起来整个x赋值使用mem2reg优化进行了优化。是否有其他方法可以生成和保留不同的x值?