基于动态规划的最优代码生成算法 连续求值 对一个表达式的求值总是先求出一个子表达式的值、再求另一个子表达式的值,再计算出最终的值; 满足如下条件的机器保证了连续求值的方法具有最好的效率; 具有r各可互换的寄存器R0, … ,Rr-1; 加载、保存、运算指令; 代价向量 表达式树的每个结点对应于一个代价数组C,C的第i个元素C[i]表示有i各元素可用是,对相应子树求值,并放在一个寄存器中的代价;C[0]表示值放在内存; 计算C[i] 叶子结点:C[0]=0,C[i]=1,i0 内部结点:求C[i]时,按照不同的顺序,第一个子结点 数组引用 注意:a[j]可能改变a[i]的值,因此不能和普通的运算符一样构造相应的结点 x=a[i] a[j]=y z=a[i] 从数组取值的运算x=a[i]对应于=[]的结点,x作为这个结点的标号之一; 对数组赋值的运算对应于[]=的结点;没有关联的变量、且杀死所有依赖于a的变量; 数组引用的DAG的例子 设a是数组,b是指针 b=12+a x=b[i] b[j]=y 注意a是被杀死的结点的孙结点 一个结点被杀死,意味着它不能被复用 考虑再有指令m=b[i]? 指针赋值/过程调用 通过指针进行取值/赋值:x=*p *q=y。最粗略地估计: x使用了任意变量,因此无法消除死代码 而*q=y对任意变量赋值,因此杀死了全部其他结点 可以通过(全局/局部)指针
原创力文档

文档评论(0)