【问题标题】:Reduce number of temporary variables减少临时变量的数量
【发布时间】: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


【解决方案1】:

您将查看变量的生命周期。当不再使用该变量时,您可以将其丢弃并重新使用其内存空间。例如:

t1=a+b+c
t2=t1*d
t3=sqrt(t1+t2)
// t1 is no longer used, free space to use for t4
t4=t2+5
// t2 is no longer used

...assuming only t3 and t4 is used later on

您还可以查看生命周期如此短以至于甚至不需要分配的变量,例如:

t1 = a+b+c
t2 = t1 * 2

这里t1只用了一次,在下一个语句中,所以你可以把前面的计算结果拿来使用:

t2 = (a+b+c) * 2

【讨论】:

  • 是的,但是尽快释放变量会更好,所以我想重新安排初始代码以使变量的寿命尽可能短,并寻找算法来做到这一点。跨度>
猜你喜欢
  • 2021-03-19
  • 1970-01-01
  • 2015-09-09
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多