CompilerHIT / SysYRust

move project to
https://gitlab.eduxiji.net/202318123201313/compiler2023/-/tree/master/
2 stars 0 forks source link

后端死代码消除未完善 #5

Closed CNCSMonster closed 1 year ago

CNCSMonster commented 1 year ago

比如f:86, 前端优化后仍然有不少需要删除但是没有 解决思路:运行一次符号运算器(表达式归纳器/解释器)把值的传递改为直接赋值,然后通过数据依赖分析删除因此产生的无用def(backendoptpass:clearpass:remove_useless_def)

CNCSMonster commented 1 year ago
.file   "a.sy"
.option pic
.text
.data

.globl a_99999 .align 2 .type a_99999, @object .size a_99999, 4 a_99999: .word 0

.text
.align  1
.globl  main
.type main, @function

main: addi sp, sp, -16 sd ra, 8(sp) addiw a0, zero, 1 la a1, a_99999 sw a0, 0(a1) li a0, 4000 ld ra, 8(sp) addi sp, sp, 16 ret .size main, .-main .section .note.GNU-stack,"",@progbits

CNCSMonster commented 1 year ago

如上汇编应该可以化简为: ... addi sp, sp, -16 sd ra, 8(sp) li a0, 4000 ld ra, 8(sp) addi sp, sp, 16 ret ...

因为该函数是main函数,不用考虑main函数中对于全局数组内存区域赋值可能是外部依赖的情况,所以如果对于数组的修改不是输出或者返回值的依赖的话,就可以删掉.

Sakura1609 commented 1 year ago

前端无法对一个全局变量或一个全局数组的store行为做死代码消除,或者说,前端无法认为这样的一个操作是“无用”的