📜  编译器设计 |三地址码循环检测

📅  最后修改于: 2021-09-27 15:44:07             🧑  作者: Mango

先决条件——编译器中的三个地址代码
循环优化是中间代码生成之后的阶段。此阶段的主要目的是减少程序中的行数。在任何程序中,任何程序花费的大部分时间实际上都在迭代程序的循环内。在递归程序的情况下,块将在那里,并且大部分时间将出现在块内。

循环优化 –

  1. 要应用循环优化,我们必须首先检测循环。
  2. 为了检测循环,我们使用使用程序流图(PFG)的控制流分析(CFA)。
  3. 要找到程序流图,我们需要找到基本块

基本块 –基本块是三个地址语句的序列,其中控制从开头进入,只在结尾离开,没有任何跳转或暂停。

找到基本块 –
为了找到基本块,我们需要找到程序中的领导者。然后一个基本块将从一个领导者开始到下一个领导者,但不包括下一个领导者。这意味着如果您发现第 1 行是领导者,第 15 行是下一个领导者,那么从 1 到 14 行是一个基本块,但不包括第 15 行。

识别基本块中的领导者 –

  1. 第一句话永远是leader
  2. 作为条件或无条件语句目标的语句是领导者
  3. 紧跟在条件或无条件语句之后的语句是领导者
fact(x)
{
    int f = 1;
    for (i = 2; i <= x; i++)
        f = f * i;
    return f;
}

上述C代码的三个地址码:

  1. f = 1;
  2. 我 = 2;
  3. 如果 (i > x) 转到 9
  4. t1 = f * i;
  5. f = t1;
  6. t2 = i + 1;
  7. 我 = t2;
  8. 转到(3)
  9. 转到调用程序

领导者和基本块 –

控制流分析 –

如果控件输入 B1,则 B1 之后没有其他选项,则必须输入 B2。现在,如果控制进入 B2,则根据条件控制将流动,如果条件为真,我们将转到第 9 行,这意味着 9 只是 B4。但如果条件为假,则控制转到下一个块 B3。在 B3 之后,根本没有条件,我们直接进入第 3 条语句 B2。上面的控制流图在 B2 和 B3 之间有一个循环,它只不过是一个循环。