Value Numbering é uma tecnica para determinas se duas computações no programa são equivalentes e eliminar uma delas, preservando a semantica do programa.
GVN é uma tecnica de otimização de compiladores basiado na IR SSA. Global porque o mapeamento é feito entre basic blocks boundaries também. Funciona atribuindo valores numericos para variaveis e expressões, e o mesmo valor é atribuido para variaveis e expressoes equivalentes. Por exemplo:
w := 3
x := 3
y := x + 4
z := w + 4Um GVN pode atribuir o mesmo valor para w e x,e outro valor para y e z. Um exemplo de mapeamento: {w->1, x->1, y->2, z->2}. Assim o código acima pode ser tranformado em:
w := 3
x := w
y := w + 4
z := yLVN é uma tecnica de otimização de compiladores que tenta achar multiplas instancias para espressoes equivalentes e troca-las para a primeira ocorrencia. Diferente de GVN, LVN opera apenas em um unico Basic Block. Atribui um unico numero para cada operação e guarda essas associações, as proximas instruções vao procurar nesse mapeamento, e se encontraram funções iguais, troque essa instrução pelo resultado anterior. Por exemplo:
a ← 4 a is tagged as #1
b ← 5 b is tagged as #2
c ← a + b c (#1 + #2) is tagged as #3
d ← 5 d is tagged as #2, the same as b
e ← a + d e, being '#1 + #2' is tagged as #3