Numeración de valores


La numeración de valores es una técnica para determinar cuándo dos cálculos en un programa son equivalentes y eliminar uno de ellos con una optimización que preserva la semántica.

La numeración de valor global (GVN) es una optimización del compilador basada en la representación intermedia del formulario de asignación única estática (SSA). A veces ayuda a eliminar el código redundante que la eliminación de subexpresiones comunes (CSE) no hace. Sin embargo, al mismo tiempo, CSE puede eliminar código que GVN no hace, por lo que ambos se encuentran a menudo en compiladores modernos. La numeración de valores globales es distinta de la numeración de valores locales en que las asignaciones de valor-número también se mantienen a través de los límites de bloques básicos, y se utilizan diferentes algoritmos para calcular las asignaciones.

La numeración de valores globales funciona asignando un número de valor a variables y expresiones. Se asigna el mismo número de valor a aquellas variables y expresiones que sean demostrablemente equivalentes. Por ejemplo, en el siguiente código:

una buena rutina de GVN asignaría el mismo número de valor a wy x, y el mismo número de valor a yy z. Por ejemplo, el mapa constituiría un mapeo de valor-número óptimo para este bloque. Con esta información, el fragmento de código anterior se puede transformar de forma segura en:

Dependiendo del código que sigue a este fragmento, la propagación de copias puede eliminar las asignaciones ay xpara z.

La razón por la que GVN a veces es más poderoso que CSE proviene del hecho de que CSE coincide con expresiones léxicamente idénticas mientras que GVN intenta determinar una equivalencia subyacente. Por ejemplo, en el código: