RevisionLog11000台


rev11869(edge)


実際のソースコード比較

diff 6k

deoptimization関連

CompilerDeoptInfo
CompilerDeoptInfoWithStub
DeoptRetAddrAfterInstr
DeoptRetAddrBeforeInstr


リファクタリング関連

Valueクラス
definition()
 next_use()
 instruction()
 PrintTo()

enum Representation
kTagged, kUnboxedDouble

EmbeddedArrayクラス

Instructionクラス
PrintTo()

BinaryDoubleOpCompが削除

parseが結構改造されてる


optimizer関連

ShouldSpecializeForDouble()

HandleRelationalOpのHasOnlyTwoSmiの特殊化
HandleEqualityCompareのHasOnlyTwoSmiの特殊化
not impl mixed mode

BinarySmiOpにおいて、opの片方がConstantだった場合のコード生成を改造


リビジョンログを読んで興味深かったもの抜粋


Remove classes Computation and BindInstr. だけどRevertされた

CheckNonSmiの追加、だけどRevertされた

Specialize binary operations with mixed Smi-Double feedback as Double ones.

Only store IC data with instructions that collect type feedback.
Currently only three instructions,
InstanceCall EqualityOp RelationalOp


rev11709(trunk)

aobench(0.1ずつインクリメント)をリファクタリング
数ヶ所、doubleとintの演算(+, *)が残っていたので、binary operatorの型が一致するように書き換えたところ、
3.9sec --> 3.75sec

binary operatorの型が一致しない場合、以下に例を示すと、
smi `binary operator` double と double `binary operator` smiで生成される最適化後のComputationが異なるため、
かなり性能劣化したバイナリを生成することがあるので要注意。

上記のような場合、toDouble()してdouble同士で演算すると、変に劣化したコードは生成されない。

※ rev11757で解決しました。
上記のような場合、Double型の演算に特殊化されて扱われるようになりました。

rev11709(trunk)

aobench(0.1ずつインクリメント)が5.5sec --> 3.9sec

これはunboxingの効果が大きい。1.3sec程度縮めている。
static callのinline展開も入ったけど、0.2sec縮めている。


rev11673(edge)


実際のソースコード比較

7k
a flow_graph_inliner

option
--deoptimize_alot
 --trace_inlining

deoptimize関連

xmmレジスタのコピーや退避処理が追加

flow_graph関連

Inlining向けの制御が追加

Inliningの処理が、FlowGraphのbuilderで新規解析を行った、自分にくっ付けるだけって面白いな。。

Inliningは、今のところ、static callのみ。また早期に実施する。

intermediate_language関連

ArgumentDefinitionTestが追加

parseに、formal parameterのチェック機能追加。ArgumentDefinitionTestを生成するみたい

stack_frameにStackMapのコメントが追加

StackMap内では、レジスタは全てbitmap管理らしい

EliminateDeadPhis()

SelectRepresentations()
BoxDouble/UnboxDouble処理
 名前がV8っぽい

GenerateDartCall()追加

EmitClassChecksNoSmi()削除

Deoptimization Infrastructureって読ばれているけど、まだちゃんと理解できてない。


全体的に、double向けの処理と、xmmレジスタの使用に関して、手が入ってきた。

smi向けのVMの最適化は一通り終わって、今はdouble向けにいろいろ実装を進めているのかもしれない。


リビジョンログを読んで興味深かったもの抜粋


option --deoptimize-alot

The continuation for lazy deoptimization

Rematerialize constants instead of spilling

Add explicit class checks: LoadVMField class

Inlining of static calls

Eliminate Boxing/Unboxing pairs.


rev11635(trunk)


aobench(0.1)が5.5sec

rev11547(edge)


diff 6k ほとんどリファクタリング

vm/heap

GCReasonってのが追加されて、gcのcodespaceは以下のいずれからしい。

new space, promotion failure, old space, code space, full, debugging, test case

snapshotの際に、message型の場合はnewに割り付け、それ以外の場合はoldに割り付け

FlowGraphAllocator

global constans対応

IntermediageLanguage

Materializeが削除、、

StrictCompareAndBranchが削除, StrictCompareになったかも

CodeGeneratorのDEOPT_REASONSが興味深い

EmitBranch()を追加

EqualityCompare, RelationalOp,

benchmark_testに、DartStringAccessってのが追加

rev11433(edge)

diff 3k

AttributeEqualの新規追加

CheckArrayBoundCompの新規追加

Optimizerにおいて、
insertBefore, insertAfterメソッドを使用して、
積極的にguardを挿入するようになってきた。

smiだった場合にCheckArrayBound

UseListのValidator reset

snapshotの修正が増えてきた。Computationが増えたのが原因だろうか。

intermediate_languageから
deopt系のStub追加処理が削除


rev11407(trunk)

aobench(0.1) 5.4sec


rev11373(edge)

diff 9k

aobench(0.1) 5.7sec

Locations & FlowGraphAllocator

locationsのkindに、kXmmRegisterと、kDoubleStackSlotが追加
併せてFlowGraphAllocatorを大改造

レジスタに関連する処理全体にxmmレジスタ対応で修正入っている。


FlowGraphBuilder

StrictCompareAndBranchへの置換処理


intermediate_language

特殊化されたComputationが増えてきた。
CheckSmi
CheckEitherNonSmi
UnboxedDoubleBinaryOp
UnboxDouble
BoxDouble
StrictCompareAndBranch

FlowGraphOptimizer

--use_unboxed_doubles

inst = Computation(DoubleCid, left, right)

t0 = CheckEitherNonSmi(left, right);
t1 = UnboxDouble(left);
t2 = UnboxDouble(right);
t3 = UnboxedDoubleBinaryOp(t1, t2);


LocalCSEが首に。
DominatorBasedCSE()

Block全体みたいん

--trace_optimizationで参照可能

最適化パス群が出来上がってきたかも
BuildGraph
ComputeSSA
LocalLoad/LocalStoreは変換の際に除去するらしい
ApplyICData
PropagateTypes
OptimizeComputations
DominatorBasedCSE


ComputeUseListとは何ぞや
Handlerでメンテしないので、明示的に再解析?



Locationでレジスタとスタックの推移を管理して、
PeepholeOptみたいなことをするつもりなのかな?

Computation単位でEmitする仕組みであるため、
Computation単位でin/out/tempのレジスタを管理し、
MacroAssemblerの引数にLocationで管理しているレジスタを指定する。

rev11197(trunk)

diff 5k

A cha ClassHierarchyAnalysis
オプション --use_cha

dart_api_impl 修正量多い
RemoveOptimizedCode()実装。
JVMみたいにクラスロード時???にDeoptimize
 将来的にはCHA参照みたい。
AddDirectSubclass追加

Computationに以下を追加
BinarySmiOp
 BinaryMintOp
 BinaryDoubleOp
 Materialize

is_ssaからis_optimizingに変更。grepする際はこのキーワードで

AllocateRegistersLocally greedy local register allocation

FlowGraphOptimizer
AddCheckClassを新規追加
 smiどうしやdoubleどうしは特殊化しつつある


  • 最終更新:2012-09-26 23:38:07

このWIKIを編集するにはパスワード入力が必要です

認証パスワード