RevisionLog12000台

rev12913(trunk)

aobench(0.1inc)が2.9sec
ListのAPIや内部処理が多少改善されて、性能が戻ってきた。

rev12897(edge)


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


r12897
Add code for CPU feature detection and use it to detect SSE3 and SSE 4.1.
The Dart VM now requires at least SSE3 to build and run.
sse4_1とsse3っていうフラグ制御を追加しただけで、emitされるわけではない。

r12849
Fix error in r12771 disabling licm.
これはないなと。。

r12842
Add is_inlinable field to functions.
Repeated attempts at inlining functions that cannot be inlined leads to
noticeable performance regression when compiling with dart2js.
inline展開されましたフラグを保持するように変更
どのへんの制御に使われるフラグなのかは不明。


r12778
Support constant folding of instructions with constant smi values.
In sparse conditional constant propagation,
replace instructions with constant smi values with their constant value.
Extend the analysis to understant shift and bitwise binary operations.
Smi同士の、SHL SHR BIT_AND BIT_OR BIT_XOR に適用範囲を拡大した。
補助関数として、Integer::BitOp() Smi::ShiftOp()が追加


r12772
Fix convergence issues in range analysis.
Split it into three phases: initialization, widening and narrowing.
During widening and narrowing phi-ranges change according to
classical widening and narrowing operators defined as:
Widening:
[_|_, _|_] v [a, b] = [a, b]
 [a, b] v [c, d] = [c < a ? -inf : a, d > b ? +inf : b]

Narrowing:
[a, b] ^ [c, d] = [(a == -inf) ? c : min(a, c), (b == +inf) ? d : max(b, d)]
infer()の引数に、init, widen, narrowの3種を渡して、
収束しやすくした。みたい。
phiでループするようなケースにおいて、widenのフェーズでrangeは広がる方向に収束し、
narrowで狭まる。

r12771
Disable loop invariant code motion on deoptimized functions.
deoptimization_counter()を参照して、
一度deoptされた関数の場合LICMを抑止する。
LICMの際にDeoptでメンテナンスを行っていたが、特定条件下においてメンテしきれないのだと思う。

r12756
Reapply "A simpler scheme for garbage collection of ureachable phi inputs."
Fix two issues:
(1)Unreachable code elimination did not correctly identify all unreachable blocks. [#s665973e]
(2)Loop detection in the register allocator relied on the block IDs. [#u9f95118]


r12733
Implement range analysis for smi values.
And use it to eliminate overflow checks on + and - operations.
TargetEntryInstrに、RangeAnalysis関連のフィールドとメソッド追加
Constraint命令追加

range_analysisオプションで制御できる。

RangeAnalysis for smi Values.
remove overflow checks from binary smi

if (FLAG_range_analysis) {
// We have to perform range analysis after LICM because it
 // optimistically moves CheckSmi through phis into loop preheaders
 // making some phis smi.
 flow_graph->ComputeUseLists();
 optimizer.InferSmiRanges();
 {
   range_analysis()
   Analyze()
   {
     CollectSmiValues()   // smiのdefとphi、checksmiを収集する。
     InsertConstraints()  // 各々defにconstraintを設定して初期化する
                          // branchで分かれる場合、true_constraintとfalse_constraintそれぞれに、
                          // それぞれのbranchに分岐した際のRelationを更新してあげる。
     InferRanges()        // worklist方式で推論する。rangeは、min_smiとmax_smiの間で推論する。
                          // rangeに変更があった場合、def->useをworklistに突っ込んで収束するまで繰り返す
     RemoveConstraints()  // 不要になったConstrantを削除
   }
 }
}

恐らく、将来的にはBinarySmiOpがEmitする際の、
add, j(overflow) <-- このjumpを削除するのだと思う。

実際のソースコード比較

diff 6k

全体として、RedirectingFactory関連の修正が多い。

object.h

redirection_data_class
namespace_class
snapshotもあわせて拡張

CPUFuatures
sse3_supported()
sse4_1_supported()

StrictCompareInstr::EmitNativeCode
両方のoperandがconstantだったら畳み込む。

rev12649(edge)


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


r12645
Disable inlining by default.
Inlining deoptimizable code currently causes errors.
残念。 有効にする場合は、use_inlining=true

r12630
Improve SminessPropagator to propagate sminess across cycles of phis.
若干phiのたどり方が変わった

r12621
A simpler scheme for garbage collection of ureachable phi inputs.
Simplify the garbage collection of unreachable phi inputs. Assign immutable
block ids to basic blocks and ensure that both predecessor blocks and phi
inputs are kept sorted by block id.
revertされているけど、
EliminateUnreachablePhiInputs()とClearPredecessors()の置き換え ???

r12616
Introduce a VM-only dart:scalarlist library for byte arrays.
Include it in the SDK so users can use it. Create a dummy
implementation and patch file for the library for dart2js so it can be
documented. Johnni, can you think of a nicer way of making
documentation generation work for a VM only library? Also, it seems that
patching kills the documentation comments and they do not show up in
the generated docs.
DartVMの現在のListはあまり高速でなく、
Javaの配列アクセスを多用するプログラムを移植してくると遅くなってしまう。
byte array用の高速なAPIを作って、VM内部で高速な実装を用意する準備なのだと思う。

r12561
Reapply "Initial implementation of sparse conditional constant propagation."
With a fix for compilation on Mac. GrowableArray is DISALLOW_COPY_AND_ASSIGN,
so we can't create a temporary one to be ignored and have to pass one in to be
ignored.
class ConstantPropagator追加. FOR_EACH_INSTRUCTIONマクロは便利ですね。。
オプションは、cp
ここでEliminateUnreachablePhiが追加されたのね。。
到達BlockをSCCPが全部解析して、不要になったブロックは上記で削除するみたい。
SetValueで、Definitionクラスにフィールド追加されたconstant_value_に値更新、lattice管理
latticeを更新すると、use_liseをworklistに追加して伝搬していく。
visitでworklistのinstrを走査しながら、BinarySmiOpの両辺Constantは畳み込む。
TODO support equality for doubles, mints, etc.

ObjectクラスにRawIntergerが沢山追加されている。CPで流用するため。
定数の管理やUtilityを用意。

r12511
Lazy peer API.
This change provides getters and setters for a lazily allocated field
associated with every heap allocated object. It is a generalization
of the peer field of external string instances, external byte array
instances, and the smrck field of closure instances.
すごく興味深い機能だけど、今後APIに色々追加するんですかね?
これはDartVM専用の機能になるのかな。

r12502
Fix bad optimization of instance-of with uninstantiated types (issue 5216).
Fix bad assert when type check elimination is disabled (issue 5217).
Cleanup of type elimination code in optimizing compiler.
eliminate_type_checksが改善
CanComputeIsNullと、CanComputeIsInstanceOfのケースも削除対象


r12499
Reapply "Deoptimization support in inlined code."
inlining bailoutがかなり減った。
PolymorphicInstanceCallが候補1つだけの場合、積極的にinliningするようになった。

実際のソースコード比較

diff 6k

Peerは、std::map<RawObject*, void*>みたいなデータ構造と理解
RawObjectは、GCの管理対象として、スペースごとに管理されており、
各スペースごとにPeerも管理することになった。

Peerは、通常のheap管理とは別のmapで管理する。
Heap::SetPeer(RawObject*, void*) Heap::GetPeer(RawObject*)

IsNewObjectとIsOldObjectってなんでしょうね。
kNewObjectAlignmentOffset = kWordSize,
kOldObjectAlignmentOffset = 0,

raw_objがold_spaceかnew_spaceかによって、void* peerの処遇も変わるようで。
PageSpaceクラスに、GetPeer() SetPeer()メソッドを追加し、
PeerTable map管理されており、Get/Setできるみたい。

Scavengeの際にPRocessPeerReferents()が呼ばれ、PeerTableを捜査し、
IsForwardingだったら、SetPeerでspaceのテーブルの参照を更新する。

GCMarkerにおいて、Peer向けの処理が追加
Markから漏れてRawObjectがSurvivedでない場合、Peer_tableから削除。


FlowGraphAllocatorも大きく更新されている。
valueがConstantだった場合の、rangeやlivein/outの解析が改良されている。
ProcessEnvironmentUses()のConstant周りの処理が一新。
代わりに、最後に行っていた Process global constantsが削除

generateInlinedMathSqrt()が削除されている。
NumberNegateInstrが削除。

rev12578(trunk)

aobench(0.1inc) 2.9sec
aobench(0.1inc) 2.8sec 改造版、deoptで漏れなく最適化。

rev12448(trunk)

aobench(0.1inc) 3.4sec
aobench(0.1inc) 改造版、3.3sec

rev12443(edge)



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

r12443
Avoid using a temp register when unboxing a known smi.
Instead of saving into a temp, restore the input by re-tagging
it after the conversion.
UnboxDoubleInstr::Emitにおいて、smiの場合に、高速なunbox命令群をEmitする。

r12437
Simple redundant load elimination.
This analysis uses bit vectors to track side effects. Currently, there is
only one type of side effect which affects all mutable load-field instructions.
The elimination pass is a dominator tree preorder traversal like the existing
CSE pass. Instead of a hash-map it keeps an array with the current dominating
occurrence for each load expression.
LLVMのGVNっぽく、冗長なLoad命令除去を追加
HasSideEffect()を追加、BitVectorをエンハンス
AvailLoadをBitVectorで管理し、HasSideEffectがあればdrop
Availであるかぎり、冗長なLoadの使用点を、AvailLoadの使用点で置き換えていく。
支配順にたどり、子の支配ブロックへAvailLoadを伝搬していく。
AvailLoadは、このパスを実行する前に、1回だけ解析する。
Avail out/gen/killの集合をbitvectorを使って効率よく計算していく。
とはいえ、最後はAvail in/out/kill/genが収束するまで計算する。


r12430
Enable CSE for binary smi ops and constants.
中間表現のAttributeEqualをエンハンスして、CSEでEqualする際の対象にした。


r12427
Mangle private names in the method recognizer otherwise they are not recognized.
mangle部分を除去して比較するメソッドの追加

r12378
Enable redundancy elimination for initialized static final fields.
Once initialized, static final fields are immutable and can participate
in common subexpression elimination and code motion without being affected by side effects.


r12332
Add unboxed double negation and reenable optimized smi negation.
Fix the optimizer to recognize unary minus operations and
implement double negation as (x * -1) using the unboxed double multiplication.
unary-向けに特殊化
negate向けにUnboxedDoubleBinaryOpeで特殊化


r12322
Optimize code for bound checks if array is constant.
Skip unnecessary Smi checks if they still survived to code emission.
定数の配列のBoundCheckが冗長なので生成抑止。
Emit時に検出したらAssert


r12273
Mark phi as producing a smi value if it is dominated by SmiChecks over its operands.
SminessPropagator追加 worklistをたどる形式
PropagateSminessRecursive()は、BBを支配順にたどりながら、BB中のCheckSmiInstrを収集して、smiを確定させていく。
phiがSmiでないけど、phiのinputがSmiと確定していたら、最終的にProcessPhis()で判定。
ProcessPhis()では、worklistを順にたどりながら、
phiがSmiと確定したら、phiのinput_use_list()をたどって、phiだったらworklitに追加
ネストしたループのphiを、内側からsmiに確定させていく処理なのだと推測。

r12257
Use ICData to collect type feedback on instance setter value.
If value is always Smi, insert a smi check and eliminate the store barrier.
TODO: Implement it for indexed store (collecting three arguments).
emit_store_barrierフラグを新規追加、有効な場合StoreIntoObject()でEmitする。
有効でない場合(ArgIsAlwaysSmi(* instr->ic_data(), 1)で確認し、CheckSmiInstrを挿入済み。)
StoreIntoObjectNoBarrier()でEmitする。

実際のソースコード比較

diff 6k

vm/dart_api_implの変更が多い。
r12342の以下が対象らしい。
  • Added supporting functions to the dart embedding api:
  • Dart_ClassIsTypedef
  • Dart_ClassGetTypedefReferent
  • Dart_ClassIsFunctionClass
  • Dart_ClassGetFunctionClassSignature
  • Dart_FunctionReturnType
  • Dart_FunctionParameterType
  • Dart_VariableType
  • Dart_GetTypeVariableNames
  • Dart_LookupTypeVariable
  • Dart_IsTypeVariable
  • Dart_TypeVariableOwner
  • Dart_TypeVariableUpperBound

InlineCacheMissHandlerThreeArgs
ThreeArgsCheckInlineCache

LoadVMFieldInstrからLoadFieldInstrへ置換?

remove
LoadInstanceField
LoadVMField
CheckBound

snapshot ClosureData::ReadFrom ClosureData::WriteTo


rev12270(trunk)

aobench(0.1inc)が3.6sec

rev12254(edge)


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

r12254
Whenever possible use length passed to the List constructor for bounds checks
instead of loading it from the array object itself.

既存のCheckArrayBoundInstr
が、新規追加されたCheckBoundInstrに特殊化される。

BoundCheckInstr命令、cmpしてBoundを越えればdeoptimize

r12249
Flush instruction cache when patching for lazy deopt.

2命令追加されただけだけど、効果がよくわからん。

r12245
Split array loads/stores for growable arrays into two IL instructions.
This simplifies the code generation function for indexed loads/stores
a lot and help eliminating the load of the backing store in the future.
Enable CSE for loads of immutable fields like string length or fixed array
length.

StoreIndexedInstr & LoadIndexedInstr
両者のEmitNativeCodeが簡略化

r12244
Inline monomorphic calls.
Also add inlining support for more instructions that can not deoptimize.

沢山InlineBailoutが追加された。。
inliningの対象がStaticCallからDefinitionに拡張
ClosureCallもPolymorphicInstanceCallもinlineを試行する
けどまだ大量のBailoutにひっかかって効果はなさそう。


r12226
Shrink the size of deoptimization_counter_ and kind_tag_ fields. This
compensates for the new num_optional_named_parameters_ field.

deoptimization_counterがintptr_t->int16_t
代わりにuint16_t kind_tag_を追加


r12109
Use CHA to eliminate checks for calls on receiver of caller: check that there can be only one target.

DynamicFunctionのreceiverを、CHAを使用して解析、
可能であればcall_of_checkを除去してPolymorphicInstanceCallInstrに置換

実際のソースコード比較

diff 5k

kWritableRegister ???

trace_ic_miss_in_optimizedフラグ追加

FactoryConstructorがListFactoryだった場合の特殊化が追加
kGlowableOpbjectArrayCidとkArrayCid

IRに以下が追加
GlowableObjectArray get::capacity
MathSqrtInstr
CheckBoundInstr

bool InstanceCallNeedsClassCheck()

visitStaticCallでMathSqrtInstrへの特殊化を行っている

rev12079(edge)


実際のソースコード比較

diff 4k

optional parameter関連が多いかも

LICM追加
TryHoistCheckSmiThroughPhi
phiがSmiなら、CheckSmiは不要なので除去
 phiがDynamicCidだけど、opがsmiとnon-smiの場合、
 phiをSmiに格上げして、non-smiをcheck付きでhoistする。


Intrinsifier Double_toInt追加

assemblerにcvttsd2siq追加。CVTTSD2SI r64, xmm1/m64

metadata
skipMetadataのみ。parseできますよ程度。


FlipCondition
EvaluateCondition
静的に評価可能なConditionを評価する。
しかもEmit直前に行う。。

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


r12078
VM can parse and ignore metadata

Support parsing of metadata in all legal locations except library
and import directives. The metadata is simply ignored. It is not
evaluated or validated for correctness.

r12014
Repair flow graph printing after graph refactoring.

r12006
Revert "Finalize reachable weak persistent handles at isolate shutdown."

r11947
Allow smi comparisons to have constant operands.
Remove unnecessary temps reserved for them.
Load constants directly in phi moves.
Generate xor(reg, reg) for loading of 0 instead of mov.

branchの片方のオペランドが定数だったら、 xorl
ComparisonをEmitするタイミングで両オペランドのConstantを静的評価している。
のちのちConstant Propagationによって置き換えられるらしい。

r11946
Implement loop invariant code motion for check instructions.
This CL adds a new optimization pass that hoist loop invariant
instructions upwards out of loops.

LICM追加 Inst単位にHasSideEffectを持つのは面白い。
ループ検出はDominator任せ。
今はCheck系やBoxUnbox系のInstしか引き上げできなさそう。
Deoptの詳細把握してないのでよくわからんけどLICMでDeoptメンテしてますね。

  • 最終更新:2012-09-30 23:11:33

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

認証パスワード