Descripción general del compilador: concepto de asignación de registros

La siguiente es una instrucción de ensamblaje abstracta. 

cargar a en r1

cargar b a r2

mult r1 r2 a r3

La primera afirmación es por qué aquí se llama instrucción de ensamblaje abstracta porque asumimos que hay infinitos registros y siempre podemos r1 r2 r3 r4... Llamamos a estos registros registros virtuales (registros virtuales) y el trabajo de asignación de registros en el backend es Mapear estos registros virtuales a registros reales.
En segundo lugar, se descubre que tanto r1 como r2 almacenan variables reales (variables) a y b, mientras que r3 es una variable temporal transitoria (temporales). El ensamblaje real no tiene el concepto de variables En realidad solo registros y direcciones de memoria

En el proceso de optimización, por ejemplo, la eliminación de subexpresiones comunes (CSE) aumentará el número de variables para reducir los cálculos repetidos. Una vez que haya demasiadas variables, la carga sobre los registros aumentará, lo que provocará que algunas variables no se almacenen en la forma más rápida. registros pero almacenados en la memoria. Puede resultar contraproducente y ralentizar la velocidad de ejecución del código.

¿Cómo convertir un AST en una instrucción de ensamblaje abstracta? Aquí hay una característica que es profunda primero. Solo los niveles inferiores a*b y c*d se pueden calcular antes de que se pueda realizar la operación de suma de la capa superior. Solo después de operación de suma se puede realizar la operación de asignación.

Lenguaje intermedio optimizado para compilador ILOC (lenguaje intermedio para optimizar el compilador)

cargar un  \flecha correcta r1

cargarAI  r_ {arp}, @a  \flecha correcta r1       

// La primera línea de instrucciones de ensamblaje abstractas es en realidad una simplificación de la segunda línea. La segunda línea es la forma completa de escribir instrucciones de ensamblaje abstractas.

// pero generalmente abreviado

 A significa dirección, I significa inmediato y loadAI en conjunto significa cargar la dirección inmediatamente. Significa
r_ {arp}puntero de registro de activación. @a significa desplazamiento.


Aquí puede ver un registro de actividad, a menudo llamado marco de pila (marco de pila). La función principal llama a la función f1. La función f1 llama internamente a f2. Hay una variable abc en f2, que es 0xff00, que actúa como un segmento r_ {arp}. registro, y @a es el desplazamiento. La función del registro de puntero de instrucción

asignación de registros

Supongamos que tenemos tres registros físicos p1 p2 p3 para asignar todos los registros virtuales a registros físicos.

Primero agrega una parte azul extra.

Obviamente, un ciclo de vida más largo corresponde a una mayor presión sobre los registros. 

 Cuando se elimina la última línea y el color azul se oscurece

Se puede ver que la función de asignación de registros del backend intentará utilizar la menor cantidad de registros posible para realizar los cálculos y solo cuando el ciclo de vida de los datos en otros registros no haya terminado se utilizarán nuevos registros.

¿Qué pasa si sólo hay dos registros físicos p1 y p2? 

 Se puede ver que cuando solo hay dos registros físicos, cada registro virtual no se puede asignar a un registro físico, sino que debe almacenarse temporalmente en la memoria, en este caso se llama derrame en inglés, que significa desbordamiento en la memoria. La asignación de registros será la máxima posible.Evitar derrames

Supongo que te gusta

Origin blog.csdn.net/weixin_43754049/article/details/126174704
Recomendado
Clasificación