Compiler construction 控制依赖图可以有循环吗?

Compiler construction 控制依赖图可以有循环吗?,compiler-construction,graph,controls,Compiler Construction,Graph,Controls,我试图准确地理解控制依赖图的概念。假设我有以下控制流图(点表示法): 它有一个唯一的进入节点(1)和一个唯一的退出节点(4),以及一个循环2->3->2 我的问题是:这个CFG的控制依赖图是否包含从2到自身的循环边 Allen&Kennedy的“针对现代体系结构优化编译器”中有一个算法可以产生这样的循环边缘。然而,Muchnick的“编译器设计与实现”的控制依赖算法并没有产生这样的优势。此外,我在文献中找不到任何CDG使用这样的循环边绘制的例子。我倾向于相信没有这样的优势,但根据控制依赖的正式定

我试图准确地理解控制依赖图的概念。假设我有以下控制流图(点表示法):

它有一个唯一的进入节点(1)和一个唯一的退出节点(4),以及一个循环2->3->2

我的问题是:这个CFG的控制依赖图是否包含从2到自身的循环边

Allen&Kennedy的“针对现代体系结构优化编译器”中有一个算法可以产生这样的循环边缘。然而,Muchnick的“编译器设计与实现”的控制依赖算法并没有产生这样的优势。此外,我在文献中找不到任何CDG使用这样的循环边绘制的例子。我倾向于相信没有这样的优势,但根据控制依赖的正式定义和Allen&Kennedy的算法,它应该存在


如果你能给我举一个例子,在CDG中有这样一个循环(最好是在一篇同行评议的论文或一些教授的课堂讲稿中,等等),或者如果你能解释为什么Allen&Kennedy的算法不正确,我很乐意知道。

这样一个依赖图的效用是确定如何对操作排序,对吗?从这个意义上说,知道一个元素依赖于它自己是没有帮助的。如果愿意,可以绘制循环,但真正重要的是所有其他边。

根据,控制依赖循环可以存在。在第325页的案例2中,作者指定

从A到B路径上的后支配树中的所有节点, 包括A和B,应根据A进行控制。(这种情况下 捕获循环依赖性。)


因此,在这种情况下,节点a上会有一个循环。

这种依赖关系图的用途是确定如何对操作进行排序,对吗?从这个意义上说,知道一个元素依赖于它自己是没有帮助的。如果您愿意,可以绘制循环,但真正重要的是所有其他边。是的,我想我期待一些“规范定义”,可以用作oracle来测试多个实现,但这两个版本在所有实际用途上都是等效的。。。谢谢@mitchus你应该把你的评论移到一个答案上,这样它才能被接受为答案。你是对的,我已经接受了@mitchus的答案,但是你的答案更精确。我仍然觉得米丘斯的评论很贴切。
graph g {
1 -> 2;
2 -> 3;
3 -> 2;
2 -> 4;
1 -> 4
}