Получение LLVM-IR в форме SSA
В настоящее время я создаю статический анализатор кода, и я хотел использовать Clang, llvm. То, что я хотел в качестве вывода, - это LLVM-IR в форме SSA (в виде текстового файла) при предоставлении кода ac в качестве входных данных. Я нашел эту страницу ( Как заставить clang скомпилироваться в 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
вторая команда дает мне ошибку сегментации. Я застрял здесь, и кто-нибудь может сказать мне, что я сделал что-то не так или как сгенерировать IR SSA-формы?