From: Vladimir Kozlov
Date: May 15, 2009 1:47:21 PM PDT
_C2 implements the flow-insensitive escape analysis algorithm described in:
[Choi99] Jong-Deok Shoi, Manish Gupta, Mauricio Seffano, Vugranam C. Sreedhar, Sam Midkiff, "Escape Analysis for Java", Procedings of ACM SIGPLAN OOPSLA Conference, November 1, 1999 |
The analysis requires construction of a "connection graph" (CG) for the method being analyzed. The nodes of the connection graph are:
- Java objects (JO) - Local variables (LV) - Fields of an object (OF), these also include array elements |
C2 does not have local variables. However for the purposes of constructing the connection graph, the following IR nodes are treated as local variables:
Phi (pointer values) LoadP, LoadN Proj#5 (value returned from call nodes including allocations) CheckCastPP, CastPP, EncodeP, DecodeN Return (GlobalEscape) |
The LoadP, Proj and CheckCastPP behave like variables assigned to only once. Only a Phi can have multiple assignments. Each input to a Phi is treated as an assignment to it.
The following node types are JavaObject:
top() Allocate AllocateArray Parm (for incoming object arguments, GlobalEscape) CastX2P ("unsafe" operations, GlobalEscape) CreateEx (GlobalEscape) ConP, ConN (GlobalEscape except for null) LoadKlass, LoadNKlass (GlobalEscape) ThreadLocal (ArgEscape) |
AddP nodes are fields.
After building the graph, a pass is made over the nodes, deleting deferred nodes and copying the edges from the target of the deferred edge to the source. This results in a graph with no deferred edges, only:
LV -P> JO OF -P> JO (the object whose oop is stored in the field) JO -F> OF |
After that escape analysis makes a pass over the nodes and determines nodes escape state:
After escape analysis C2 eliminates scalar replaceable object allocations and associated locks. C2 also eliminates locks for all non globally escaping objects. C2 does NOT replace a heap allocation with a stack allocation for non globally escaping objects.