為什麼需要自研編譯後端。
從 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指令對映