IR Register-Based (register_ir.rs)
Archivo: src/register_ir.rs (309 líneas)
¿Por qué existe?
Define el IR register-based del backend JIT de Forja: una representación intermedia entre el bytecode stack-based y la generación de código nativo. En lugar de una pila, cada instrucción nombra explícitamente sus operandos en registros virtuales (VirtReg), lo que permite aplicar register allocation sobre ella.
Arquitectura / Estructuras clave
El módulo define las instrucciones, los bloques, el programa y el análisis de liveness necesario para el allocador.
| Componente | Descripción |
|---|---|
RegInstruction | Enumeración de instrucciones: Move, LoadImm/LoadFloat, RegAdd/RegSub/RegMul/RegDiv, RegCmp (con CmpOp), lógicas, LoadVar/StoreVar, Jump/JumpIfFalse/Label, Call, Return, Nop |
CmpOp | Operadores de comparación: Eq, Ne, Lt, Gt, Le, Ge |
BasicBlock | Bloque con label, lista de instrucciones y un terminator |
RegProgram | Programa completo: blocks + next_vreg; aloca registros virtuales con alloc_vreg() |
get_uses_defs(&RegInstruction) | Extrae los pares (VirtReg, RegClass) usados y los definidos por cada instrucción, información base para el análisis de liveness |
compute_live_intervals(&RegProgram) | Calcula los live intervals de cada VirtReg (start, end, clase, posiciones de uso) recorriendo el programa; registra usos para soportar interval splitting |
Cómo se integra
Es el punto medio del backend register-based:
Bytecode → (stack_to_reg) → IR register-based → (register_alloc) → IR + asignaciones → (codegen_reg) → x86-64 El IR se consume por register_alloc.rs (asigna registros físicos a los virtuales) y sus LiveIntervals alimentan al allocador de linear scan.
Representación de destino: Los registros virtuales son simples
usizes asignados secuencialmente; la misma VirtReg puede terminar en un registro físico PhysReg o en un slot de stack según decida el allocador.Nota de clases: Aunque
LoadFloat y LoadVar de clase Float existen, la mayoría de las instrucciones reportan RegClass::Integer en get_uses_defs, por lo que el análisis de liveness trata los valores como enteros de 64 bits salvo en los casos explícitos.