Дамп IR после каждой оптимизации llvm (каждый проход), как llvm ir pass, так и backend-отладки
Я хочу найти некоторые варианты отладки для clang/LLVM, которые работают как gcc -fdump-tree-all-all
-fdump-rtl-all-all
-fdump-ipa-all-all
.
В принципе, я хочу иметь отвалы LLVM IR до и после каждого прохода оптимизации, также может быть полезно иметь все отвалы AST от clang и всех этапов генерации кода (базовые фазы, выбор DAG, ISEL-SDNode, регистр выделение, MCInsts).
Мне удалось найти только clang -ccc-print-phases
, но он будет печатать только имена фаз высокого уровня, например. предобработки-компиляции собрать-ссылку; но никакой сброс IR.
Также есть Жизнь инструкции в LLVM с опцией -cc1-ast-dump
для сброса clang AST, но я хочу больше, особенно для codegen.
Ответы
Ответ 1
Похоже, вы уже обнаружили, как делать дампы на уровне Clang AST и уровне LLVM IR. Для codegen полезно следующее:
-debug
для подробной текстовой дампы выбора команды и последующих этапов. Кроме того, -view*-dags
показывают (всплывающие) DAG:
$ llc -help-hidden|grep dags
-view-dag-combine-lt-dags - Pop up a window to show dags before the post legalize types dag combine pass
-view-dag-combine1-dags - Pop up a window to show dags before the first dag combine pass
-view-dag-combine2-dags - Pop up a window to show dags before the second dag combine pass
-view-isel-dags - Pop up a window to show isel dags as they are selected
-view-legalize-dags - Pop up a window to show dags before legalize
-view-legalize-types-dags - Pop up a window to show dags before legalize types
-view-misched-dags - Pop up a window to show MISched dags after they are processed
-view-sched-dags - Pop up a window to show sched dags as they are processed
-view-sunit-dags - Pop up a window to show SUnit dags after they are processed
Они могут не отображаться, если вы не настроили и не скомпилировали LLVM с поддержкой graphviz.
Ответ 2
Не полностью о вашем вопросе, но чтобы увидеть применяемые пропуски, вы можете сделать:
clang test.c -Ofast -march=core-avx2 -mllvm -debug-pass=Arguments
Вы увидите что-то вроде:
Pass Arguments: -datalayout -notti -basictti -x86tti -targetlibinfo -jump-instr-table-info -targetpassconfig -no-aa -tbaa -scoped-noalias -basicaa -collector-metadata -machinemoduleinfo -machine-branch-prob -jump-instr-tables -verify -verify-di -domtree -loops -loop-simplify -scalar-evolution -iv-users -loop-reduce -gc-lowering -unreachableblockelim -consthoist -partially-inline-libcalls -codegenprepare -verify-di -stack-protector -verify -domtree -loops -branch-prob -machinedomtree -expand-isel-pseudos -tailduplication -opt-phis -machinedomtree -slotindexes -stack-coloring -localstackalloc -dead-mi-elimination -machinedomtree -machine-loops -machine-trace-metrics -early-ifcvt -machinelicm -machine-cse -machine-sink -peephole-opts -dead-mi-elimination -processimpdefs -unreachable-mbb-elimination -livevars -machinedomtree -machine-loops -phi-node-elimination -twoaddressinstruction -slotindexes -liveintervals -simple-register-coalescing -misched -machine-block-freq -livedebugvars -livestacks -virtregmap -liveregmatrix -edge-bundles -spill-code-placement -virtregrewriter -stack-slot-coloring -machinelicm -edge-bundles -prologepilog -machine-block-freq -branch-folder -tailduplication -machine-cp -postrapseudos -machinedomtree -machine-loops -post-RA-sched -gc-analysis -machine-block-freq -block-placement2 -stackmap-liveness -machinedomtree -machine-loops
Ответ 3
Я использую llvm-gcc-4.2
для Mountain Lion и -fdump-tree-all
работает.
gcc -fdump-tree-all -o test file1.c file2.c file1.h -I .