Skip to content

Commit 1d12372

Browse files
Change the class membership of a number of functions.
This shouldn't have changed any actual runtime semantics yet, but it does change pointer use somewhat - initial tests show no perf swing.
1 parent 8e00090 commit 1d12372

15 files changed

+2230
-2310
lines changed

lib/Backend/FlowGraph.cpp

Lines changed: 367 additions & 817 deletions
Large diffs are not rendered by default.

lib/Backend/FlowGraph.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,14 @@ class BasicBlock
330330

331331
bool IsLandingPad();
332332

333-
#if DBG_DUMP
333+
// GlobOpt Stuff
334+
public:
335+
void MergePredBlocksValueMaps(GlobOpt* globOptState);
336+
private:
337+
void CleanUpValueMaps();
334338

339+
#if DBG_DUMP
340+
public:
335341
void DumpHeader(bool insertCR = true);
336342
void Dump();
337343

lib/Backend/GlobOpt.cpp

Lines changed: 237 additions & 572 deletions
Large diffs are not rendered by default.

lib/Backend/GlobOpt.h

Lines changed: 7 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,6 @@ namespace JsUtil
274274
};
275275
};
276276

277-
typedef SList<GlobHashBucket*, JitArenaAllocator> PRECandidatesList;
278-
279277
typedef JsUtil::BaseDictionary<IntConstType, StackSym *, JitArenaAllocator> IntConstantToStackSymMap;
280278
typedef JsUtil::BaseDictionary<int32, Value *, JitArenaAllocator> IntConstantToValueMap;
281279
typedef JsUtil::BaseDictionary<int64, Value *, JitArenaAllocator> Int64ConstantToValueMap;
@@ -379,6 +377,8 @@ class InvariantBlockBackwardIterator
379377
PREVENT_ASSIGN(InvariantBlockBackwardIterator);
380378
};
381379

380+
class FlowGraph;
381+
382382
class GlobOpt
383383
{
384384
private:
@@ -390,6 +390,8 @@ class GlobOpt
390390
#if DBG
391391
friend class ObjectTempVerify;
392392
#endif
393+
friend class GlobOptBlockData;
394+
friend class BasicBlock;
393395

394396
private:
395397
SparseArray<Value> * byteCodeConstantValueArray;
@@ -486,7 +488,6 @@ class GlobOpt
486488

487489
IR::ByteCodeUsesInstr * ConvertToByteCodeUses(IR::Instr * isntr);
488490
bool GetIsAsmJSFunc()const{ return isAsmJSFunc; };
489-
BOOLEAN IsArgumentsOpnd(IR::Opnd const* opnd) const;
490491
private:
491492
bool IsLoopPrePass() const { return this->prePassLoop != nullptr; }
492493
void OptBlock(BasicBlock *block);
@@ -495,27 +496,15 @@ class GlobOpt
495496
void OptLoops(Loop *loop);
496497
void TailDupPass();
497498
bool TryTailDup(IR::BranchInstr *tailBranch);
498-
void CleanUpValueMaps();
499499
PRECandidatesList * FindBackEdgePRECandidates(BasicBlock *block, JitArenaAllocator *alloc);
500-
PRECandidatesList * RemoveUnavailableCandidates(BasicBlock *block, PRECandidatesList *candidates, JitArenaAllocator *alloc);
501500
PRECandidatesList * FindPossiblePRECandidates(Loop *loop, JitArenaAllocator *alloc);
502501
void PreloadPRECandidates(Loop *loop, PRECandidatesList *candidates);
503502
BOOL PreloadPRECandidate(Loop *loop, GlobHashBucket* candidate);
504503
void SetLoopFieldInitialValue(Loop *loop, IR::Instr *instr, PropertySym *propertySym, PropertySym *originalPropertySym);
505504
void FieldPRE(Loop *loop);
506-
void MergePredBlocksValueMaps(BasicBlock *block);
507-
void NulloutBlockData(GlobOptBlockData *data);
508-
void InitBlockData(GlobOptBlockData* data);
509-
void ReuseBlockData(GlobOptBlockData *toData, GlobOptBlockData *fromData);
510-
void CopyBlockData(GlobOptBlockData *toData, GlobOptBlockData *fromData);
511505
void CloneBlockData(BasicBlock *const toBlock, BasicBlock *const fromBlock);
512-
void CloneBlockData(BasicBlock *const toBlock, GlobOptBlockData *const toData, BasicBlock *const fromBlock);
513506
void CloneValues(BasicBlock *const toBlock, GlobOptBlockData *toData, GlobOptBlockData *fromData);
514507

515-
template <typename CapturedList, typename CapturedItemsAreEqual>
516-
void MergeCapturedValues(GlobOptBlockData * toData, SListBase<CapturedList> * toList, SListBase<CapturedList> * fromList, CapturedItemsAreEqual itemsAreEqual);
517-
void MergeBlockData(GlobOptBlockData *toData, BasicBlock *toBlock, BasicBlock *fromBlock, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge, bool forceTypeSpecOnLoopHeader);
518-
void DeleteBlockData(GlobOptBlockData *data);
519508
void TryReplaceLdLen(IR::Instr *& instr);
520509
IR::Instr * OptInstr(IR::Instr *&instr, bool* isInstrCleared);
521510
Value* OptDst(IR::Instr **pInstr, Value *dstVal, Value *src1Val, Value *src2Val, Value *dstIndirIndexVal, Value *src1IndirIndexVal);
@@ -532,10 +521,6 @@ class GlobOpt
532521
void OptArguments(IR::Instr *Instr);
533522
void TrackInstrsForScopeObjectRemoval(IR::Instr * instr);
534523
bool AreFromSameBytecodeFunc(IR::RegOpnd const* src1, IR::RegOpnd const* dst) const;
535-
void TrackArgumentsSym(IR::RegOpnd const* opnd);
536-
void ClearArgumentsSym(IR::RegOpnd const* opnd);
537-
BOOLEAN TestAnyArgumentsSym() const;
538-
BOOLEAN IsArgumentsSymID(SymID id, const GlobOptBlockData& blockData) const;
539524
Value * ValueNumberDst(IR::Instr **pInstr, Value *src1Val, Value *src2Val);
540525
Value * ValueNumberLdElemDst(IR::Instr **pInstr, Value *srcVal);
541526
ValueType GetPrepassValueTypeForDst(const ValueType desiredValueType, IR::Instr *const instr, Value *const src1Value, Value *const src2Value, bool *const isValueInfoPreciseRef = nullptr) const;
@@ -545,25 +530,8 @@ class GlobOpt
545530
Value * ValueNumberTransferDst(IR::Instr *const instr, Value *src1Val);
546531
bool IsSafeToTransferInPrePass(IR::Opnd *src, Value *srcValue);
547532
Value * ValueNumberTransferDstInPrepass(IR::Instr *const instr, Value *const src1Val);
548-
Value * FindValue(GlobOptBlockData* blockData, Sym *sym);
549-
Value * FindValue(GlobHashTable *valueNumberMap, Sym *sym);
550-
ValueNumber FindValueNumber(GlobHashTable *valueNumberMap, Sym *sym);
551-
Value * FindValueFromHashTable(GlobHashTable *valueNumberMap, SymID symId);
552-
ValueNumber FindPropertyValueNumber(GlobHashTable *valueNumberMap, SymID symId);
553-
Value * FindPropertyValue(GlobHashTable *valueNumberMap, SymID symId);
554-
Value * FindObjectTypeValue(StackSym* typeSym);
555-
Value * FindObjectTypeValue(StackSym* typeSym, GlobHashTable *valueNumberMap);
556-
Value * FindObjectTypeValue(SymID typeSymId, GlobHashTable *valueNumberMap);
557-
Value * FindObjectTypeValue(StackSym* typeSym, BasicBlock* block);
558-
Value* FindObjectTypeValue(SymID typeSymId, BasicBlock* block);
559-
Value * FindObjectTypeValue(StackSym* typeSym, GlobHashTable *valueNumberMap, BVSparse<JitArenaAllocator>* liveFields);
560-
Value * FindObjectTypeValue(SymID typeSymId, GlobHashTable *valueNumberMap, BVSparse<JitArenaAllocator>* liveFields);
561-
Value * FindFuturePropertyValue(PropertySym *const propertySym);
562533
IR::Opnd * CopyProp(IR::Opnd *opnd, IR::Instr *instr, Value *val, IR::IndirOpnd *parentIndirOpnd = nullptr);
563534
IR::Opnd * CopyPropReplaceOpnd(IR::Instr * instr, IR::Opnd * opnd, StackSym * copySym, IR::IndirOpnd *parentIndirOpnd = nullptr);
564-
StackSym * GetCopyPropSym(Sym * sym, Value * val);
565-
StackSym * GetCopyPropSym(BasicBlock * block, Sym * sym, Value * val);
566-
void MarkTempLastUse(IR::Instr *instr, IR::RegOpnd *regOpnd);
567535

568536
ValueNumber NewValueNumber();
569537
Value * NewValue(ValueInfo *const valueInfo);
@@ -593,12 +561,6 @@ class GlobOpt
593561
StackSym * GetOrCreateTaggedIntConstantStackSym(const int32 intConstantValue) const;
594562
Sym * SetSymStore(ValueInfo *valueInfo, Sym *sym);
595563
void SetSymStoreDirect(ValueInfo *valueInfo, Sym *sym);
596-
void SetChangedSym(SymID symId);
597-
Value * InsertNewValue(Value *val, IR::Opnd *opnd);
598-
Value * InsertNewValue(GlobOptBlockData * blockData, Value *val, IR::Opnd *opnd);
599-
Value * SetValue(GlobOptBlockData * blockData, Value *val, IR::Opnd *opnd);
600-
void SetValue(GlobOptBlockData * blockData, Value *val, Sym * sym);
601-
void SetValueToHashTable(GlobHashTable * valueNumberMap, Value *val, Sym *sym);
602564
IR::Instr * TypeSpecialization(IR::Instr *instr, Value **pSrc1Val, Value **pSrc2Val, Value **pDstVal, bool *redoTypeSpecRef, bool *const forceInvariantHoistingRef);
603565

604566
#ifdef ENABLE_SIMDJS
@@ -713,7 +675,7 @@ class GlobOpt
713675
void DetectUnknownChangesToInductionVariables(GlobOptBlockData *const blockData);
714676
void SetInductionVariableValueNumbers(GlobOptBlockData *const blockData);
715677
void FinalizeInductionVariables(Loop *const loop, GlobOptBlockData *const headerData);
716-
bool DetermineSymBoundOffsetOrValueRelativeToLandingPad(StackSym *const sym, const bool landingPadValueIsLowerBound, ValueInfo *const valueInfo, const IntBounds *const bounds, GlobHashTable *const landingPadSymToValueMap, int *const boundOffsetOrValueRef);
678+
bool DetermineSymBoundOffsetOrValueRelativeToLandingPad(StackSym *const sym, const bool landingPadValueIsLowerBound, ValueInfo *const valueInfo, const IntBounds *const bounds, GlobOptBlockData *const landingPadGlobOptBlockData, int *const boundOffsetOrValueRef);
717679

718680
private:
719681
void DetermineDominatingLoopCountableBlock(Loop *const loop, BasicBlock *const headerBlock);
@@ -733,6 +695,8 @@ class GlobOpt
733695
public:
734696
JsArrayKills CheckJsArrayKills(IR::Instr *const instr);
735697

698+
GlobOptBlockData const * GetCurrentBlockData() const;
699+
736700
private:
737701
bool IsOperationThatLikelyKillsJsArraysWithNoMissingValues(IR::Instr *const instr);
738702
bool NeedBailOnImplicitCallForArrayCheckHoist(BasicBlock const * const block, const bool isForwardPass) const;
@@ -743,12 +707,6 @@ class GlobOpt
743707

744708
void PreLowerCanonicalize(IR::Instr *instr, Value **pSrc1Val, Value **pSrc2Val);
745709
void ProcessKills(IR::Instr *instr);
746-
void MergeValueMaps(GlobOptBlockData *toData, BasicBlock *toBlock, BasicBlock *fromBlock, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
747-
Value * MergeValues(Value *toDataValueMap, Value *fromDataValueMap, Sym *fromDataSym, GlobOptBlockData *toData, GlobOptBlockData *fromData, bool isLoopBackEdge, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
748-
ValueInfo * MergeValueInfo(Value *toDataVal, Value *fromDataVal, Sym *fromDataSym, GlobOptBlockData *fromData, bool isLoopBackEdge, bool sameValueNumber, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
749-
ValueInfo * MergeLikelyIntValueInfo(Value *toDataVal, Value *fromDataVal, const ValueType newValueType);
750-
JsTypeValueInfo * MergeJsTypeValueInfo(JsTypeValueInfo * toValueInfo, JsTypeValueInfo * fromValueInfo, bool isLoopBackEdge, bool sameValueNumber);
751-
ValueInfo * MergeArrayValueInfo(const ValueType mergedValueType, const ArrayValueInfo *const toDataValueInfo, const ArrayValueInfo *const fromDataValueInfo, Sym *const arraySym, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
752710
void InsertCloneStrs(BasicBlock *toBlock, GlobOptBlockData *toData, GlobOptBlockData *fromData);
753711
void InsertValueCompensation(BasicBlock *const predecessor, const SymToValueInfoMap &symsRequiringCompensationToMergedValueInfoMap);
754712
IR::Instr * ToVarUses(IR::Instr *instr, IR::Opnd *opnd, bool isDst, Value *val);
@@ -770,29 +728,6 @@ class GlobOpt
770728
void TypeSpecializeSimd128Dst(IRType type, IR::Instr *instr, Value *valToTransfer, Value *const src1Value, Value **pDstVal);
771729
void ToSimd128Dst(IRType toType, IR::Instr *instr, IR::RegOpnd *dst, BasicBlock *block);
772730

773-
static BOOL IsInt32TypeSpecialized(Sym const * sym, BasicBlock const * block);
774-
static BOOL IsInt32TypeSpecialized(Sym const * sym, GlobOptBlockData const * data);
775-
static BOOL IsSwitchInt32TypeSpecialized(IR::Instr const * instr, BasicBlock const * block);
776-
static BOOL IsFloat64TypeSpecialized(Sym const * sym, BasicBlock const * block);
777-
static BOOL IsFloat64TypeSpecialized(Sym const * sym, GlobOptBlockData const * data);
778-
// SIMD_JS
779-
static BOOL IsSimd128TypeSpecialized(Sym const * sym, BasicBlock const * block);
780-
static BOOL IsSimd128TypeSpecialized(Sym const * sym, GlobOptBlockData const * data);
781-
static BOOL IsSimd128TypeSpecialized(IRType type, Sym const * sym, BasicBlock const * block);
782-
static BOOL IsSimd128TypeSpecialized(IRType type, Sym const * sym, GlobOptBlockData const * data);
783-
static BOOL IsSimd128F4TypeSpecialized(Sym const * sym, BasicBlock const * block);
784-
static BOOL IsSimd128F4TypeSpecialized(Sym const * sym, GlobOptBlockData const * data);
785-
static BOOL IsSimd128I4TypeSpecialized(Sym const * sym, BasicBlock const * block);
786-
static BOOL IsSimd128I4TypeSpecialized(Sym const * sym, GlobOptBlockData const * data);
787-
static BOOL IsLiveAsSimd128(Sym const * sym, GlobOptBlockData const * data);
788-
static BOOL IsLiveAsSimd128F4(Sym const * sym, GlobOptBlockData const * data);
789-
static BOOL IsLiveAsSimd128I4(Sym const * sym, GlobOptBlockData const * data);
790-
791-
static BOOL IsTypeSpecialized(Sym const * sym, BasicBlock const * block);
792-
static BOOL IsTypeSpecialized(Sym const * sym, GlobOptBlockData const * data);
793-
static BOOL IsLive(Sym const * sym, BasicBlock const * block);
794-
static BOOL IsLive(Sym const * sym, GlobOptBlockData const * data);
795-
void MakeLive(StackSym *const sym, GlobOptBlockData *const blockData, const bool lossy) const;
796731
void OptConstFoldBr(bool test, IR::Instr *instr, Value * intTypeSpecSrc1Val = nullptr, Value * intTypeSpecSrc2Val = nullptr);
797732
void PropagateIntRangeForNot(int32 minimum, int32 maximum, int32 *pNewMin, int32 * pNewMax);
798733
void PropagateIntRangeBinary(IR::Instr *instr, int32 min1, int32 max1,
@@ -998,9 +933,7 @@ class GlobOpt
998933
#if DBG_DUMP
999934
void Dump() const;
1000935
void DumpSymToValueMap() const;
1001-
void DumpSymToValueMap(GlobHashTable* symToValueMap) const;
1002936
void DumpSymToValueMap(BasicBlock const * block) const;
1003-
static void DumpSym(Sym *sym);
1004937
void DumpSymVal(int index);
1005938

1006939
void Trace(BasicBlock * basicBlock, bool before) const;
@@ -1041,8 +974,6 @@ class GlobOpt
1041974
void TrackTempObjectSyms(IR::Instr * instr, IR::RegOpnd * opnd);
1042975
IR::Instr * GenerateBailOutMarkTempObjectIfNeeded(IR::Instr * instr, IR::Opnd * opnd, bool isDst);
1043976

1044-
void KillStateForGeneratorYield();
1045-
1046977
static void InstantiateForceInlinedMembers_GlobOptIntBounds();
1047978

1048979
friend class InvariantBlockBackwardIterator;

lib/Backend/GlobOptBailOut.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ GlobOpt::CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListB
1212
return;
1313
}
1414

15-
StackSym * copyPropSym = this->GetCopyPropSym(block, sym, val);
15+
StackSym * copyPropSym = block->globOptData.GetCopyPropSym(sym, val);
1616
if (copyPropSym != nullptr)
1717
{
1818
bailOutCopySymsIter.InsertNodeBefore(this->func->m_alloc, sym->AsStackSym(), copyPropSym);
@@ -174,7 +174,7 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,
174174
{
175175
if (!sym->AsStackSym()->HasArgSlotNum())
176176
{
177-
val = FindValue(&this->currentBlock->globOptData, sym);
177+
val = this->currentBlock->globOptData.FindValue(sym);
178178
if (val != nullptr)
179179
{
180180
CaptureCopyPropValue(block, sym, val, bailOutCopySymsIter);
@@ -196,7 +196,7 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,
196196
if (symIdBucket != nullptr)
197197
{
198198
Sym * symIdSym = symIdBucket->value;
199-
val = FindValue(&this->currentBlock->globOptData, symIdSym);
199+
val = this->currentBlock->globOptData.FindValue(symIdSym);
200200
if (val != nullptr)
201201
{
202202
CaptureCopyPropValue(block, symIdSym, val, bailOutCopySymsIter);
@@ -741,9 +741,9 @@ void GlobOpt::RecordInlineeFrameInfo(IR::Instr* inlineeEnd)
741741
{
742742
if (PHASE_ON(Js::CopyPropPhase, func))
743743
{
744-
Value* value = FindValue(&this->currentBlock->globOptData, argSym);
744+
Value* value = this->currentBlock->globOptData.FindValue(argSym);
745745

746-
StackSym * copyPropSym = this->GetCopyPropSym(this->currentBlock, argSym, value);
746+
StackSym * copyPropSym = this->currentBlock->globOptData.GetCopyPropSym(argSym, value);
747747
if (copyPropSym)
748748
{
749749
argSym = copyPropSym;
@@ -957,9 +957,9 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
957957
else
958958
{
959959
sym = opnd->GetStackSym();
960-
Assert(FindValue(&this->currentBlock->globOptData, sym));
960+
Assert(this->currentBlock->globOptData.FindValue(sym));
961961
// StackSym args need to be re-captured
962-
this->SetChangedSym(sym->m_id);
962+
this->currentBlock->globOptData.SetChangedSym(sym->m_id);
963963
}
964964

965965
Assert(totalOutParamCount != 0);

0 commit comments

Comments
 (0)