编译器后端总结
为什么需要自研编译后端。
从 dsl语言到 可执行文件,如果采用genc code和 llvm-IR 需要通过 gcc 和 llvm , 这两个编译太heavy了,很多优化pass并不需要。
从IR到二进制文件的经历的pass 流
1,去除不必要block。 rm dead code , rm dead blocks
2, 重排block, 按SCC。
3, 分配局部变量
4,转换成SSA
5,InstCombine (常量表达式折叠, 根据use/def 链条做窥孔优化, 删除无用的load/store)
6, 公共子表达式子消除 CSE
7,死代码删除 DCE
8, 指令的正规化 legalization
9,寄存器的分配
10. ABI对齐, 重调寄存器分配
11, 正规化, 堆栈的配平
指令的选择 IR足够简单,已经能够X86/ARM指令映射