void BlockState::mergePredecessorAvailSetAndValue(RLEContext &Ctx) { // Clear the state if the basic block has no predecessor. if (BB->getPreds().begin() == BB->getPreds().end()) { ForwardSetIn.reset(); ForwardValIn.clear(); return; } auto Iter = BB->pred_begin(); ForwardSetIn = Ctx.getBlockState(*Iter).ForwardSetOut; ForwardValIn = Ctx.getBlockState(*Iter).ForwardValOut; Iter = std::next(Iter); for (auto EndIter = BB->pred_end(); Iter != EndIter; ++Iter) { BlockState &OtherState = Ctx.getBlockState(*Iter); ForwardSetIn &= OtherState.ForwardSetOut; // Merge in the predecessor state. for (unsigned i = 0; i < LocationNum; ++i) { if (OtherState.ForwardSetOut[i]) { // There are multiple values from multiple predecessors, set this as // a covering value. We do not need to track the value itself, as we // can always go to the predecessors BlockState to find it. ForwardValIn[i] = Ctx.getValueBit(LSValue(true)); continue; } // If this location does have an available value, then clear it. stopTrackingValue(ForwardValIn, i); stopTrackingLocation(ForwardSetIn, i); } } }
void BlockState::mergePredecessorsAvailSetMax(RLEContext &Ctx) { if (BB->pred_empty()) { ForwardSetMax.reset(); return; } auto Iter = BB->pred_begin(); ForwardSetMax = Ctx.getBlockState(*Iter).ForwardSetMax; Iter = std::next(Iter); for (auto EndIter = BB->pred_end(); Iter != EndIter; ++Iter) { ForwardSetMax &= Ctx.getBlockState(*Iter).ForwardSetMax; } }
void BlockState::mergePredecessorAvailSet(RLEContext &Ctx) { // Clear the state if the basic block has no predecessor. if (BB->getPreds().begin() == BB->getPreds().end()) { ForwardSetIn.reset(); return; } auto Iter = BB->pred_begin(); ForwardSetIn = Ctx.getBlockState(*Iter).ForwardSetOut; Iter = std::next(Iter); for (auto EndIter = BB->pred_end(); Iter != EndIter; ++Iter) { ForwardSetIn &= Ctx.getBlockState(*Iter).ForwardSetOut; } }
void BlockState::mergePredecessorStates(RLEContext &Ctx, RLEKind Kind) { // Clear the state if the basic block has no predecessor. if (BB->getPreds().begin() == BB->getPreds().end()) { clearLSLocations(); return; } // We initialize the state with the first predecessor's state and merge // in states of other predecessors. bool HasAtLeastOnePred = false; // For each predecessor of BB... for (auto Pred : BB->getPreds()) { BlockState &Other = Ctx.getBlockState(Pred); // If we have not had at least one predecessor, initialize BlockState // with the state of the initial predecessor. // If BB is also a predecessor of itself, we should not initialize. if (!HasAtLeastOnePred) { if (isComputeAvailSet(Kind)) { ForwardSetIn = Other.ForwardSetOut; } if (isComputeAvailValue(Kind) || isPerformRLE(Kind)) { ForwardSetIn = Other.ForwardSetOut; ForwardValIn = Other.ForwardValOut; } } else { mergePredecessorState(Ctx, Other, Kind); } HasAtLeastOnePred = true; } }