常量传播小结

来源:互联网 发布:太阳能资源分布知乎 编辑:程序博客网 时间: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

原创粉丝点击