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.

ComponenteDescripción
RegInstructionEnumeración de instrucciones: Move, LoadImm/LoadFloat, RegAdd/RegSub/RegMul/RegDiv, RegCmp (con CmpOp), lógicas, LoadVar/StoreVar, Jump/JumpIfFalse/Label, Call, Return, Nop
CmpOpOperadores de comparación: Eq, Ne, Lt, Gt, Le, Ge
BasicBlockBloque con label, lista de instrucciones y un terminator
RegProgramPrograma 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.