数据流分析阶段分析由前端生成的中间代码,并把这些中间代码表示转换成高级表达式。中间代码是一个汇编类型的表示法它使用寄存器和条件码,这种类型的代码和高级语言代码相差甚远,需要被进一步转换成高级语言代码相近的高级表达式,这个转化过程主要包括以下几个方面:无用指令的清除、条件码的清除、寄存器参数和返回寄存器的确定、中间过渡寄存器和指令的清除、实际参数的确定、以及在跨子程序调用之间传播数据类型。
寄存器传播属于数据流分析的一部分,它清除中间过渡寄存器和指令,重建在编译过程中丢失的部分信息,生成与高级语言相近的高级表达式。现有的做法是在数据流分析阶段就进行寄存器的传播。由于此时还没有进行控制流分析,基本块之间的关系无法获得,因而寄存器的传播只能局限在基本块内部进行,无法跨基本块进行,导致寄存器传播不够彻底。
本文提出跨基本块寄存器传播,它被安排在控制流分析之后进行。此时,基本块之间的关系已经明确,可以加以利用,从而实现跨基本块寄存器传播,解决寄存器传播不彻底问题。
寄存器传播指的是在一系列的赋值操作指令中,某些寄存器只起着临时变量的作用,它们应当被清除掉;同事,由于临时变量关联在一起的两条指令也应该被合并成一条指令。该操作其实就是反编译的一个缩影;编译过程拆分语句成多条指令并使用寄存器充当临时变量,反编译过程的急促请你传播就是清除临时寄存器,合并指令。
下图是单基本块寄存器传播算法:
下图是改进后的算法:
总结:跨基本块寄存器传播可以很好地解决不同基本块之间寄存器传播不彻底问题,同时也解决了不同基本块之间变量丢失问题。