2015-10-08 8 views
1

В чем преимущество использования phi-узла, когда есть только один возможный предшественник? Например, когда я запускаю opt -loop-<some specific pass> some-cool-file.ll -S, на выходе часто будет фид-узел с одним возможным предшественником, если я еще не добавил его.LLVM IR phi node с единственным возможным предшественником

Пример:

endcond.loopexit:      ; preds = %loop <- note: one predecessor 
    %res.lcssa = phi i64 [ %res, %loop ] ; I'm assuming this is from the 
    br label %endcond     ; loop-closed ssa form pass 

endcond: 
    %var = phi i64 [ %res.lcssa, %endcond.loopexit ], <other-pred> 

Если есть только один возможный предшественник не должен выше быть точно такой же, как и

endcond.loopexit:      ; preds = %loop 
    br label %endcond     ; res assigned a value in %loop 

endcond: 
    %var = phi i64 [ %res, %endcond.loopexit ], <other-pred> ; use %res directly 

Не поймите меня неправильно, я огромный поклонник phi-узлов, но мне было просто любопытно, есть ли другие преимущества, кроме улучшения удобочитаемости и предупреждений при добавлении фи-узла, когда есть только один из возможных предшественников.

ответ

4

Совершенно верно, вы правы, что эти два эквивалента. Тем не менее, предыдущий цикл находится в форме LCSSA (замкнутый замкнутый SSA). Эта форма предоставляет некоторые очень полезные гарантии, которые упрощают многие оптимизации циклов.

Это не относится к LLVM, GCC делает это также. У них есть хорошее резюме конкретных преимуществ формы LCSSA: https://gcc.gnu.org/onlinedocs/gccint/LCSSA.html

Во время типичного конвейера прохождения компиляции узлы LCSSA PHI будут удалены после оптимизации цикла с помощью прохода InstCombine. (Если вы запустите опцию с -instcombine после всех ваших оптимизаций цикла, вы получите ожидаемый результат.)

+0

Спасибо! Еще один безупречный ответ! Поэтому мой следующий вопрос: я использую phi-узел в начале каждого блока (минус запись) для сообщений об ошибках и удобочитаемости. Это хороший или плохой стиль? Или это даже имеет значение, если я использую '-instcombine'? –

+0

Я думаю, есть две причины, по которым вы можете быть обеспокоены сообщениями об ошибках и удобочитаемостью: если вы по-разному писали IR, или когда вы отлаживали интерфейс, который генерирует IR. В любом случае, то, что вы делаете с IR, полностью зависит от вас - в конце концов, конечный пользователь никогда не должен знать об IR, а LLVM не заботится (из-за InstCombine, а позже, поскольку фи-узлы полностью устранены так или иначе). –