我目前正在构建一个静态代码分析器,我想使用 Clang,llvm。当将 ac 代码作为输入时,我想要的输出是 SSA 形式的 LLVM-IR(作为文本文件)。我找到了这个页面(How to make clang compile to llvm IR)页面,所以我有一个 LLVM-IR,并且在 LLVM 参考页面中,它说“LLVM 是一个基于静态单一分配 (SSA) 的表示,...... 。”。所以我认为它已经是 SSA 形式了,但是当我查看输出时,它有这样的东西。
; label:3
(...)
%or.cond = or i1 %7, %8
br i1 %or.cond, label %13, label %9
; label:9
(...)
%or.cond1 = and i1 %11, %12
br i1 %or.cond1, label %16, label %13
这代表了下面的 if 语句。
if (tx < offset || ty < offset || tx >= (width-offset) || ty >= (width-offset))
但据我所知,如果它有一个 SSA 形式,它不应该分配两次相同的寄存器.. 对吗?您认为这不是 SSA 形式吗?还是我错过了什么?
无论如何,假设这不是我正在寻找的 SSA 形式,我搜索并发现我应该使用 mem2reg 优化。但是,我认为上面的代码已经是寄存器形式,但无论如何,就像我在下面两个命令中所做的那样,
clang-3.6 -emit-llvm -o foo.bc -c foo.cl opt -mem2reg -dce foo.bc
第二个命令给了我一个分段错误。所以我有点卡在这里所以有人可以告诉我我做错了什么或如何生成SSA-Form IR吗?