基本块是一条直线代码序列,除了入口和末尾外,没有分支的入站和出站分支。基本块是一组始终按顺序执行的语句。
第一个任务是将一个三地址代码序列划分为多个基本块。从第一个指令开始一个新的基本块,并添加指令,直到遇到跳转或标签。在没有跳转控制的情况下,控制从一个指令连续转移到另一个指令。这个想法在以下算法中得到了标准化:
算法:
将三地址代码划分为基本块。
输入:三个地址指令的序列。
流程:确定中间代码中作为领导者的指令。以下是用于查找领导者的规则:
- 中间代码的第一个三地址指令是一个领导者。
- 作为无条件或有条件跳转/转到语句的目标的指令是领导者。
- 紧随无条件或有条件跳转/转到语句之后的指令被视为领导者。
对于这样确定的每个领导者,其基本块都包含其自身以及所有指令,直至排除下一个领导者为止。
例子:
用于将10 * 10矩阵设置为单位矩阵的中间代码:
1) i=1 //Leader 1 (First statement)
2) j=1 //Leader 2 (Target of 11th statement)
3) t1 = 10 * i //Leader 3 (Target of 9th statement)
4) t2 = t1 + j
5) t3 = 8 * t2
6) t4 = t3 - 88
7) a[t4] = 0.0
8) j = j + 1
9) if j <= goto (3)
10) i = i + 1 //Leader 4 (Immediately following Conditional goto statement)
11) if i <= 10 goto (2)
12) i = 1 //Leader 5 (Immediately following Conditional goto statement)
13) t5 = i - 1 //Leader 6 (Target of 17th statement)
14) t6 = 88 * t5
15) a[t6] = 1.0
16) i = i + 1
17) if i <= 10 goto (13)
给定算法用于将矩阵转换为单位矩阵,即所有对角元素为0且所有其他元素均为1的矩阵。步骤(3)-(6)用于使元素0,步骤(14)用于使元素0元素1.这些步骤由goto语句递归使用。
上面的代码中有6个基本块:
B1)陈述1
B2)陈述2
B3)陈述3-9
B4)陈述10-11
B5)陈述12
B6)陈述13-17