先决条件——编译器中的三个地址代码
循环优化是中间代码生成之后的阶段。此阶段的主要目的是减少程序中的行数。在任何程序中,任何程序花费的大部分时间实际上都在迭代程序的循环内。在递归程序的情况下,块将在那里,并且大部分时间将出现在块内。
循环优化 –
- 要应用循环优化,我们必须首先检测循环。
- 为了检测循环,我们使用使用程序流图(PFG)的控制流分析(CFA)。
- 要找到程序流图,我们需要找到基本块
基本块 –基本块是三个地址语句的序列,其中控制从开头进入,只在结尾离开,没有任何跳转或暂停。
找到基本块 –
为了找到基本块,我们需要找到程序中的领导者。然后一个基本块将从一个领导者开始到下一个领导者,但不包括下一个领导者。这意味着如果您发现第 1 行是领导者,第 15 行是下一个领导者,那么从 1 到 14 行是一个基本块,但不包括第 15 行。
识别基本块中的领导者 –
- 第一句话永远是leader
- 作为条件或无条件语句目标的语句是领导者
- 紧跟在条件或无条件语句之后的语句是领导者
fact(x)
{
int f = 1;
for (i = 2; i <= x; i++)
f = f * i;
return f;
}
上述C代码的三个地址码:
- f = 1;
- 我 = 2;
- 如果 (i > x) 转到 9
- t1 = f * i;
- f = t1;
- t2 = i + 1;
- 我 = t2;
- 转到(3)
- 转到调用程序
领导者和基本块 –
控制流分析 –
如果控件输入 B1,则 B1 之后没有其他选项,则必须输入 B2。现在,如果控制进入 B2,则根据条件控制将流动,如果条件为真,我们将转到第 9 行,这意味着 9 只是 B4。但如果条件为假,则控制转到下一个块 B3。在 B3 之后,根本没有条件,我们直接进入第 3 条语句 B2。上面的控制流图在 B2 和 B3 之间有一个循环,它只不过是一个循环。