基本块是一个直线代码序列,除了入口和末尾分别没有分支输入和输出分支。基本块是一组始终按顺序依次执行的语句。
第一个任务是将三地址代码序列划分为基本块。新的基本块从第一条指令开始,并添加指令直到遇到跳转或标签。在没有跳转控制的情况下,从一条指令到另一条指令会更连续地移动。这个想法在下面的算法中被标准化:
算法:
将三地址代码划分为基本块。
输入:三个地址指令的序列。
过程:确定来自中间代码的指令,即领导者。以下是用于寻找领导者的规则:
- 中间代码的第一个三地址指令是一个前导。
- 作为无条件或条件跳转/goto 语句目标的指令是领导者。
- 紧跟在无条件或条件跳转/goto 语句之后的指令被视为领导者。
对于由此确定的每个领导者,其基本块包含自己和所有指令,直到排除下一个领导者。
例子:
将 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) 用于使元素 1. 这些步骤由 goto 语句递归使用。
上面的代码中有6 个基本块:
B1) 声明 1
B2) 声明 2
B3) 声明 3-9
B4) 声明 10-11
B5) 声明 12
B6) 声明 13-17