@@ -274,8 +274,6 @@ namespace JsUtil
274274 };
275275};
276276
277- typedef SList<GlobHashBucket*, JitArenaAllocator> PRECandidatesList;
278-
279277typedef JsUtil::BaseDictionary<IntConstType, StackSym *, JitArenaAllocator> IntConstantToStackSymMap;
280278typedef JsUtil::BaseDictionary<int32, Value *, JitArenaAllocator> IntConstantToValueMap;
281279typedef JsUtil::BaseDictionary<int64, Value *, JitArenaAllocator> Int64ConstantToValueMap;
@@ -379,6 +377,8 @@ class InvariantBlockBackwardIterator
379377 PREVENT_ASSIGN (InvariantBlockBackwardIterator);
380378};
381379
380+ class FlowGraph ;
381+
382382class GlobOpt
383383{
384384private:
@@ -390,6 +390,8 @@ class GlobOpt
390390#if DBG
391391 friend class ObjectTempVerify ;
392392#endif
393+ friend class GlobOptBlockData ;
394+ friend class BasicBlock ;
393395
394396private:
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 ;
490491private:
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
718680private:
719681 void DetermineDominatingLoopCountableBlock (Loop *const loop, BasicBlock *const headerBlock);
@@ -733,6 +695,8 @@ class GlobOpt
733695public:
734696 JsArrayKills CheckJsArrayKills (IR::Instr *const instr);
735697
698+ GlobOptBlockData const * GetCurrentBlockData () const ;
699+
736700private:
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 ;
0 commit comments