[讨论] [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节)
Global site tag (gtag.js) - Google Analytics