我编写了以下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变量,它们分别生成并分配了两个值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值吗?
发布于 2017-05-21 07:53:17
LLVM将mem2reg和reg2mem转换代码传递给/从SSA表单。您可以使用opt工具运行它们。
https://stackoverflow.com/questions/44092972
复制相似问题