[Inside HotSpot] C1编译器HIR的构造】的更多相关文章

1. 简介 这篇文章可以说是Christian Wimmer硕士论文Linear Scan Register Allocation for the Java HotSpot™ Client Compiler的不完整翻译,这篇论文详细论述了HotSpot JIT编译器的架构,然后描述了C1编译器(研究用,细节和Sun的Client编译器生产级实现有些许出入)中线性扫描寄存器分配算法的设计和实现. C1编译器内部使用HIR,LIR做为中间表示并进行系列优化和寄存器分配.字节码到HIR的构造是最先完成…
1. 值编号 我们知道C1内部使用的是一种图结构的HIR,它由基本块构成一个图,然后每个基本块里面是SSA形式的指令,关于这点如可以参考[Inside HotSpot] C1编译器工作流程及中间表示.值编号(Value numbering)是指为每个计算得到的值分配一个独一无二的编号,然后遍历指令寻找可优化的机会.比如下面的代码: a = 1;b=4; c = a+b; d = a+b; e = b; 编译器可以在计算a的时候为它指定一个hash值(0x12a3e)然后放入hash表:b同理指定…
1. 条件传送指令 日常编程中有很多根据某个条件对变量赋不同值这样的模式,比如: int cmov(int num) { int result = 10; if(num<10){ result = 1; }else{ result = 0; } return result; } 如果不进行编译优化会产出cmp-jump组合,即根据cmp比较的结果进行跳转.可以使用gcc -O0查看: cmov(int): push rbp mov rbp, rsp mov DWORD PTR [rbp-20],…
1. C1编译器线程 C1编译器(aka Client Compiler)的代码位于hotspot\share\c1.C1编译线程(C1 CompilerThread)会阻塞在任务队列,当发现队列有编译任务即可CompileTask的时候,线程唤醒然后调用CompilerBroker,CompilerBroker再进一步选择合适编译器,以此进入JIT编译器的世界. CompilerBroker到C1编译器进行JIT编译的调用栈如下: CompileBroker::invoke_compiler_…
总览 词法.语法分析 分析方案 词法 语法 符号表 类型系统 AST 语义检查 EIR代码生成器 MIPS代码生成器 寄存器分配 体系结构相关特性优化 使用说明 编译 运行 总览 C1语言编译器及流程 C1 语言是一个类 C 的语言.语言的特征为: 包含 int.float 和 bool 简单类型以及以这些类型为基本类型的多维数组类型. 一个 C1 程序包含多个函数.全局变量声明和常量声明,其中必须有一个 void main(void)主函数. 函数可以带参数,也可以不带参数,参数的类型是简单类…
[inside hotspot] 汇编模板解释器(Template Interpreter)和字节码执行 1.模板解释器 hotspot解释器模块(hotspot\src\share\vm\interpreter)有两个实现:基于C++的解释器和基于汇编的模板解释器.hotspot默认使用比较快的模板解释器. 其中 C++解释器 = bytecodeInterpreter* + cppInterpreter* 模板解释器 = templateTable* + templateInterprete…
[Inside HotSpot] Java分代堆 1. 宇宙初始化 JVM在启动的时候会初始化各种结构,比如模板解释器,类加载器,当然也包括这篇文章的主题,Java堆.在hotspot源码结构中gc/shared表示所有GC共同拥有的信息,gc/g1,gc/cms则是不同实现需要用到的特设信息. λ tree ├─gc │ ├─cms │ ├─epsilon │ ├─g1 │ ├─parallel │ ├─serial │ ├─shared │ └─z 比如所有的Java堆都继承自Collect…
1. 方法调用模块入口 Java所有的方法调用都会经过JavaCalls模块.该模块又细分为call_virtual调用虚函数,call_static调用静态函数等.虚函数调用会根据对象类型进行方法决议,所以需要获取对象引用再查找实际要调用的方法:而静态方法调用直接查找要调用的方法即可.不管怎样,这些方法都是先找到要调用的方法methodHandle,然后传给JavaCalls::call_helper()做实际的调用. 2. 寻找调用方法 现在我们知道了methodHandle表示实际要调用的…
0. 简介 众所周知,hotspot默认使用解释+编译混合(-Xmixed)的方式执行代码.它首先使用模板解释器对字节码进行解释,当发现一段代码是热点的时候,就使用C1/C2 JIT进行优化编译再执行,这也它的名字"热点"(hotspot)的由来. 解释器的代码位于hotspot/share/interpreter,它的总体架构如下: 1. 解释器的两种实现 首先hotspot有一个C++字节码解释器,还有一个模板解释器 ,默认使用的是模板解释器的实现.这两个有什么区别呢?举个例子,J…
hotspot的启动流程与main方法调用 虚拟机的使命就是执行public static void main(String[])方法,从虚拟机创建到main方法执行会经过一系列流程.这篇文章详细讨论了执行命令行java.exe HelloWorld调用main函数输出经历了什么.源码使用openjdk12,操作系统为windows 64bits,其它系统和源码版本大同小异. java.base 首先要明白一个概念,java.exe大体上可以分为启动器部分和hotspot部分. 启动器负责执行一…