如何在代码生成过程中简化包含变量的c风格算术表达式

How to simplify a C-style arithmetical expression containing variables during code generation?

本文关键字:风格 表达式 变量 包含 代码生成 过程中      更新时间:2023-10-16

我正在尝试优化编译器中的表达式评估。

算术表达式都是c风格的,它们可能包含变量。我希望尽可能地简化表达式。

例如,(3+100*A*B+100)*3+100可以简化为409+300*A*B

主要依靠分配律、结合律和交换律。

我遇到的主要困难是如何将这些算术定律与传统的堆栈扫描评估算法结合起来。

谁能分享与此相关的经验或类似的问题,在编译器构建的背景下?

编译器通常有一些内部的规范化规则,比如"常量在左边"。这意味着a + 3会转化为3 + a,而不是相反。

在你的例子中,(3+100*A*B+100)*3+100将归一化为(3+100+(100*A*B))*3+100。现在可以明确地优化3+100

C1C2为常量的条件下,另一种转换可能是a*C1+C2(a+(C2/C1))*C1。直观地说,这规范了"先加后乘"。

这些规范化不是优化。其目的主要是将常量分组在一起,因此常量折叠更有效。

在编译的代码生成过程中应用常量折叠并结合强度降低。大多数编译器文本都会提供一个算法来实现这个。