8

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

4

1 回答 1

4

LLVM 传递mem2regreg2mem将代码转换为 SSA 格式/从 S​​SA 格式转换代码。您可以使用opt工具运行它们。

于 2017-05-21T07:53:17.740 回答