【问题标题】:How to generate LLVM SSA Format如何生成 LLVM SSA 格式
【发布时间】:2017-10-20 22:29:25
【问题描述】:

我编写了以下 C 代码,其中变量 X 被分配了两次:

int main()
{
        int x;
        x = 10;
        x = 20;
        return 0;
}

使用以下命令编译并生成 IR 表示

clang -emit-llvm -c ssa.c

IR 生成

; 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 值吗?

【问题讨论】:

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


    【解决方案1】:

    LLVM 传递 mem2regreg2mem 将代码与 SSA 形式相互转换。您可以使用opt 工具运行它们。

    【讨论】:

    • 我试过 mem2reg opt 但它删除了变量 x 的使用(请参阅上面的编辑)。我还尝试在 if else 语句中使用 x,它仍然完全删除 x。您能否提供 IR 输出和/或确切的命令,这些命令将为我提供 x1 和 x2 变量的示例程序,该示例程序对一个变量进行了多次赋值,并且结果 IR 有多个变量?
    • 尝试在每次赋值后将x 变量传递给某个函数。您可以使用clang -S -emit-llvm 直接发出.ll。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2015-08-25
    • 2012-11-07
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多