В чем преимущество использования 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-узлов, но мне было просто любопытно, есть ли другие преимущества, кроме улучшения удобочитаемости и предупреждений при добавлении фи-узла, когда есть только один из возможных предшественников.
Спасибо! Еще один безупречный ответ! Поэтому мой следующий вопрос: я использую phi-узел в начале каждого блока (минус запись) для сообщений об ошибках и удобочитаемости. Это хороший или плохой стиль? Или это даже имеет значение, если я использую '-instcombine'? –
Я думаю, есть две причины, по которым вы можете быть обеспокоены сообщениями об ошибках и удобочитаемостью: если вы по-разному писали IR, или когда вы отлаживали интерфейс, который генерирует IR. В любом случае, то, что вы делаете с IR, полностью зависит от вас - в конце концов, конечный пользователь никогда не должен знать об IR, а LLVM не заботится (из-за InstCombine, а позже, поскольку фи-узлы полностью устранены так или иначе). –