如何在代码生成过程中简化包含变量的c风格算术表达式
How to simplify a C-style arithmetical expression containing variables during code generation?
我正在尝试优化编译器中的表达式评估。
算术表达式都是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
。
在C1
和C2
为常量的条件下,另一种转换可能是a*C1+C2
到(a+(C2/C1))*C1
。直观地说,这规范了"先加后乘"。
这些规范化不是优化。其目的主要是将常量分组在一起,因此常量折叠更有效。
在编译的代码生成过程中应用常量折叠并结合强度降低。大多数编译器文本都会提供一个算法来实现这个。
相关文章:
- Qt VTK交互风格的信号到小部件
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 使用正则表达式regex_search在字符串中查找字符串
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 正则表达式只是把这种风格从" "
- 如何在代码生成过程中简化包含变量的c风格算术表达式