Lines Matching defs:bbNext
491 void FrameStateBuilder::NewMerge(const BytecodeRegion &bbNext)
493 auto frameContext = GetMergedBbContext(bbNext.id);
494 size_t numOfIns = bbNext.numOfStatePreds;
495 if (IsOsrLoopExit(bbNext)) {
498 for (const BytecodeRegion *bb : bbNext.preds) {
506 bool isLoopHead = IsLoopHead(bbNext);
510 if (!IfLoopNeedMerge(bbNext)) {
517 ASSERT(numOfIns - bbNext.numOfLoopBack > 1); // 1: loop in
518 size_t numOfLoopIns = bbNext.numOfLoopBack + 1; // 1: loop in
522 size_t numOfMergeIns = numOfIns - bbNext.numOfLoopBack;
548 auto& loopInfo = GetLoopInfo(bbNext);
553 void FrameStateBuilder::MergeStateDepend(const BytecodeRegion &bb, const BytecodeRegion &bbNext)
557 auto mergedContext = GetMergedBbContext(bbNext.id);
558 if (bbNext.numOfStatePreds == 1) { // 1: one entry edge
566 NewMerge(bbNext);
568 if (IsLoopBackEdge(bb, bbNext)) {
569 if (!(bcBuilder_->IsOSR() && IsOsrLoopExit(bbNext))) {
574 auto mergeInfo = GetCorrespondingState(bb, bbNext);
667 MergeStateDependInfo FrameStateBuilder::GetCorrespondingState(const BytecodeRegion &bb, const BytecodeRegion &bbNext)
669 auto mergedContext = GetMergedBbContext(bbNext.id);
670 if (IsLoopHead(bbNext)) {
671 if (!IfLoopNeedMerge(bbNext)) { // 1: only one loop in
676 if (bbNext.IsLoopBack(bb)) {
688 void FrameStateBuilder::MergeAssignment(const BytecodeRegion &bb, const BytecodeRegion &bbNext)
690 auto mergedContext = GetMergedBbContext(bbNext.id);
691 [[maybe_unused]] auto mergeInfo = GetCorrespondingState(bb, bbNext);
693 auto liveout = GetFrameLiveoutBefore(bbNext.id);
694 auto *loopAssignment = GetLoopAssignment(bbNext);
713 value = MergeValue(bbNext, current, next, bbNext.IsLoopBack(bb), changedInLoop);
719 void FrameStateBuilder::CopyLiveoutValues(const BytecodeRegion &bbNext,
722 auto liveout = GetFrameLiveoutBefore(bbNext.id);
760 void FrameStateBuilder::NewLoopExit(const BytecodeRegion &bbNext, BitSet *loopAssignment)
767 auto liveout = GetFrameLiveoutBefore(bbNext.id);
785 auto stateSplit = BuildStateSplit(liveContext_, liveout, bbNext.start);
789 void FrameStateBuilder::TryInsertLoopExit(const BytecodeRegion &bb, const BytecodeRegion &bbNext)
794 if (bcBuilder_->IsOSR() && bcBuilder_->IsCacheBBOfOSRLoop(bbNext)) {
798 if (currentLoop != nullptr && !currentLoop->loopBodys->TestBit(bbNext.id)) {
799 // use bbNext as merged values
800 SaveCurrentContext(bbNext);
802 while (currentLoop != nullptr && !currentLoop->loopBodys->TestBit(bbNext.id)) {
807 if (current->id == bbNext.id) {
814 NewLoopExit(bbNext, currentLoop->loopAssignment);
858 void FrameStateBuilder::MergeIntoSuccessor(const BytecodeRegion &bb, const BytecodeRegion &bbNext)
861 TryInsertLoopExit(bb, bbNext);
862 auto mergedContext = GetOrOCreateMergedContext(bbNext.id);
863 MergeStateDepend(bb, bbNext);
865 if (bbNext.loopNumber > 0) {
866 MergeAssignment(bb, bbNext);
868 CopyLiveoutValues(bbNext, mergedContext, liveContext_);
871 MergeAssignment(bb, bbNext);
875 if (bbNext.IsLoopBack(bb) || !IsGateNotEmpty(mergedContext->mergeState_)) {
883 bool FrameStateBuilder::IsLoopBackEdge(const BytecodeRegion &bb, const BytecodeRegion &bbNext)
885 if (bcBuilder_->IsOSR() && OutOfOsrLoop(bbNext)) {
887 } else if (bbNext.loopNumber > 0) {
888 auto& loopInfo = GetLoopInfo(bbNext);
1221 BytecodeRegion* bbNext = nullptr;
1232 bbNext = PushLoopExist(bb, currentDepth);
1235 bbNext = bb.succs[curState.index++]; // 1: goto next
1237 if (bbNext != nullptr) {
1238 if (loopInfo != nullptr && !loopInfo->loopBodys->TestBit(bbNext->id)) {
1239 AddLoopExit(bbNext, loopInfo);
1240 } else if (visitState_[bbNext->id] == MarkState::UNVISITED1) {
1241 currentDepth = Push(bbNext->id, currentDepth);
1242 loopInfo = EnterInnerLoop(loopInfo, bbNext->id);
1270 BytecodeRegion* bbNext = nullptr;
1272 bbNext = currentInfo.loopExits->at(loopExitIndex);
1275 return bbNext;