[讨论] [HotSpot VM] 想研究HotSpot C2编译器编译过程,请教如何入手?
LeafInWind
2014-03-06
请问R神,上图的编译流程在hotspot中是否对应Compile::Compile(..., ciMethod* target, ...)方法。 编译流程包括三个步骤:parse、optimize和code_gen。 猜测optimize步骤对应Compiler方法对Compile::Optimize()方法的调用; code_gen步骤对应Compiler方法对Compile::Code_Gen()方法的调用; 那么parse步骤对应Compiler方法中的什么代码呢??感觉只能对应GraphKit的构造函数啊!!?? |
|
RednaxelaFX
2014-03-09
LeafInWind 写道 请问R神,上图的编译流程在hotspot中是否对应Compile::Compile(..., ciMethod* target, ...)方法。
编译流程包括三个步骤:parse、optimize和code_gen。 猜测optimize步骤对应Compiler方法对Compile::Optimize()方法的调用; code_gen步骤对应Compiler方法对Compile::Code_Gen()方法的调用; 那么parse步骤对应Compiler方法中的什么代码呢??感觉只能对应GraphKit的构造函数啊!!?? 哈哈。C2编译的主入口确实是Compile::Compile() Parse的部分的入口就在这里: http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/compile.cpp#l493 其中有调用cg->generate(jvms),留意一下那里。这里的cg是调用CallGenerator::for_inline()得到的,实际上是个ParseGenerator: http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/callGenerator.cpp#l226 然后ParseGenerator::generate()会构造一个Parse实例, http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/callGenerator.cpp#l62 真正的parsing就是从其构造函数Parse::Parse()开始的。 Parse的过程中,(几乎)每个节点在生成出来之后都会马上经过PhaseGVN::transform()的优化: http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/phaseX.cpp#l648 而这就是图里右上角的部分:Ideal() -> Value() -> Identity() -> global value numbering Ideal()、Value()、Identity()是Node类上可以说最核心的三个方法,它们的作用贯穿在整个C2的优化过程中。嘛说“整个”可能有点过头,至少可以说是在instruction selection之前吧。 http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a61af66fc99e/src/share/vm/opto/node.hpp#l795 这仨主要是跟GVN和Iterative GVN配套使用的。 其实并不难找啦,给点耐心。有什么疑问欢迎继续来讨论~ |
|
LeafInWind
2014-03-09
请问代码中有一大堆以ci开头的类,不知ci是什么意义?
R神在http://hllvm.group.iteye.com/group/topic/26998曾写过ci目录是“动态编译器的公共服务/从动态编译器到VM的...”但很可惜最后几个字看不见了。 另外R神能否再大概展开一下,描述一下该目录下比较重要的类的作用。 谢谢!!! |
|
RednaxelaFX
2014-03-09
LeafInWind 写道 请问代码中有一大堆以ci开头的类,不知ci是什么意义?
R神在http://hllvm.group.iteye.com/group/topic/26998曾写过ci目录是“动态编译器的公共服务/从动态编译器到VM的...”但很可惜最后几个字看不见了。 另外R神能否再大概展开一下,描述一下该目录下比较重要的类的作用。 谢谢!!! 看不见的话复制下来就可以看到啦。 ci就是Compiler Interface,主要是为了让编译器不受runtime其它部分的变化而影响的抽象层。其中很多类都是跟runtime里的类对应的,特别是oops目录下的类。 例如说: ci/ciConstantPoolCache -> oops/cpCache ci/ciInstance -> oops/instanceOop ci/ciInstanceKlass -> oops/InstanceKlass ci/ciKlass -> oops/klass ci/ciStreams -> interpreter/bytecodeStream 还有少量本来应该是在C1和C2之间共享的一些公共服务,结果只有一个编译器用,例如说ciTypeFlow。它的作用是在C2真正parse字节码之前先找出基本块边界,并且计算出每个local variable slot的抽象类型。 |
|
LeafInWind
2014-03-11
这几天都在看hotspot的寄存器分配。想问一下build_ifg_virtual和build_ifg_physical两个步骤的主要区别是什么。是否physical ifg就是类似下图的预着色图(precolored)。
(上图引用自虎书11.3节) |