流图的构造 以所有的基本块为节点集合 有B1到B2的边(B2是B1的后继)当且仅 当: B1的最后一个四元式有条件或无条件地转移 到B2的第一个四元式。 B2是紧紧跟随在B1后面的四元式,且B1的 最后四元式不是无条件转向语句
流图的构造 • 以所有的基本块为节点集合。 • 有B1到B2的边(B2是B1的后继)当且仅 当: – B1的最后一个四元式有条件或无条件地转移 到B2的第一个四元式。 – B2是紧紧跟随在B1后面的四元式,且B1的 最后四元式不是无条件转向语句
流图的例子 BI B f B2 fftbi2 t2 10 B4 GO B2 B4 f fib ·在转移语句中,目标标号转变称为基本块的编号, 可以避免因为四元式的变动而引起的麻烦
流图的例子 • 在转移语句中,目标标号转变称为基本块的编号, 可以避免因为四元式的变动而引起的麻烦。 = 1 _ i = 1 _ f = 0 _ a >= i 10 B4 = f _ b + f a t1 = t1 _ f = b _ a + i 1 t2 = t2 _ i GO B2 = f fib B1 B2 B3 B4
基本块的优化 合并常量计算 消除公共子表达式 削减计算强度 删除无用代码
基本块的优化 • 合并常量计算 • 消除公共子表达式 • 削减计算强度 • 删除无用代码
合并常量计算 例子:1=2*3.14* 23.14t1 ·2*3.1415926的值在编译时刻就可以确定 6.28r
合并常量计算 • 例子:l = 2*3.14*r – * 2 3.14 t1 – * t1 r t2 – = t2 l • 2*3.1415926的值在编译时刻就可以确定。 – * 6.28 r t2 – = t2 l
消除公共子表达式 + d b 显然,第2和4个四元式计算的是同一个值,所以第四 个四元式可以修改称为=b 对于第1和3个四元式,虽然都是计算b+c,但是他们 的值其实是不同的,所以不能完成处理。 ·公共表达式:如果某个表达式先前已经计算,且从上 次计算到现在,E中的变量的值没有改变。那么E的这 次出现称为公共子表达式。 利用先前的计算结果,可以避免对公共子表达式的重 复计算
消除公共子表达式 • + b c a - a d b • + b c c - a d d • 显然,第2和4个四元式计算的是同一个值,所以第四 个四元式可以修改称为 = b _ d。 • 对于第1和3个四元式,虽然都是计算b+c,但是他们 的值其实是不同的,所以不能完成处理。 • 公共表达式:如果某个表达式先前已经计算,且从上 次计算到现在,E中的变量的值没有改变。那么E的这 次出现称为公共子表达式。 • 利用先前的计算结果,可以避免对公共子表达式的重 复计算