【发布时间】:2012-10-06 11:26:45
【问题描述】:
我正在编写类似编译器的东西。问题如下:我有一个代码,由一系列分配组成:
t1=a+b+c
t2=t1*d
t3=sqrt(t1+t2)
t4=t2+5
...
大多数“t”变量都是临时的。我想减少临时变量的数量,尽可能多地重复使用它们。所以,我需要重新排列代码,对表达式进行分组,让一些变量接近变量赋值,所以在计算这些表达式之后,变量可以被重用。当然,我想在此过程中保留代码逻辑。 执行此操作的最佳算法是什么?
【问题讨论】:
-
问题是“注册合并”之一:en.wikipedia.org/wiki/Register_allocation
-
附注:虽然在您发布的示例中,您已经在分配之间建立了真正的依赖关系,但在许多情况下,“重用”变量是不好的,并且会创建实际上并不存在的错误依赖关系。事实上,大多数优化器首先将代码重写为变量在赋值期间从不重用的形式。它被称为 SSA:en.wikipedia.org/wiki/Static_single_assignment_form
标签: optimization compiler-construction compiler-development