Optimization 活变量分析,我的解释正确吗?

Optimization 活变量分析,我的解释正确吗?,optimization,compiler-construction,compiler-optimization,register-allocation,dataflow-diagram,Optimization,Compiler Construction,Compiler Optimization,Register Allocation,Dataflow Diagram,因为没有更多关于编译器标记的标记,所以我在这里发布这个问题 如果以下三个条件同时成立,则称变量x在程序中的语句Si处有效: 1. There exists a statement Sj that uses x 2. There is a path from Si to Sj in the flow graph corresponding to the program 3. The path has no intervening assignment to x including a

因为没有更多关于编译器标记的标记,所以我在这里发布这个问题

如果以下三个条件同时成立,则称变量x在程序中的语句Si处有效:

1. There exists a statement Sj that uses x
2. There is a path from Si to Sj in the flow
   graph corresponding to the program
3. The path has no intervening assignment to x 
   including at Si and Sj 
在上述控制流图的基本块2中的语句和基本块3中的语句中都存在的变量如下

p、 美国 r、 美国 r、 u q、 五 我试图解释:

正如上面所说的那样:如果一个变量持有未来可能需要的值,那么它就是活的

根据所给出的定义,如果变量在未来任何新赋值之前使用,则该变量是活动的。 块2的'r'和'v'都是活动变量。在分配给它们的任何新值之前,在块4中使用它们。请注意,变量“u”在块2中不存在,因为在块3中使用之前,在块1中为“u”分配了一个新值。由于相同的原因,变量“p”、“s”和“q”也不存在于块2中。 块3只有“r”作为活动变量,因为每个其他变量在使用前都被分配了一个新值

另一种解释是:

只有r

p、 s和u在1中被分配,在此之前没有中间用途。因此p、s和u不同时存在于2和3中。 q被分配到4中,因此不同时存在于2和3中

v在3点是带电的,但不是在2点。 只有r在2号和3号现场直播


但是官方的盖特·凯说r和u都是。我看到两件事可能至少是你困惑的一部分

首先,在活动变量的条件列表中,没有说明Si!=Sj,这让我觉得这些定义有点不精确

第二个是您的断言,注意变量“u”在块2中不存在,因为在块3中使用变量“u”之前,它在块1中被分配了一个新值

我会这样看:

在进入块2时,在语句v=r+u 执行了一个无操作空语句,作为 每个区块,另一个作为区块的出口,然后都是r 你必须活着,因为有一个即将到来的声明 它同时使用这两者,并且代码中有一个从条目到的路径 不包含任何中间赋值的语句。 使用 定义的原始语义,然后我们只讨论 Si==Sj的情况,因为两者都指v=r+u 语句-从语句到语句本身有一条路径 不包含这种意义上的额外任务。我觉得更容易 用额外的空入口和出口语句来思考, 不过

然而,在执行v=r+u之后,在假想 块退出空语句,现在安全地考虑U不是 要么活,要么死,因为第4区没有人使用它,并且 它在第一区被重新分配,然后在第二区或第二区再次使用 街区2或3

因此,部分混淆似乎是考虑变量是否存在于特定的块中,这与定义不符-您需要考虑变量是否存在于特定语句的点上。您可以在块2中设置变量u是活的还是死的,这取决于您是在执行lone语句之前查看它,还是在