LLVM tem instrução phi com explicação bastante estranha:
A instrução 'phi' é usada para implementar o nó φ no gráfico SSA que representa a função.
Normalmente, é usado para implementar ramificações. Se bem entendi, é necessário para possibilitar a análise de dependências e, em alguns casos, pode ajudar a evitar carregamentos desnecessários. No entanto, ainda é difícil entender o que ele faz exatamente.
O exemplo do caleidoscópio explica muito bem para o if
caso. No entanto, não está claro como implementar operações lógicas como &&
e ||
. Se eu digitar o seguinte no compilador llvm online :
void main1(bool r, bool y) {
bool l = y || r;
}
As últimas linhas me confundem completamente:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Parece que o nó phi produz um resultado que pode ser usado. E fiquei com a impressão de que o nó phi apenas define de quais caminhos os valores vêm.
Alguém poderia explicar o que é um nó Phi e como implementar ||
com ele?
phi
nó é uma solução para o problema em compiladores para converter o IR na forma de "atribuição única estática". Para entender melhor a solução, sugiro entender melhor o problema. Então eu irei um acima de você " Por que é ophi
nó "