これらは, C2 JIT Compiler 用のクラス. より具体的に言うと, ループのベクトル化処理で使用される補助クラス.
PhaseIdealLoop クラス内で使用される補助クラス(ResourceObjクラス). ループのベクトル化 (= ベクトル演算(SIMD演算)への変形処理, vectorization) を行う.
(なお, このクラスは ResourceObj クラスだが局所変数としてのみ生成されている)
((cite: hotspot/src/share/vm/opto/superword.hpp))
//
// S U P E R W O R D T R A N S F O R M
//
// SuperWords are short, fixed length vectors.
//
// Algorithm from:
//
// Exploiting SuperWord Level Parallelism with
// Multimedia Instruction Sets
// by
// Samuel Larsen and Saman Amarasighe
// MIT Laboratory for Computer Science
// date
// May 2000
// published in
// ACM SIGPLAN Notices
// Proceedings of ACM PLDI '00, Volume 35 Issue 5
//
// Definition 3.1 A Pack is an n-tuple, <s1, ...,sn>, where
// s1,...,sn are independent isomorphic statements in a basic
// block.
//
// Definition 3.2 A PackSet is a set of Packs.
//
// Definition 3.3 A Pair is a Pack of size two, where the
// first statement is considered the left element, and the
// second statement is considered the right element.
なおコメントによると, Larsen らの "Superword Level Parallelism" を実装したもの, とのこと (ところで "Saman Amarasighe" は "Saman Amarasinghe" の typo?? #TODO)
Samuel Larsen and Saman Amarasighe, MIT Laboratory for Computer Science,
Exploiting SuperWord Level Parallelism with Multimedia Instruction Sets,
PLDI 2000
((cite: hotspot/src/share/vm/opto/superword.hpp))
// -----------------------------SuperWord---------------------------------
// Transforms scalar operations into packed (superword) operations.
class SuperWord : public ResourceObj {
PhaseIdealLoop::build_and_optimize() 内で(のみ)(局所変数として)生成されている.
なお, このクラスは product オプションである UseSuperWord が true の場合にしか使用されない. ただしデフォルトでは true.
((cite: hotspot/src/share/vm/opto/c2_globals.hpp))
product(bool, UseSuperWord, true, \
"Transform scalar operations into superword operations") \
See: here for details
SuperWord クラス内で使用される補助クラス(ValueObjクラス).
メモリアクセス間の依存グラフ(dependency graph)を表す.
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------DepGraph---------------------------
class DepGraph VALUE_OBJ_CLASS_SPEC {
各 SuperWord オブジェクトの _dg フィールドに(のみ)格納されている.
(SuperWord クラスの _dg フィールドは, ポインタ型ではなく実体なので, SuperWord オブジェクトの生成時に一緒に生成される)
See: here for details
DepGraph クラス内で使用される補助クラス.
依存グラフ(dependency graph)内の node を表すクラス. 1つの DepMem オブジェクトが 1つの node に対応する.
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------DepMem---------------------------
// A node in the dependence graph. _in_head starts the threaded list of
// incoming edges, and _out_head starts the list of outgoing edges.
class DepMem : public ResourceObj {
以下の箇所に(のみ)格納されている.
各 DepGraph オブジェクトの _root フィールド
各 DepGraph オブジェクトの _tail フィールド
各 DepGraph オブジェクトの _map フィールド
(正確には, このフィールドは DepMem の GrowableArray を格納するフィールド. 各 Node オブジェクト (正確にはその Node::_idx フィールドの値) から対応する DepMem オブジェクトへの写像になっている)
以下の箇所で(のみ)生成されている.
See: here for details
DepGraph クラス内で使用される補助クラス.
依存グラフ(dependency graph)内の edge を表すクラス. 1つの DepEdge オブジェクトが 1つの edge に対応する.
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------DepEdge---------------------------
// An edge in the dependence graph. The edges incident to a dependence
// node are threaded through _next_in for incoming edges and _next_out
// for outgoing edges.
class DepEdge : public ResourceObj {
以下の箇所に(のみ)格納されている.
DepGraph::make_edge() 内で(のみ)生成されている.
See: here for details
SuperWord クラス内で使用される補助クラス.
指定の Node オブジェクトについて, 対応する DepMem の DepMem::_in_head 中の edge が指す Node, もしくはその Node の Node::_in 配列から指されている Node をたどるためのイテレータクラス(StackObjクラス).
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------DepPreds---------------------------
// Iterator over predecessors in the dependence graph and
// non-memory-graph inputs of ideal nodes.
class DepPreds : public StackObj {
以下の箇所で(のみ)使用されている.
See: here for details
?? (このクラスは使用箇所が見当たらない...)
指定の Node オブジェクトについて, 対応する DepMem の DepMem::_out_head 中の edge が指す Node, もしくはその Node の Node::_out 配列から指されている Node をたどるためのイテレータクラス(StackObjクラス).
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------DepSuccs---------------------------
// Iterator over successors in the dependence graph and
// non-memory-graph outputs of ideal nodes.
class DepSuccs : public StackObj {
See: here for details
SuperWord クラス内で使用される補助クラス.
各 Node オブジェクトについて SuperWord クラスが必要とする情報を格納しておくためのクラス. 1つの SWNodeInfo オブジェクトが 1つの Node オブジェクトに対応する.
((cite: hotspot/src/share/vm/opto/superword.hpp))
// -----------------------------SWNodeInfo---------------------------------
// Per node info needed by SuperWord
class SWNodeInfo VALUE_OBJ_CLASS_SPEC {
以下の箇所に(のみ)格納されている.
(正確には, このフィールドは SWNodeInfo の GrowableArray を格納するフィールド. 各 Node オブジェクト (正確にはその Node::_idx フィールドの値を SuperWord::bb_idx() で写像した値) から対応する SWNodeInfo オブジェクトへの写像になっている)
(SuperWord クラスの _node_info フィールドは, ポインタ型ではなく実体なので, SuperWord オブジェクトの生成時に一緒に生成される)
(SWNodeInfo クラスの initial フィールドは, ポインタ型ではなく実体なので, 初期段階で自動的に生成される)
単なる構造体のようなクラス. 内部には以下の public フィールドのみを持つ (そしてメソッドはない).
((cite: hotspot/src/share/vm/opto/superword.hpp))
int _alignment; // memory alignment for a node
int _depth; // Max expression (DAG) depth from block start
const Type* _velt_type; // vector element type
Node_List* _my_pack; // pack containing this node
See: here for details
SuperWord クラス内で使用される一時オブジェクト(ValueObjクラス).
MemNode からそのアクセス先のアドレス情報を抽出するためのクラス.
(なお, このクラスは StackObjクラスではないが現状では局所変数としてのみ生成されている)
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------SWPointer---------------------------
// Information about an address for dependence checking and vector alignment
class SWPointer VALUE_OBJ_CLASS_SPEC {
以下の箇所で(のみ)使用されている.
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか使用されない).
(なお, このクラスは (デバッグ時であることに加えて) SuperWordRTDepCheck オプションが指定されている場合にしか使用されない)
SuperWord クラス内で使用される補助クラス(ValueObjクラス). 2 個の Node オブジェクトからなる組(pair)を表す.
((cite: hotspot/src/share/vm/opto/superword.hpp))
//------------------------------OrderedPair---------------------------
// Ordered pair of Node*.
class OrderedPair VALUE_OBJ_CLASS_SPEC {
以下の箇所に(のみ)格納されている.
(正確には, このフィールドは OrderedPair の GrowableArray を格納するフィールド. この中に, その SuperWord 内で生成された全ての OrderedPair オブジェクトが格納されている)
SuperWord::dependence_graph() 内で(のみ)生成されている.
SuperWord::dependence_graph() 内で(のみ)使用されている (ただし #ifndef PRODUCT の場合にのみ使用される).
定義されているフィールドは以下の通り.
((cite: hotspot/src/share/vm/opto/superword.hpp))
Node* _p1;
Node* _p2;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.