使用-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