我目前正在构建一个静态代码分析器,我想使用Clang,llvm。当给出c代码作为输入时,我想要的输出是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表格IR?