常量传播小结
来源:互联网 发布:太阳能资源分布知乎 编辑:程序博客网 时间:2024/06/05 07:46
tag: 编译, 编译原理, 优化, 常量传播
不多说 先看结果
//源文件
{ Sample programin TINY language}x:=4;{read x;} { input an integer }if 0 < x then { don't compute if x <= 0 }fact := 1; repeat fact := fact * x; x := x - 1 until x = 0; write fact { output factorial of x } end
//parser之后未优化的结果
x:= 4__compare_inner_1:= 0__compare_inner_2:= x__compare_inner_0:= __compare_inner_1 < __compare_inner_2test __compare_inner_0jz L-else fact:= 1L-repeat: __compare_inner_3:= fact__compare_inner_4:= xfact:= __compare_inner_3 * __compare_inner_4__compare_inner_5:= x__compare_inner_6:= 1x:= __compare_inner_5 - __compare_inner_6__compare_inner_8:= x__compare_inner_9:= 0__compare_inner_7:= __compare_inner_8 = __compare_inner_9test __compare_inner_7jnz L-repeat write factjmp L-end L-esle: L-end:
//常量传播之后
x:= 4__compare_inner_1:= 0__compare_inner_2:= 4__compare_inner_0:= 1 < 4fact:= 1__compare_inner_3:= 24__compare_inner_4:= 1__compare_inner_5:= 1__compare_inner_6:= 1__compare_inner_7:= 1__compare_inner_8:= 0__compare_inner_9:= 0fact:= 24x:= 0write fact
//去掉无用的代码
fact:= 24write fact
if的常量传播只要取两个分支的交集就可以了
while的常量传播麻烦一些, 我是试着传播100次循环, 看在这之内有没有退出while. 如果退出就可以把这个while优化成 if(1), 如果不能退出就重新按while(1)来重新对while优化.
//已经上传到github
https://github.com/0x00-pl/my_prog/tree/dev/mtcc/mtcc
- 常量传播小结
- 常量const小结
- C++常量表达式小结
- 关于常量传播(如何修改const常量的值)
- 编译器编译优化---常量传播和常量折叠
- 学习笔记(5)-标签传播(LPA)小结
- String之常量池小结
- String之常量池小结
- String之常量池小结
- spring事务传播行为类型的常量含义(翻译)
- 传播
- C语言常量定义方法小结
- 05_细节_常量知识小结
- C++ Primer学习笔记:字面值常量使用小结
- 【iOS】Swift中Playground,常量、变量、字符串等小结
- 字符串常量、字符数组、字符指针的一点小结
- c语言:常量,变量及其存储方式小结
- 常量
- C#中的集合类
- 淘宝API签名异常,如何正确计算SIGN参数?(error code:25 Invalid Signature)
- Js没有 参数重载 。
- BIO
- 用记事本编辑注册表文件
- 常量传播小结
- 使用zend studio配置Xdebug调试PHP教程
- mysql安装后默认就会自动启动了
- 设计模式:单件模式
- SQL常用代码
- Ubuntu QT里编译显示 uuid.h no such file or directory
- 如何解决错误Cannot resolve collation conflict for DISTINCT operation?
- 图解电子技术丛书
- 即使她很难相信,但她还是会选择等待