从字节码到HIR
正如之前看到的,C1的HIR是一个基于静态单赋值的图IR,由基本块构成控制流图,由静态单赋值指令构成基本块,如图8-1所示。
所有的指令都派生自Instruction类,其中,BlockBegin表示基本块的起点,BlockEnd表示基本块的结束。BlockBegin和BlockEnd合起来表示一个基本块,BlockBegin的predecessors表示当前基本块的前驱块,BlockEnd的successors表示当前基本块的后继块,它们连接起来组成一幅控制流图。BlockBegin的next指向基本块的下一条指令,如LogicOp、LoadField等;下一条指令的next又指向再下一条,如此反复,最终形成一个指令序列,即基本块内部的SSA指令链表。
build_hir()会创建一个GraphBuilder对象,而这个创建的过程就是字节码转换为HIR的过程。该过程主要分为两步:首先使用BlockListBuilder划分出所有基本块,找出循环头,然后使用SSA指令(即Instruction的子类)填充每个基本块。
识别基本块
字节码是线性结构,所以在识别时可以使用BlockListBuilder线