Por curiosidad, descubrí que en la implementación de v8 JS Bytecode es ejecutado por Interpreter-Assembler y luego por CodeAssembly. ¿Por qué hay un ensamblador de intérpretes entre el código de bytes y el código de máquina? ¿Hay alguna manera de traducir Interpreter Assembler (me imagino que es una especie de IR) a LLVM ir para que sea una representación llvm ir más cercana al bytecode js?
Parece haber un malentendido: el InterpreterAssembler se usa para crear los controladores de bytecode durante el proceso de compilación de V8. No está involucrado en la ejecución del código de bytes (y, de hecho, ni siquiera se envía como parte del binario V8 final). Además, el código de bytes no se traduce a código de máquina antes de ejecutarse (es por eso que lo llamamos "intérprete"; si primero generó código de máquina, lo llamaríamos "compilador").
El InterpreterAssembler produce una forma particular de IR que utiliza el compilador "Turbofan" de V8. No existe una forma de convertirlo a LLVM IR.