1、语言无关的经典优化技术之一:公共子表达式消除
公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,它的含义是:如果一个表达式E已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生...
分类:
其他好文 时间:
2016-10-31 22:22:03
阅读次数:
348
4. DAG覆盖
就像我们在前一章看到的,唯一地依赖树的一个内在缺点是不能正确地对公共子表达式建模。这意味着一个表达式必须要么分成一个树林,要么在每棵子树中重复操作。两者都不是好的解决案,因为它们都导致次优的代码。这个问题的一个解决方案是不要把表达式建模为树,而是有向无环图(DAG)。DAG允许节点有多个外出边,因此使得中间节点的值可以共享及重用。执行指令选择可以使用与树相同的模式匹配...
分类:
其他好文 时间:
2016-05-30 15:50:47
阅读次数:
227
在计算机中,CPU的速度比内存的速度快得多,编译器应尽量有效地利用寄存器资源,减少对内存的不必要访问,从而提高由编译器生成的汇编代码的运行速度。在中间代码生成阶段,UCC编译器用临时变量t来存放形如“t: a+b;”的公共子表达式的值;到了汇编代码生成时,UCC编译器会尽可能地把这些公共子表达式的值存放在寄存器,当需要再次重用时,就可以直接由相应的寄存器中得到。不过,CPU中寄存器的资源是很有限的...
分类:
其他好文 时间:
2015-04-27 09:54:20
阅读次数:
212
5.2.2 再论符号symbol与公共子表达式
在介绍算术表达式的翻译前,让我们简单重温一下第2.5节中的“图2.5.4 公共子表达式”及“图2.5.5 valueDef和valueUse”。为阅读方便,我们再次给出这两张图,更详细的说明请参见第2.5节。对于图2.5.4第2行的a+b,我们会由第7行的中间代码来对a+b进行求值,其结果存于临时变量t1中,之后在第3行中再次遇到表达...
分类:
其他好文 时间:
2015-04-13 09:44:02
阅读次数:
157
编译器会帮我们做很多优化,使我们写的很不优雅的代码也可以和大牛们写的得到比较接近的效率。当然,这前提是你们用的算法是一样的。编译器绝不会优化算法,不会把你的冒泡排序改成快排。但是,常数级别的优化也是很重要的。
编译器能做的事情有很多,在编译原理中我们知道,它可以消除死代码,提取公共子表达式等代码中妨碍效率的地方。但是,优化往往受到限制,因为它受到的最基础的约束就是不能改变程序的行为。这意味着,当...
分类:
其他好文 时间:
2015-01-07 13:12:58
阅读次数:
138