使用-XX:-TieredCompilation命令關閉分層編譯后只能使用C2編譯器了。
字節碼轉換為Ideal Graph,而Ideal Graph基於ad文件轉換為機器碼。ad(DSL(domain-specific language)文件描述了一個BURS匹配系統的匹配規則。
C2編譯器的主入口為Compile::Compile()方法(opto/compile.cpp文件中定義)
編譯流程包括三個步驟:
(1)parse在opto/callGenerator.cpp文件的ParseGenerator::generate()方法中生成parser實例,真正的parsing就是從其構造函數Parse::Parse()開始的。
Parse的過程中,(幾乎)每個節點在生成出來之后都會馬上經過PhaseGVN::transform()的優化:
而這就是圖里右上角的部分:Ideal() -> Value() -> Identity() -> global value numbering 。Ideal()、Value()、Identity()是Node類上可以說最核心的三個方法,它們的作用貫穿在整個C2的優化過程中。
(2)optimize步驟對應Compiler方法中調用的Compile::Optimize()方法
(3)code_gen 步驟對應Compiler方法中調用的Compile::Code_Gen()方法
參考文章:
(1)HotSpot C2編譯器 https://blog.csdn.net/fishmai/article/details/77824224
(2)關於JIT編譯器給出的相關資料鏈接 https://www.cnblogs.com/WCFGROUP/p/6086580.html
(3)討論C2的帖子https://hllvm-group.iteye.com/group/topic/39493?page=2