在一个基本块中,如果中间代码i对A定值,中间代码j引用了A值,且从i到j之间没有A的其他定值,则称j是代码i中变量A的待用信息,并且,A在i处是活跃的。
待用信息有助于把基本块内还要被引用的变量值尽可能地保存在寄存器中,同时,把基本块内不再被引用的变量所占用的寄存器及早释放。本节仅在基本块内考虑待用信息,对于一个变量在后续基本块中的引用情况,需要依据基本块出口之后的活跃变量信息来判断。
为了取得每个变量在基本块内的待用信息,可从基本块的出口由后向前扫描,对每个变量建立相应的待用信息链和活跃变量信息链。假设基本块中所有非临时变量均为基本块出口之后的活跃变量,而所有临时变量均为基本块出口之后的非活跃变量。
如果已知符号表中含有记录变量待用信息和活跃信息的域,并且中间代码可以附加待用信息,那么,可以采用算法9.1计算变量的待用信息。
算法9.1 变量待用信息的计算
1)开始时,把基本块中各变量在符号表中的待用信息域置为“非待用”,并根据该变量在基本块出口之后是否活跃,把活跃信息域置为“活跃”或“非活跃”。
2)从基本块出口到基本块入口由后向前依次处理每条中间代码。对形如i:A:=B op C的中间代码(形式为A:=op B或A:=B也适用,只是其中不涉及C),依次执行下述步骤:
(1)把符号表中变量A的待用信息和活跃信息附加到中间代码i上;
(2)把符号表中A的待用信息和活跃信息分别置为“非待用”和“非活跃”;
(3)把符号表中变量B和C的待用信息和活跃信息附加到中间代码i上;
(4)把符号表中B和C的待用信息均置为i,活跃信息均置为“活跃”。
上述次序如果颠倒可能会带来错误,因为B和C也可能是A。按以上算法,基本块中一个变量的各个引用位置,可以由该变量在符号表中的待用信息以及附加在各个中间代码i上的待用信息,从前到后依次指示出来。同时,假定每一个过程调用是一个基本块的入口,以此来避免过程调用所产生的副作用。(www.xing528.com)
例9.2 基本块的中间代码序列如下所示:
T:=A-B
U:=A-C
V:=T+U
W:=V+U
假设W是基本块出口之后的活跃变量,根据算法9.1,可以计算出有关变量的待用信息。其中,该基本块的符号表中各变量的待用信息与活跃信息如表9-4所示,而附加在中间代码上的待用信息与活跃信息则如表9-5所示。
表9-4 符号表中的待用信息与活跃信息
表9-5 附加在中间代码上的待用信息与活跃信息
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。