【问题标题】:How to simplify a C-style arithmetical expression containing variables during code generation?如何在代码生成期间简化包含变量的 C 风格算术表达式?
【发布时间】:2013-06-05 18:56:09
【问题描述】:

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

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

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

主要取决于分配律、结合律和交换律。

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

任何人都可以在编译器构建的上下文中分享与此或类似问题相关的经验吗?

【问题讨论】:

  • 只有+-*/ 和括号?
  • @CaseyChu 其实所有的C操作符都有可能出现。但我认为只考虑 +-*/() 也是可以接受的。我是 trying my best 来简化它们。
  • 您可能需要开发一个rewriting system,它会依次将重写规则应用于表达式。在此之前,您可以查看一些现有的编译器源代码,了解它如何处理此类优化。听说LLVM源码可读性很强。
  • @BЈовић 谢谢你指出我的错。
  • 您要查找的关键术语是“传递闭包”和“范式”。请注意,没有“简单”或“复杂”之类的东西,只有不同的形式。您需要决定要从什么形式开始,以及要翻译成什么形式。

标签: c++ algorithm compiler-construction code-generation


【解决方案1】:

编译器通常有一些内部规范化规则,例如“左侧常量”。这意味着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。直观地说,这将“在乘法之前加法”标准化。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多