深刻理解Java Class文件格式(九)php
http://blog.csdn.net/zhangjg_blog/article/details/22432599html
http://blog.csdn.net/zhangjg_blog/article/details/22205831前端
Introduction to Compiler Construction in a Java Worldjava
http://download.csdn.net/download/jetsong/6908145node
http://www1.digitalgrammars.com/ipl-book/github
http://www.oracle.com/technetwork/server-storage/ts-6434-159339.pdfweb
http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.47.6924&rep=rep1&type=pdf算法
Chapter 6: Code Generationexpress
http://www1.digitalgrammars.com/ipl-book/slides/6-slides-ipl-book.pdf
http://rednaxelafx.iteye.com/blog/1044951
http://dsxwjhf.iteye.com/blog/2201685
http://www.grothoff.org/christian/teaching/2007/3353/papers/click95simple.pdf
PJama
https://users.cs.jmu.edu/bernstdh/Web/CS685/papers/printezis-et-al-1997.pdf
https://pdfs.semanticscholar.org/a60e/fc20de0237aa968c7275651c16b9ce7eff91.pdf
windows JDM編譯
http://icyfenix.iteye.com/blog/1097344
java native interface programmer's guide and specification
http://download.csdn.net/detail/dengchendeng/4910351
https://github.com/AdoptOpenJDK/jitwatch/wiki
https://blogs.oracle.com/thejavatutorials/ Java問題分析的實例
http://www.read.seas.harvard.edu/~kohler/class/04f-aos/ref/i386.pdf
http://newscentral.exsees.com/item/775cc72298692421bc9b4bad1dcb46fe-45bdc49be072f13531f759726dcc0b55
http://bluedavy.me/?p=36 R大的視頻
https://shipilev.net/blog/2015/black-magic-method-dispatch/
Introduction to Compiler Construction in a Java World
http://download.csdn.net/download/jetsong/6908145
https://wiki.openjdk.java.net/display/HotSpot/CallingSequences
http://www.valleytalk.org/wp-content/uploads/2011/05/Java_Program_in_Action_20110727.pdf
http://cr.openjdk.java.net/~vlivanov/talks/2016_JVMLS_MachineCodeSnippets.pdf
http://cr.openjdk.java.net/~jrose/pres/201009-OneVMManyLanguages.pdf
http://www.ibm.com/developerworks/java/library/j-jtp12214/index.html
http://de.slideshare.net/CharlesNutter/javaone-2012-jvm-jit-for-dummies
https://wiki.openjdk.java.net/display/HotSpot/Main
https://www.infoq.com/articles/OpenJDK-HotSpot-What-the-JIT
http://www.cliffc.org/blog/2010/06/09/part-2-lisbon-san-francisco-toronto-plus-ismm-and-pldi/
http://greenteajug.cn/tag/rednaxelafx/
https://www.zhihu.com/people/rednaxelafx/answers
http://ssw.jku.at/Research/Projects/JVM/
Generalized Trace Compilation for Java
www.ssw.uni-linz.ac.at/Teaching/PhDTheses/Haeubl/PhD.pdf
https://bugs.openjdk.java.net/browse/JDK-8062493
http://docklandsljc.uk/2016/06/hotspot-hood-microbenchmarking-java.html
https://www.infoq.com/articles/OpenJDK-HotSpot-What-the-JIT
https://community.oracle.com/docs/DOC-920250
https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks
https://blogs.oracle.com/thejavatutorials/entry/hotspot_serviceability_agent_api_javadoc
https://www.infoq.com/news/2016/10/AOT-HotSpot-OpenJDK-9
http://openjdk.java.net/jeps/243
https://www.usenix.org/legacy/events/vee05/full_papers/p132-wimmer.pdf
http://ssw.jku.at/Research/Papers/Wuerthinger11PhD/Wuerthinger11PhD.pdf
http://ssw.jku.at/Research/Papers/Haeubl08Master/Haeubl08Master.pdf
http://ssw.jku.at/Research/Papers/Schwaighofer09Master/schwaighofer09master.pdf
http://ssw.jku.at/Research/Papers/Wuerthinger07Master/Wuerthinger07Master.pdf
http://ssw.jku.at/Research/Reports/Report15.PDF
http://ssw.jku.at/Research/Papers/Wimmer04Master/Wimmer04Master.pdf
http://ssw.jku.at/Research/Papers/Haeubl13a/Haeubl13a.pdf
http://ssw.jku.at/Research/Papers/Stadler11Master/Stadler11Master.pdf
https://www.complang.tuwien.ac.at/andi/java-hotspot.pdf
http://compilers.cs.uni-saarland.de/ssasem/talks/Christian.Wimmer.pdf
http://ssw.jku.at/Research/Papers/Stadler14PhD/Thesis_Stadler_14.pdf
http://docklandsljc.uk/2016/06/hotspot-hood-microbenchmarking-java.html
http://ssw.jku.at/Research/Papers/Haeubl08Master/Haeubl08Master.pdf
http://dl.acm.org/citation.cfm?id=504296&dl=ACM&coll=DL&CFID=867529866&CFTOKEN=65053560
http://www.docklandsljc.uk/presentations/2016/AlexBlewitt-HotSpotUnderTheHood.pdf
https://speakerdeck.com/alblue/javaone-2016-hotspot-under-the-hood
http://ssw.jku.at/Research/Papers/Stadler14PhD/Thesis_Stadler_14.pdf
http://www.sdsc.edu/~allans/cs231/openjit.pdf
https://wiki.openjdk.java.net/display/HotSpot/The+C2+Register+Allocator
https://advancedweb.hu/2016/05/27/jvm_jit_optimization_techniques/
http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/
http://ssw.jku.at/General/Staff/GD/APPLC-2013-paper_12.pdf
http://cr.openjdk.java.net/~jrose/draft/code-media.html
http://cr.openjdk.java.net/~jrose/draft/code-media.html
http://alblue.bandlem.com/2016/09/javaone-hotspot.html
https://www.cs.utexas.edu/~pingali/CS395T/2009fa/papers/ferrante87.pdf
http://dl.acm.org/citation.cfm?id=504296&dl=ACM&coll=DL&CFID=867529866&CFTOKEN=65053560
http://cr.openjdk.java.net/~vlivanov/talks/2015-Indy_Deep_Dive.pdf
https://wiki.openjdk.java.net/display/HotSpot/Presentations
https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html
http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm
http://tirania.org/blog/archive/2012/Apr-04.html
https://www.researchgate.net/publication/221303106_Optimized_strings_for_the_Java_HotSpot_virtual_machine
Visualization of Program Dependence Graphs
http://hllvm.group.iteye.com/group/topic/34932#post-232535
https://www.cs.utexas.edu/~pingali/CS395T/2009fa/papers/ferrante87.pdf
https://shipilev.net/blog/2015/black-magic-method-dispatch/
http://ssw.jku.at/Research/Projects/JVM/
http://ssw.jku.at/Research/Papers/Ko05/Ko05.pdf
https://en.wikipedia.org/wiki/Optimizing_compiler
http://hllvm.group.iteye.com/group/topic/39493
http://www.oracle.com/technetwork/java/jvmls2016-wimmer-3125555.pdf
http://www.oracle.com/technetwork/java/jvmls2014kuksenko-2265188.pdf
http://hpac.rwth-aachen.de/teaching/sem-accg-16/slides/04.Khan-JIT.pdf
http://www.slideshare.net/ZeroTurnaround/vladimir-ivanovjvmjitcompilationoverview-24613146
http://cr.openjdk.java.net/~jrose/draft/code-media.html
http://www.cliffc.org/blog/2015/02/22/how-does-java-both-optimize-hot-loops-and-allow-debugging/
http://www.cliffc.org/blog/2012/02/12/too-much-theory/
http://www.cliffc.org/blog/2012/02/27/too-much-theory-part-2/
http://developer.amd.com/wordpress/media/2012/10/AddingNewInstructionsToHotspot1.pdf
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.224.353
http://www.slideshare.net/RednaxelaFX/green-teajug-hotspotintrinsics02232013
https://book.douban.com/subject/1610344/
http://hllvm.group.iteye.com/group/topic/34932#post-232535
http://rednaxelafx.iteye.com/blog/644038
https://github.com/drazzib/openjdk-hsdis
https://wiki.openjdk.java.net/display/HotSpot/PrintAssembly
http://stackoverflow.com/questions/9337670/hotspot7-hsdis-printassembly-intel-syntax
http://cr.openjdk.java.net/~vlivanov/talks/2015-JVMLS_State_of_JLI.pdf
https://github.com/drazzib/openjdk-hsdis
http://www.cs.wustl.edu/~cytron/cs531/Resources/Papers/cprop.pdf
http://www.sdsc.edu/~allans/cs231/openjit.pdf
http://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
Materials § Notes:
http://cr.openjdk.java.net/~vlivanov/talks/2015-Indy_Deep_Dive.pdf §
https://wiki.openjdk.java.net/display/HotSpot/Method+handles+and+invokedynamic
https://wiki.openjdk.java.net/display/HotSpot/Bound+method+handles
https://wiki.openjdk.java.net/display/HotSpot/Direct+method+handles
https://wiki.openjdk.java.net/display/HotSpot/Method+handle+invocation
"Deconstructing MethodHandles」 by Paul Sandoz –
https://wiki.openjdk.java.net/display/HotSpot/Deconstructing+MethodHandles
"Lambda Forms」 by John Rose, JVMLS'12 –
http://cr.openjdk.java.net/~jrose/pres/201207-LF-Tutorial.pdf
「J9's MethodHandle Compilation Pipeline」 by Dan Heidinga, Jfocus VM Summit’15 –
http://www.jfokus.se/jfokus15/preso/J9%20MethodHandle%20Compilation%20Pipeline.pdf
HotSpot: methodHandles*.hpp/.cpp
JVM Specification 8:
http://docs.oracle.com/javase/specs/jvms/se8/html/index.html
http://www.slideshare.net/RednaxelaFX/green-teajug-hotspotintrinsics02232013
http://www.slideshare.net/zuluJDK/nhjug-jvminternalsoptimized120123211545phpapp02
http://www.slideshare.net/ValeriiaMaliarenko/java-jit-compilation-and-optimization-by-andrey-kovalenko
推薦書籍 The Java Language Specification The Java Virtual Machine Specification ◦ 針對Java 5癿修訂 ◦ 針對Java 6癿Class文件格式癿修訂 ◦ JVM覎範第三版草案(2011/03/01) (到Java 6爲止全部JVM覎範更新癿整合版) Oracle JRockit: The Definitive Guide Virtual Machines: Versatile Platforms for Systems and Processes ◦ 中文版:虛擬機——系統不迕程癿通用平臺 Compilers: Principles, Techniques, and Tools (2nd Edition) ◦ 中文版:編譯原理(原書第2版) Advanced Compiler Design and Implementation ◦ 中文版:高級編譯器設計不實現 Principles of Computer Organization and Assembly Language, Using the Java Virtual Machine ◦ 中文版:計算機組成及彙編詫言原理 較老書籍 Java and the Java Virtual Machine Programming for the Java Virtual Machine Virtual Machines (Iain D. Craig著) Inside the Java Virtual Machine (2nd Edition) ◦ 中文版:深刻Java虛擬機(原書第2版) 推薦網站不博寵 HotSpot Publications JVM Language Summit OpenJDK The HotSpot Group javac Group the Da Vinci Machine Project The Java HotSpot Performance Engine Architecture Java™ Virtual Machine Technology – JDK 7 HotSpot Internals for OpenJDK Da Vinci Machine Project Wiki Publications of the Institute for System Software IBM Research: Java JIT compiler and related publications Jikes RVM Cliff Click John Rose Mark Lam Fredrik Öhrström Ian Rogers The JRockit Blog Christian Thalinger Lukas Stadler Gary Benson Steve Goldman Xiao-Feng Li Christian Wimmer Maurizio Cimadamore Joseph D. Darcy Ben L. Titzer Steve Blackburn ……
最近想開始研究HotSpot C2編譯器的編譯過程,例如字節碼是如何轉換爲Ideal Graph的,而Ideal Graph又是如何基於ad文件轉換爲機器碼的,等等。
請教應該如何入手。謝謝。 |
|
hellhell 2014-02-09
有個叫IdealGraphVisualizer的工具,能夠看C2的node。
期待R大的答案。 |
|
RednaxelaFX 2014-02-10
HotSpot C2編譯器。又名HotSpot Server Compiler,HotSpot VM的優化JIT編譯器。
樓主肯定要跳這個坑了麼…? 若是隻是想籠統的瞭解JVM的JIT編譯器的話,我不建議從C2入手。 好吧我肯定樓主確實是要跳這坑的。跟我來 ![]() 能夠先看看前同事Vladimir Ivanov講解JIT編譯器: JIT-compiler in JVM seen by a Java developer, Vladimir Ivanov, JavaOne 2013 Moscow, 2013 Charles Nutter的系列演講也OK: JVM JIT for Dummies, JavaOne 2012, 2012 請樓主先說說你已經知道的(包括基本的編譯原理、JIT編譯器的特定知識、其它JVM JIT編譯器的實現),以及研究C2的動機,而後我看看如何引導你進入C2的世界。
hellhell 寫道
有個叫IdealGraphVisualizer的工具,能夠看C2的node。
期待R大的答案。 嗯嗯, IdealGraphVisualizer是研究C2的實用工具之一。我以前在 第0回JVM源碼閱讀活動的「 爲啥別讀HotSpot VM的源碼」裏有提到和演示它。 工具的下載連接用這個: http://ssw.jku.at/General/Staff/PH/igv_latest.zip ================================================= C2包含許多傳統編譯器的技術,例如 * SSA形式的 中間表現(intermediate representation) * GVN(global value numbering) * CSE(common sub-expression elimination) * CCP(conditional constant propagation) * Constant folding * DCE(dead code elimination) * Alias analysis * LICM(loop-invariant code motion) * Loop unrolling * Loop peeling * Escape analysis * Scalar replacement / SRoA(Scalar Replacement of Aggregate) * BURS(bottom-up rewrite system) * Code Scheduling: Global Code Motion (GCM) / Local Code Motion (LCM) * Graph-coloring register allocator * Peephole optimization
LeafInWind 寫道
字節碼是如何轉換爲Ideal Graph的
字節碼轉換爲Ideal Graph的過程在C2裏叫作parsing,這是一個 抽象解釋(abstract interpretation)的過程。
LeafInWind 寫道
而Ideal Graph又是如何基於ad文件轉換爲機器碼的
ad文件是個 DSL(domain-specific language),描述了一個BURS匹配系統的匹配規則。 也有一些JIT編譯器/運行時特有的技術,例如: * uncommon trap / deoptimization * OSR(on-stack replacement) * dynamic profile-based optimization * devirtualization * guarded inlining * inline caching 還有跟GC交互的VM會用到的技術,例如: * Safepoint * OopMap / stack map * base-pointer / derived-pointer tracking 還有Java或者跟Java相似的面嚮對象語言特有的技術,例如: * CHA(class hierarchy analysis) * Lock elision * Lock coarsening * Array Bounds Check Elimination / Range Check Elimination 還有C2特有的技術,例如: * Sea-of-node IR / Program Dependence Graph(Ideal Graph) 就不窮舉術語了。借用John Rose在這個演示稿裏的介紹,HotSpot VM的JIT編譯器所用到的技術的列表以下(包括C1和C2):
John Rose 寫道
![]() 挺多知識點的? 這些背景知識都得先有所掌握才能開始真的探索C2的工做過程。最好先找幾本編譯原理的書把基礎知識(特別是編譯器後端知識)打紮實了再考慮真的着手深刻研究C2。 等樓主補充一下信息我再回復。也歡迎其餘同窗來參與討論喔! ================================================= 相關資料: 入門C2最好的材料就是Thomas Würthinger寫的關於IdealGraphVisualizer的碩士論文: Visualization of Program Dependence Graphs, Thomas Würthinger, 2007 其中第三章對C2的講解很是精闢,是初學C2必讀文章。文中這張圖清晰講解了C2的工做流程:
Thomas Würthinger 寫道
![]() C2的總體介紹最好的資料仍是原始論文: The Java HotSpot™ Server Compiler, Michael Paleczny, Christopher Vick, Cliff Click, JVM'01 Overview of Ideal, C2's high level intermediate representation, HotSpot Internals, OpenJDK Wiki 介紹了C2 Ideal Graph的設計思路 但要真的理解Ideal Graph的設計思路,也就是「sea-of-nodes」或者叫「program dependence graph」,仍是得把Cliff Click本來的幾篇論文讀了才行。C2的核心設計跟Cliff最初作這幾篇論文時幾乎如出一轍,甚至還有部分代碼就是從當時他的博士畢業做品一直遺留至今。 From Quads to Graphs: An Intermediate Representation's Journey, Cliff Click, 1993 A Simple Graph-Based Intermediate Representation, Cliff Click, Michael Paleczny, 1995 Combining Analyses, Combining Optimizations, Cliff Click, Keith Cooper, 1995 Global Code Motion, Global Value Numbering, Cliff Click, PLDI'95 這幾篇裏面1993年那篇寫得很生動,建議先讀。 John Rose寫了篇討論編譯器IR的文章,也值得一讀: Thinking About Intermediate Representations, John Rose, 2014-09 Cliff Click講解C2裏的類型 格(type lattice): Too Much Theory, 2012-02-12 Too Much Theory, Part 2, 2012-02-27 Too Much Theory, Part 3, 2012-03-24 Escape Analysis for Java, Jong-deok Choi, Mannish Gupta, Mauricio Serrano, Vugranam C. Sreedhar, Sam Midkiff, OOPSLA'99, 1999 Exploiting Superword Level Parallelism with Multimedia Instruction Sets, Samuel Larsen , Saman Amarasinghe, PLDI'00, 2000 A Tutorial on Adding New Instructions to the Oracle® Java HotSpot ™ Virtual Machine, Vasanth Venkatachalam, AMD 介紹了ad文件的格式,以及如何對其添加新指令 Optimal Code Generation for Expression Trees: An Application of BURS Theory, Eduardo Pelegri-Llopart, Susan L. Graham, 1988 Engineering a Simple, Efficient Code Generator Generator, Christopher W. Fraser, David R. Hanson, Todd A. Proebsting, 1992 講解BURS的早期論文。C2的指令選擇就是基於BURS的思想設計的,而ad文件正是C2的BURS系統的一部分。 The C2 Register Allocator, HotSpot Internals, OpenJDK Wiki 介紹了C2的基於Chaitin算法的圖着色寄存器分配器 Graph Coloring Register Allocation Papers, HotSpot Internals, OpenJDK Wiki 圖着色寄存器分配器的相關論文連接 C2的寄存器分配器還有許多潛在的改進點。它能夠說是C2最慢的部分了。Niclas Adlertz在作一些相關研究,近期OpenJDK裏C2寄存器分配器的改進也主要是他在作。能夠關注一下他的論文(如今還沒發表)。 ================================================= 既然樓主特別指出關心兩個過程——字節碼->Ideal Graph、Ideal Graph->Machine Graph(MachNode)——那我推薦先經過另外兩個項目熟悉相關概念,而後再回來研究C2的實現。 首先是 Graal。 Graal是一個用Java實現的JIT編譯器,能夠插在HotSpot VM與 Maxine VM上使用。 它衍生自Maxine VM更早的一個用Java寫的JIT編譯器—— C1X。C1X則是HotSpot C1編譯器的Java移植版,基本結構與C1幾乎徹底一致。 Graal保持了C1X的大體思路,特別是後端結構基本上仍是同樣的;可是它徹底重寫了前端,把C1X的HIR改成與C2類似的「sea-of-nodes」/program dependence graph的「 StructuredGraph」。 因爲StructuredGraph與Ideal Graph比較類似,從字節碼到它們的構造過程也有類似之處;而Graal的代碼結構比C2清晰得多,因此先從Graal入手去了解Program Dependence Graph的特性,而後再去看C2會舒服許多。 更好的是Graal IR也能夠用IdealGraphVisualizer來可視化。研究Graal與C2共用一個工具,在二者之間能夠輕鬆切換。 Graal將Java字節碼轉換爲StructuredGraph的實現代碼在此: com.oracle.graal.java.GraphBuilderPhase (順帶一提,這就是個抽象解釋的過程的實現) Graal IR的介紹能夠參考這篇論文: Graal IR: An Extensible Declarative Intermediate Representation, Gilles Duboscq, Lukas Stadler, Thomas Würthinger, Doug Simon, Christian Wimmer, Hanspeter Mössenböck, APPLC 2013, 2013 Graal的總體設計能夠參考這個演講: Wholly Graal: Accelerating GPU Offload for Java [CON6419], Christian Thalinger, Christian Wimmer, Vasanth Venkatachalam, JavaOne 2013 ------------------------------------------------------------------- 其次是 Jikes RVM。 Jikes RVM是個用純Java實現的JVM。上面提到的Maxine VM也是如此。 這裏提到Jikes RVM是由於它的優化編譯器的指令選擇跟C2類似,也用到了 BURS。因此指令選擇這部分能夠先參考Jikes RVM的實現和相關文檔,而後再回去看C2的實現。 但其實Jikes RVM的BURS代碼就這麼直接讀也不算易讀的。我比較不喜歡Jikes RVM裏各類要在構建過程當中生成代碼的地方,這裏正是其中之一——Jikes RVM的源碼裏有BURS的 規則文件,構建過程當中由它會生成出真正負責匹配的狀態機的C代碼。 那爲啥還要推薦它呢?由於它勝在「有根可尋」。它的BURS名爲 jburg,是 iburg的移植版。後者的一個變種在 lcc裏也有用到。 《 A Retargetable C Compiler: Design and Implementation》詳細介紹了lcc的實現。其中第14章提到了其BURS系統的實現,很是建議閱讀。 這本書有 中文版,但翻譯太爛因此我不推薦讀中文版。 ================================================= Hmm,下次作個簡易案例來帶你們走一遍C2的編譯過程好了〜 說來我之前就分析過一個案例,涉及了C2工做流程的一部分,在這 裏: http://hllvm.group.iteye.com/group/topic/34932#post-232535 請先讀讀這篇案例看是否有幫助 ;-) 還有幾個主要面向Java應用開發者的實驗: 逃逸分析的實驗: HotSpot 17.0-b12的逃逸分析/標量替換的一個演示 基於superword的向量化的實驗: 降序循環老是比升序循環快? Uncommon trap的實驗: JIT編譯找不到類? |
|
LeafInWind 2014-02-10
RednaxelaFX 寫道
請樓主先說說你已經知道的(包括基本的編譯原理、JIT編譯器的特定知識、其它JVM JIT編譯器的實現),以及研究C2的動機,而後我看看如何引導你進入C2的世界。
感謝R神。你提到的上述技術我基本都瞭解。我目前主要對hotspot JIT的inline cache、逆優化、OSR還算熟悉。 目前對C2編譯器最關注的實際上是它的寄存器分配問題。 但也但願能借這個機會對C2有一個全面的理解。 |
|
RednaxelaFX 2014-02-10
我前面的回帖有更新喔,回頭能夠讀讀看。
LeafInWind 寫道
RednaxelaFX 寫道
請樓主先說說你已經知道的(包括基本的編譯原理、JIT編譯器的特定知識、其它JVM JIT編譯器的實現),以及研究C2的動機,而後我看看如何引導你進入C2的世界。
你提到的上述技術我基本都瞭解。我目前主要對hotspot中x86平臺相關部分的代碼比較熟悉,對JIT的inline cache、逆優化、OSR也算熟悉。 這裏求個詳細。能先介紹一下具體熟悉的部分是哪些不?
LeafInWind 寫道
但對字節碼到理想圖的轉換,以及ad文件在理想圖到最終機器碼之間轉換的細節,因爲平臺無關,目前還不算熟悉。
這些都是編譯原理的基礎知識。也就是說對編譯原理並不太熟悉?仍是說只是特定於C2的實現,由於它的代碼太⋯那啥,因此想知道編譯原理的各類概念如何在C2中體現? 若是編譯原理基礎都沒啥問題的話我就不用多說啦,直奔具體實現。反之樓主就得補習一下了。
LeafInWind 寫道
目前對C2編譯器最關注的實際上是它的寄存器分配問題。
這個好辦。C2的寄存器分配器用的是graph coloring的思路,具體來講是基於 Chaitin算法。它的一部分聲明就在ad文件裏(平臺相關的寄存器聲明、每條指令的「開銷」聲明之類)。相關論文在這兒有連接: https://wiki.openjdk.java.net/display/HotSpot/Graph+Coloring+Register+Allocation+Papers 因此研究C2的寄存器分配就是你的研究動機了是麼?或許不僅如此? |
|
LeafInWind 2014-02-10
RednaxelaFX 寫道
我前面的回帖有更新喔,回頭能夠讀讀看。
這個更新太全面了,如今再不敢說這些技術都瞭解了,看來從此一段時間有得忙了,感謝R神。 我對編譯的理解主要來自大學時的課程學習以及以前對ideal graph的學習(也就是看的Würthinger的碩士論文),但總感受只知其一;不知其二,因此想基於C2編譯器作更深刻的學習。 |
|
RednaxelaFX 2014-02-10
LeafInWind 寫道
我對編譯的理解主要來自大學時的課程學習以及以前對ideal graph的學習(也就是看的Würthinger的碩士論文),但總感受只知其一;不知其二,因此想基於C2編譯器作更深刻的學習。
呵呵,總算知道樓主在作的是啥項目了。加油! 我又稍微更新了一下前面的回覆,主要是針對你在頂樓問的那兩點,但願對你有幫助 ![]() |
|
LeafInWind 2014-02-11
看了Würthinger的碩士論文,對理想圖的語義都能理解,對其中介紹的優化也能明白,但這些優化都是直接基於理想圖的,文中卻沒有介紹理想圖是如何獲得的。
看了一下The Java HotSpotTM Server Compiler,其第四節parser感受就是在講字節碼到理想圖的轉換過程的,但感受講得實在太抽象了。 |
|
RednaxelaFX 2014-02-12
LeafInWind 寫道
看了一下The Java HotSpotTM Server Compiler,其第四節parser感受就是在講字節碼到理想圖的轉換過程的,但感受講得實在太抽象了。
多是由於你關心的是個實現細節而那個實在太直觀,做者以爲不必寫出來orz 有沒有去看看Graal的parser?(GraphBuilderPhase) |
|
LeafInWind 2014-02-12
R神 寫道
有沒有去看看Graal的parser?(GraphBuilderPhase)
如今開始看,呵呵
|
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)。
![]() |