C2 JIT Compiler 用の補助クラス (#ifdef COMPILER2 時にしか定義されない).
エスケープ解析(Escape Analysis)中に使用される一時オブジェクト(ResourceObjクラス).
呼び出し先が分かっている(= 動的ディスパッチが不要な)メソッド呼び出し箇所について, その引数や返値についてのエスケープ解析を行うクラス.
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// This class implements a fast, conservative analysis of effect of methods
// on the escape state of their arguments. The analysis is at the bytecode
// level.
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
class BCEscapeAnalyzer : public ResourceObj {
ciMethod::get_bcea() で, そのメソッドに対応する BCEscapeAnalyzer オブジェクトを取得する.
以下のメソッドで, 引数や返値についてのエスケープ解析結果が得られる.
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// The given argument does not escape the callee.
bool is_arg_local(int i) const {
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// The given argument escapes the callee, but does not become globally
// reachable.
bool is_arg_stack(int i) const {
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// The given argument does not escape globally, and may be returned.
bool is_arg_returned(int i) const {
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// True iff only input arguments are returned.
bool is_return_local() const {
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// True iff only newly allocated unescaped objects are returned.
bool is_return_allocated() const {
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp))
// Copy dependencies from this analysis into "deps"
void copy_dependencies(Dependencies *deps);
各 ciMethod オブジェクトの _bcea フィールドに(のみ)格納されている.
(ただし, BCEscapeAnalyzer オブジェクトの生成自体は実際に必要になるまで遅延されている)
(なお, ResourceObjクラスなので一時的なオブジェクト)
ciMethod::get_bcea() 内で(のみ)生成されている (= 初めて使用される時まで生成が遅延されている).
以下の箇所で(のみ)使用されている.
See: here for details
BCEscapeAnalyzer クラス内で使用される補助クラス.
各局所変数やオペランドスタック中の各スロットについて, その位置にどの引数の値が格納されうるかを記録しておくためのクラス.
1つの BCEscapeAnalyzer::ArgumentMap オブジェクトが 1つの局所変数または 1つのオペランドスタック中のスロットに対応する.
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp))
// Maintain a map of which aguments a local variable or
// stack slot may contain. In addition to tracking
// arguments, it tracks two special values, "allocated"
// which represents any object allocated in the current
// method, and "unknown" which is any other object.
// Up to 30 arguments are handled, with the last one
// representing summary information for any extra arguments
class BCEscapeAnalyzer::ArgumentMap {
以下の箇所に(のみ)格納されている.
(正確には, このフィールドは BCEscapeAnalyzer::ArgumentMap の配列を格納するフィールド. この中に, 局所変数に対応する全ての BCEscapeAnalyzer::ArgumentMap オブジェクトが格納されている)
(正確には, このフィールドは BCEscapeAnalyzer::ArgumentMap の配列を格納するフィールド. この中に, オペランドスタック中のスロットに対応する全ての BCEscapeAnalyzer::ArgumentMap オブジェクトが格納されている)
以下の箇所で(のみ)生成されている.
(StateInfo クラスの empty_map フィールドは, ポインタ型ではなく実体なので, StateInfo オブジェクトの生成時に一緒に生成される)
BCEscapeAnalyzer::iterate_blocks()
Arena::Amalloc() で BCEscapeAnalyzer::StateInfo の配列が確保される (ただし, Arena::Amalloc() なので一時的なオブジェクト)
なお, operator= がオーバーライドされている (このため StateInfo::raw_push() した結果はコピーされることに注意).
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp))
void operator=(const ArgumentMap &am) { _bits = am._bits; }
See: here for details
BCEscapeAnalyzer クラス内で使用される補助クラス.
各基本ブロックの先頭における局所変数/オペランドスタックの状態を示す.
((cite: hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp))
class BCEscapeAnalyzer::StateInfo {
BCEscapeAnalyzer::iterate_blocks() 内で(のみ)生成されている.
(なお, 局所変数として生成されているほか, Arena::Amalloc() で BCEscapeAnalyzer::StateInfo の配列も確保されている. ただし, Arena::Amalloc() なので一時的なオブジェクト)
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.