图5.4给出例子example的控制流图(Control Flow Graph,CFG)和数据流图(Data Flow Graph, DFG)的表示。图5.4(a)是控制流图,表示操作的控制相关性;图5.4(b)是数据流图,表示操作的数据相关性。 
  图5.4 例子example的控制流图和数据流图
  图5.5给出例子example的控制数据流图(Control Data Flow Graph, CDFG)的表示,它把控制流图和数据流图合并在一起,是目前比较通用的一种中间表示格式。本书采用这种中间表示格式。
  在控制数据流图中,使用3类结点和2类边来表示相应的操作及其相互关系。这3类结点是:
  · 操作结点(用○表示):表示抽象的运算类型操作;
  · 传输结点(用□表示):表示数据的传输;
  · 结构结点:表示控制结构。结构结点包括:
   - 起始结点与终结结点:表示算法的起始与终结;
   - 分枝结点(用△表示)与汇聚结点(用▽表示):表示条件分枝。
  2类边是:
  · 数据相关边(用实线表示):表示数据相关性;
  · 控制相关边(用虚线表示):表示控制相关性。    
图5.5 例子example的控制数据流图

  图5.5 中有8个操作结点,各操作结点的操作类型用VHDL预定义算符在圆圈(○)中标出;图中有8个传输结点,它所表示的数据(信号、变量或常数)在方框(□)旁边标出;图中有2对分枝结点和汇聚结点,其中一对用来表示while循环条件,另一对用来表示if...then...else分枝条件。
  分枝结点选择并激活符合条件的分枝操作,从分枝结点射出的有向边(虚线)用于指示各条件分枝的起始操作。这类有向边分为2类,一类表示当条件为真(标注在相应的边上)时所要进行的操作,一类表示当条件为假(标注在相应的边上)时所要进行的操作。汇聚结点标识分枝的结束,从操作射向汇聚结点的有向边(虚线)用于指示该操作为条件分枝的终结操作,从汇聚结点射出的有向边(虚线)用于指示终结操作完成后所要进行的操作(表示操作的执行顺序)。分枝中的传输结点无需经过汇聚结点即可被其它操作引用。
  引入分枝结点与汇聚结点的目的在于:
  (1) 标识分枝操作,以便进行分枝结构的调度处理。
  (2) 标识循环结构。汇聚结点射出的有向边为反馈边时,用于标识循环结构。
  控制数据流图和分开表示的控制流图与数据流图的主要不同之处在于:在控制数据流图表示中,数据相关性严格地规定了各操作的执行顺序;控制相关性对各操作的执行顺序只有一定的参考作用,而不严格地规定执行顺序(汇聚结点射出的有向边除外)。在分开的控制流图与数据流图表示中,控制相关性决定操作的执行顺序。因此,在控制数据流图表示中,允许分枝操作(条件分枝中的操作)从条件分枝中移出,也允许非分枝操作移入条件分枝中 (见5.5节)。
  这里提到在控制数据流图中允许操作移入/移出 条件分枝,目的是说明在控制数据流图中的控制相关性并不严格地规定操作的执行顺序,仅仅是为了介绍这一概念。读者此时可能不理解为什么要移入/移出,可以把这个问题暂时搁置起来,等读到5.5节时再设法弄明白。