2 days ago
- ZJIT使用高级SSA中间表示(HIR)将Ruby的YARV字节码编译为机器码,该表示使用控制流图和块参数而非phi节点。
- Ruby的默认位置参数在调用时求值,导致字节码中有多个入口点,具体取决于传递的参数数量;JIT必须处理这些单独的入口块。
- HIR支持多个函数入口点(解释器、JIT和默认参数存根),每个入口点都有镜像函数参数的块参数。
- 多个入口点使支配者分析复杂化:没有单一的起始块,因此反向后序遍历和支配者计算需要特殊处理。
- 考虑了三种方法:(1)在支配者算法中特殊处理入口块,(2)合成一个超级入口块(带有虚拟或真实块和LoadArg指令),(3)为每个入口点复制CFG。
- 选择的方法是2.b:合成一个带有LoadArg指令的超级入口块,这为未来的特化提供了灵活性,而无需强制代码复制。
- 该问题类似于在后支配者分析中处理多个返回指令,常见的解决方案是分支到单个返回。