如何生成LLVM SSA格式

时间:2017-05-21 03:45:38

标签: clang llvm llvm-clang llvm-ir ssa

我编写以下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值?

1 个答案:

答案 0 :(得分:4)

LLVM通过mem2regreg2mem将代码转换为SSA表单或从SSA表单转换代码。您可以使用opt工具运行它们。