Каковы альтернативные способы настройки конвейера LLVM opt? - PullRequest
1 голос
/ 06 мая 2019

Вопрос

Из командной строки невозможно безопасно отключить определенный проход в O1 / O2 / O3 opt конвейере. Каковы альтернативные способы настройки или адаптации конвейера опций проходов LLVM?

История вопроса и проблема

Я пишу пропуск, чтобы обрисовать в общих чертах определенные области кода, и мне нужно уменьшить количество входов и выходов для обозначенной функции В некоторых случаях инструмент opt вызывает некоторые (инвариантные) инструкции GEP (например, из тела цикла). Это происходит с флагами O1 / O2 / O3. Я не хочу этого, так как это создает большее количество входов / выходов для моей намеченной функции. Я предпочитаю сделать GEP в описанной функции.

Неудачные попытки

  • Опционные аргументы Opt O1 показаны ниже. Я использовал команду «print-after» в opt и посмотрел на IR, чтобы найти, что преобразование «reassociate» создает это изменение. Я просмотрел опции отключения в opt --help-hidden и не нашел способа отключить этот конкретный проход или LICM.
  • Я попытался просмотреть исходный код LLVM Reassociate.cpp. Я также не смог найти какие-либо способы отключить это конкретное преобразование из кода.
  • Я также пытался вручную вводить определенные имена проходов в команду opt. Однако для некоторых проходов необходимо установить флаг O1 / 2/3. Если я не установлю флаг, эти проходы не сделают необходимое преобразование. Например, мне нужно развернуть цикл, но он не развернется без флага O1 / 2/3, даже если я явно введу флаг в команду opt.

Передать аргументы на этапе O1

 Pass Arguments:  -targetlibinfo -tti -targetpassconfig -tbaa -scoped-noalias 
    -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs 
    -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadargelim 
    -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq 
    -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh 
    -always-inline -functionattrs -domtree -sroa -basicaa -aa -memoryssa -early-cse-memssa 
    -speculative-execution -basicaa -aa -lazy-value-info -jump-threading -correlated-propagation 
    -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq 
    -opt-remark-emitter -instcombine -libcalls-shrinkwrap -loops -branch-prob -block-freq 
    -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -pgo-memop-opt -basicaa -aa 
    -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -tailcallelim -simplifycfg 
    -reassociate -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa 
    -scalar-evolution -loop-rotate -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa -loops
    -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -indvars
    -loop-idiom -loop-deletion -loop-unroll -phi-values -memdep -memcpyopt -sccp -demanded-bits -bdce -basicaa -aa -lazy-branch-prob
    -lazy-block-freq -opt-remark-emitter -instcombine -lazy-value-info -jump-threading -correlated-propagation -basicaa -aa -phi-values
    -memdep -dse -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -licm -postdomtree -adce -simplifycfg 
    -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -barrier -basiccg -rpo-functionattrs 
    -globalopt -globaldce -basiccg -globals-aa -float2int -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution
    -loop-rotate -loop-accesses -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-distribute -branch-prob -block-freq -scalar-evolution 
    -basicaa -aa -loop-accesses -demanded-bits -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-vectorize -loop-simplify -scalar-evolution 
    -aa -loop-accesses -loop-load-elim -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -domtree
    -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa 
    -scalar-evolution -loop-unroll -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification 
    -lcssa -scalar-evolution -licm -alignment-from-assumptions -strip-dead-prototypes -domtree -loops -branch-prob -block-freq -loop-simplify
    -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -branch-prob -block-freq -loop-sink -lazy-branch-prob -lazy-block-freq
    -opt-remark-emitter -instsimplify -div-rem-pairs -simplifycfg -domtree -sroa -verify -print-module

Я думаю, что мне нужно

  • , чтобы приблизить определение к его использованию (какие-либо комментарии о том, как я могу сделать это на этапе IR?) Или
  • найти способ безопасного отключения прохода в конвейере opt (licm, reassociate). Я считаю, что это невозможно из командной строки. Если мне нужно локально изменить исходный код LLVM (для взлома конвейера opt, чтобы выполнить то, что мне нужно), какое место будет правильным для этого? Любые указатели будут полезны; или
  • чтобы вручную ввести проходы, которые мне нужно выполнить в команде opt без каких-либо флагов O1 / O2 / O3 Но я не могу найти способ сделать что-то из этого, что работает. Я использую LLVM релиз 7.00 .

Возможное решение?

Могу ли я добавить только необходимые проходы (подмножество конвейера O1) в качестве AddRequired в getAnalysisUsage () в моем определении прохода и заставить opt запускать мой проход с включенным флагом O0? Будет ли это работать? Я могу попробовать это.

1 Ответ

0 голосов
/ 06 мая 2019

Согласно этой ветке лета 2018 года, нет общего способа отключить определенный проход от clang:

Некоторые проходы поддерживают опции для их отключения, например, -fno-vectorize и -fno-unroll-loops, но общего варианта нет. Поскольку в общем случае бесполезно отключать произвольные параметры, некоторые требуется ручная работа.

Кажется, что оригинальный постер в ветке работал над патчем, чтобы включить это поведение, но, насколько я могу судить, он никогда не приземлялся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...