编译原理与技术之代码优化.ppt
文本预览下载声明
《编译原理与技术》之代码优化 代码优化 代码优化的目标 提高最终目标代码的运行效率(性能) - 时间:运行的更快 - 空间:降低内存需求 保持源程序的语义 全局数据流分析 全局数据流分析 数据流的“方向” - 正向(向前)数据流:与控制流方向一致 - OUT[B]由IN[B]来计算 - IN[B]则由B的所有前驱结 点的OUT来决定 全局数据流分析 全局数据流方程求解 迭代计算:直至某先后两次迭代计算结果一样 迭代次序 - 向前流:流图深度优先次序 - 向后流:流图深度优先次序的逆序 - 流图深度优先次序: - 对流图进行深度优先遍历,得到流图深度 优先扩展树;对该树进行前序遍历时最后 访问结点的逆序 迭代初始计算(值) 全局数据流方程求解 到达-定值数据流分析 定值与引用 d : x := y + z // 语句d 是变量x的一个定值点 u : w := x + v // 语句u 是变量x的一个引用点 变量x在d点的定值到达u点 到达-定值数据流分析 解决的问题 - 定值“传播” 数据流归属 - 任意路径、向前流的数据流分析 - IN[B],到达基本块入口处定值集合 - OUT[B],到达基本块出口处定值集合 - GEN[B],基本块产生且能到达基本块出口的定值集合 - KILL[B],由基本块注销的定值集合(这些定值不能传播或到达到块出口) 数据流应用 - ud链,即引用-定值链。可以据此判断基本块内的某变量引用,其值来自何方(定值)。如应用于循环不变式的寻找。 到达-定值数据流分析 迭代计算 - 计算次序,深度优先序,即 B1 - B2 - B3 - B4 - 初始值:for all B: IN[B] = ?; OUT[B] = GEN[B] - 第一次迭代: IN[B1] = ?; // B1 无前驱结点 OUT[B1] = GEN[B1] ∪(IN[B1]-KILL[B1]) = GEN[B1] = { d1, d2, d3 } IN[B2] = OUT[B1] ∪OUT[B4] = {d1, d2, d3 } ∪{ d7 } = { d1, d2, d3, d7 } OUT[B2] = GEN[B2] ∪(IN[B2]-KILL[B2]) = { d4, d5 } ∪{ d3 } = { d3, d4, d5 } IN[B3] = OUT[B2] = { d3, d4, d5 } OUT[B3] = { d6 } ∪ ( { d3, d4, d5 } – { d3 } ) = { d4, d5, d6 } IN[B4] = OUT[B3] ∪ OUT[B2] = { d3, d4, d5, d6 } OUT[B4] = { d7 } ∪ ( { d3, d4, d5, d6 } – { d1, d4 } ) = { d3, d5, d6, d7 } -第二次迭代 IN[B1] = ?; // B1 无前驱结点 OUT[B1] = GEN[B1] ∪(IN[B1]-KILL[B1]) = GEN[B1] = { d1, d2, d3 } IN[B2] = OUT[B1] ∪ OUT[B4] = { d1,d2,d3 } ∪ { d3, d5, d6, d7 } = {d1, d2, d3, d5, d6, d7} OUT[B2] = GEN[B2] ∪(IN[B2]-KILL[B2]) = { d4, d5 } ∪{ d3, d5, d6 } = { d3, d4, d5, d6 } IN[B3] = OUT[B2] = { d3, d4, d5, d6 } OUT[B3] = { d6 } ∪ ( { d3, d4, d5, d6 } – { d3 } ) = { d4, d5, d6 } IN[B4] = OUT[B3] ∪ OUT[B2] = { d3, d4, d5, d6 } OUT[B4] = { d7 } ∪ ( { d3, d4, d5, d6 } – { d1, d4 } ) = { d3, d5, d6, d7 } 经过第二次迭代后,IN[B]和OUT[B] 不再变化。 ud链 - 考察流图中变量i,j的引用-定值情况 - 在基本块B2中有相应的引用 - d4 : i := i + 1 - i + 1 中的i 在引用前无定值,该引用的ud链仅来自于 IN[B2]中 i 的有关定值集合,即 { d1 : i := m – 1 ; d7 : i := u3 } - 类
显示全部