From eac0eaa3440ab7a9eef58bbee8d8ff5e587b2f42 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 1 Sep 2022 15:13:27 -0700 Subject: [PATCH 01/10] changed BB::frequency field from uint32 to uint64 --- src/mapleall/maple_ir/include/mir_function.h | 24 +++++++++--------- src/mapleall/maple_me/include/bb.h | 6 ++--- .../maple_me/include/me_loop_unrolling.h | 2 +- src/mapleall/maple_me/include/me_predict.h | 2 +- src/mapleall/maple_me/include/pme_emit.h | 2 +- src/mapleall/maple_me/src/bb.cpp | 4 +-- src/mapleall/maple_me/src/hdse.cpp | 5 ++-- src/mapleall/maple_me/src/me_bb_analyze.cpp | 2 +- src/mapleall/maple_me/src/me_bb_layout.cpp | 8 +++--- src/mapleall/maple_me/src/me_loop_canon.cpp | 14 +++++------ .../maple_me/src/me_loop_unrolling.cpp | 25 +++++++++---------- src/mapleall/maple_me/src/me_predict.cpp | 6 ++--- src/mapleall/maple_me/src/me_profile_use.cpp | 2 +- .../maple_me/src/me_value_range_prop.cpp | 24 +++++++++--------- src/mapleall/maple_me/src/optimizeCFG.cpp | 10 ++++---- src/mapleall/maple_me/src/pme_emit.cpp | 2 +- 16 files changed, 68 insertions(+), 70 deletions(-) diff --git a/src/mapleall/maple_ir/include/mir_function.h b/src/mapleall/maple_ir/include/mir_function.h index ab58359884..e4f1c20605 100644 --- a/src/mapleall/maple_ir/include/mir_function.h +++ b/src/mapleall/maple_ir/include/mir_function.h @@ -776,44 +776,44 @@ class MIRFunction { return freqFirstMap != nullptr; } - const MapleMap &GetFirstFreqMap() const { + const MapleMap &GetFirstFreqMap() const { return *freqFirstMap; } - void SetFirstFreqMap(uint32 stmtID, uint32 freq) { + void SetFirstFreqMap(uint32 stmtID, uint64 freq) { if (freqFirstMap == nullptr) { - freqFirstMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); + freqFirstMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); } (*freqFirstMap)[stmtID] = freq; } - const MapleMap &GetLastFreqMap() const { + const MapleMap &GetLastFreqMap() const { return *freqLastMap; } - int32 GetFreqFromLastStmt(uint32 stmtId) const { + int64 GetFreqFromLastStmt(uint32 stmtId) const { if (freqLastMap == nullptr) { return -1; } if ((*freqLastMap).find(stmtId) == (*freqLastMap).end()) { return -1; } - return static_cast((*freqLastMap)[stmtId]); + return (*freqLastMap)[stmtId]; } - int32 GetFreqFromFirstStmt(uint32 stmtId) const { + int64 GetFreqFromFirstStmt(uint32 stmtId) const { if (freqFirstMap == nullptr) { return -1; } if ((*freqFirstMap).find(stmtId) == (*freqFirstMap).end()) { return -1; } - return static_cast((*freqFirstMap)[stmtId]); + return (*freqFirstMap)[stmtId]; } - void SetLastFreqMap(uint32 stmtID, uint32 freq) { + void SetLastFreqMap(uint32 stmtID, uint64 freq) { if (freqLastMap == nullptr) { - freqLastMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); + freqLastMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); } (*freqLastMap)[stmtID] = freq; } @@ -1339,8 +1339,8 @@ class MIRFunction { MIRInfoVector info{module->GetMPAllocator().Adapter()}; MapleVector infoIsString{module->GetMPAllocator().Adapter()}; // tells if an entry has string value MIRScope *scope = nullptr; - MapleMap *freqFirstMap = nullptr; // save bb frequency in its first_stmt, key is stmtId - MapleMap *freqLastMap = nullptr; // save bb frequency in its last_stmt, key is stmtId + MapleMap *freqFirstMap = nullptr; // save bb frequency in its first_stmt, key is stmtId + MapleMap *freqLastMap = nullptr; // save bb frequency in its last_stmt, key is stmtId MapleSet referedPregs{module->GetMPAllocator().Adapter()}; bool referedRegsValid = false; bool hasVlaOrAlloca = false; diff --git a/src/mapleall/maple_me/include/bb.h b/src/mapleall/maple_me/include/bb.h index e0c01e71e8..8dd24fb819 100644 --- a/src/mapleall/maple_me/include/bb.h +++ b/src/mapleall/maple_me/include/bb.h @@ -336,11 +336,11 @@ class BB { bbLabel = idx; } - uint32 GetFrequency() const { + uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 f) { + void SetFrequency(uint64 f) { frequency = f; } @@ -547,7 +547,7 @@ class BB { MapleMap phiList; MapleMap mePhiList; MapleMap> meVarPiList; - uint32 frequency = 0; + uint64 frequency = 0; BBKind kind = kBBUnknown; uint32 attributes = 0; diff --git a/src/mapleall/maple_me/include/me_loop_unrolling.h b/src/mapleall/maple_me/include/me_loop_unrolling.h index fe36d56e73..d28667d9a8 100644 --- a/src/mapleall/maple_me/include/me_loop_unrolling.h +++ b/src/mapleall/maple_me/include/me_loop_unrolling.h @@ -80,7 +80,7 @@ class LoopUnrolling { MeExpr *CreateExprWithCRNode(CRNode &crNode); void InsertCondGotoBB(); void ResetFrequency(BB &bb); - void ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint32 headFreq); + void ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint64 headFreq); void ResetFrequency(); void ResetFrequency(const BB &curBB, const BB &succ, const BB &exitBB, BB &curCopyBB, bool copyAllLoop); BB *CopyBB(BB &bb, bool isInLoop); diff --git a/src/mapleall/maple_me/include/me_predict.h b/src/mapleall/maple_me/include/me_predict.h index 57f2f932c6..8e99c43a9d 100644 --- a/src/mapleall/maple_me/include/me_predict.h +++ b/src/mapleall/maple_me/include/me_predict.h @@ -23,7 +23,7 @@ namespace maple { // The base value for branch probability notes and edge probabilities. constexpr int kProbBase = 10000; // The base value for BB frequency. -constexpr int kFreqBase = 100000; +constexpr uint64 kFreqBase = 100000; // Information about each branch predictor. struct PredictorInfo { diff --git a/src/mapleall/maple_me/include/pme_emit.h b/src/mapleall/maple_me/include/pme_emit.h index 40642c1757..895f1f1256 100644 --- a/src/mapleall/maple_me/include/pme_emit.h +++ b/src/mapleall/maple_me/include/pme_emit.h @@ -82,7 +82,7 @@ class PreMeEmitter : public AnalysisResult { MapleMap *GetPreMeExprExtensionMap() { return &preMeExprExtensionMap; } FuncProfInfo *GetFuncProfData() { return mirFunc->GetFuncProfData(); } void SetIpaInfo(CollectIpaInfo *info) { ipaInfo = info; } - void UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint32 frequency); + void UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint64 frequency); void UpdateStmtInfoForLabelNode(LabelNode &label, BB &bb); private: ArrayNode *ConvertToArray(BaseNode *x, TyIdx ptrTyIdx); diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index 181e6ed831..4413d3751a 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -484,7 +484,7 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { for (int i = 0; i < len; i++) { succFreqs += GetSuccFreq()[i]; } - int diff = static_cast(abs(succFreqs - GetFrequency())); + uint64 diff = abs(succFreqs - static_cast(GetFrequency())); if (len == 0 || diff <= 1) {return;} for (uint32 i = 0; i < len; ++i) { int64_t sfreq = GetSuccFreq()[static_cast(i)]; @@ -496,7 +496,7 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { int64_t diffFreq = scalefreq - sfreq; int64_t succBBnewFreq = succBBLoc->GetFrequency() + diffFreq; if (succBBnewFreq >= 0) { - succBBLoc->SetFrequency(static_cast(succBBnewFreq)); + succBBLoc->SetFrequency(succBBnewFreq); } } } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index 4dd12cf45c..a7a45591d2 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -254,8 +254,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); ASSERT(bb.GetFrequency() >= succ0Freq, "sanity check"); - bb.GetSucc(0)->SetFrequency(static_cast(bb.GetSucc(0)->GetFrequency() + - (bb.GetFrequency() - succ0Freq))); + bb.GetSucc(0)->SetFrequency(bb.GetSucc(0)->GetFrequency() + (bb.GetFrequency() - succ0Freq)); } } // A ivar contained in stmt @@ -317,7 +316,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { if (UpdateFreq()) { bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); - bb.GetSucc(0)->SetFrequency(static_cast(bb.GetSucc(0)->GetFrequency() + removedFreq)); + bb.GetSucc(0)->SetFrequency(bb.GetSucc(0)->GetFrequency() + removedFreq); } } else { DetermineUseCounts(condbr->GetOpnd()); diff --git a/src/mapleall/maple_me/src/me_bb_analyze.cpp b/src/mapleall/maple_me/src/me_bb_analyze.cpp index bd34586662..2909ee682b 100644 --- a/src/mapleall/maple_me/src/me_bb_analyze.cpp +++ b/src/mapleall/maple_me/src/me_bb_analyze.cpp @@ -16,7 +16,7 @@ namespace maple { void BBAnalyze::SetHotAndColdBBCountThreshold() { - std::vector times; + std::vector times; auto eIt = cfg->valid_end(); for (auto bIt = cfg->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; diff --git a/src/mapleall/maple_me/src/me_bb_layout.cpp b/src/mapleall/maple_me/src/me_bb_layout.cpp index 8c5612db86..93074c96f1 100644 --- a/src/mapleall/maple_me/src/me_bb_layout.cpp +++ b/src/mapleall/maple_me/src/me_bb_layout.cpp @@ -206,15 +206,15 @@ bool BBLayout::HasBetterLayoutPred(const BB &bb, BB &succ) { if (predList.size() <= 1) { return false; } - uint32 sumEdgeFreq = succ.GetFrequency(); + uint64 sumEdgeFreq = succ.GetFrequency(); const double hotEdgeFreqPercent = 0.8; // should further fine tuning - uint32 hotEdgeFreq = static_cast(sumEdgeFreq * hotEdgeFreqPercent); + uint64 hotEdgeFreq = static_cast(sumEdgeFreq * hotEdgeFreqPercent); // if edge freq(bb->succ) contribute more than 80% to succ block freq, no better layout pred than bb for (uint32 i = 0; i < predList.size(); ++i) { if (predList[i] == &bb) { continue; } - uint32 edgeFreq = static_cast(predList[i]->GetEdgeFreq(&succ)); + uint64 edgeFreq = predList[i]->GetEdgeFreq(&succ); if (edgeFreq > (sumEdgeFreq - hotEdgeFreq)) { return true; } @@ -258,7 +258,7 @@ BB *BBLayout::GetBestSucc(BB &bb, const BBChain &chain, const MapleVector } // (2) search in readyToLayoutChains - uint32 bestFreq = 0; + uint64 bestFreq = 0; for (auto it = readyToLayoutChains.begin(); it != readyToLayoutChains.end(); ++it) { BBChain *readyChain = *it; BB *header = readyChain->GetHeader(); diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index 3aae6c2514..412713ee3a 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -95,19 +95,19 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (splitList.size() == 1) { // quick split auto *pred = splitList[0]; - auto index = pred->GetSuccIndex(*splittedBB); + int index = pred->GetSuccIndex(*splittedBB); // add frequency to mergedBB if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); uint64_t freq = pred->GetEdgeFreq(static_cast(idx)); - mergedBB->SetFrequency(static_cast(freq)); + mergedBB->SetFrequency(freq); mergedBB->PushBackSuccFreq(freq); } splittedBB->ReplacePred(pred, mergedBB); - pred->AddSucc(*mergedBB, static_cast(static_cast(index))); + pred->AddSucc(*mergedBB, index); if (updateFreqs) { - pred->AddSuccFreq(mergedBB->GetFrequency(), static_cast(static_cast(index))); + pred->AddSuccFreq(mergedBB->GetFrequency(), index); } if (!pred->GetMeStmts().empty()) { UpdateTheOffsetOfStmtWhenTargetBBIsChange(*pred, *splittedBB, *mergedBB); @@ -134,8 +134,8 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); - freq = pred->GetEdgeFreq(static_cast(idx)); - mergedBB->SetFrequency(static_cast(mergedBB->GetFrequency() + freq)); + freq = pred->GetEdgeFreq(idx); + mergedBB->SetFrequency(mergedBB->GetFrequency() + freq); } pred->ReplaceSucc(splittedBB, mergedBB); if (updateFreqs) { @@ -277,7 +277,7 @@ void MeLoopCanon::InsertExitBB(LoopDesc &loop) { curBB->ReplaceSucc(succ, newExitBB); succ->AddPred(*newExitBB, pos); if (updateFreqs) { - newExitBB->SetFrequency(static_cast(freq)); + newExitBB->SetFrequency(freq); newExitBB->PushBackSuccFreq(freq); } if (!curBB->GetMeStmts().empty()) { diff --git a/src/mapleall/maple_me/src/me_loop_unrolling.cpp b/src/mapleall/maple_me/src/me_loop_unrolling.cpp index 11ef561b38..5e39fd56c1 100644 --- a/src/mapleall/maple_me/src/me_loop_unrolling.cpp +++ b/src/mapleall/maple_me/src/me_loop_unrolling.cpp @@ -309,11 +309,11 @@ void LoopUnrolling::CopyLoopBody(BB &newHeadBB, std::unordered_map &ol // Update frequency of old BB. void LoopUnrolling::ResetFrequency(BB &bb) { - auto freq = bb.GetFrequency() / replicatedLoopNum; + uint64 freq = bb.GetFrequency() / replicatedLoopNum; if ((!instrumentProf) && freq == 0 && partialCount == 0 && bb.GetFrequency() != 0) { freq = 1; } - bb.SetFrequency(static_cast(freq + partialCount)); + bb.SetFrequency(freq + partialCount); for (size_t i = 0; i < bb.GetSucc().size(); ++i) { auto currFreq = bb.GetEdgeFreq(i) / replicatedLoopNum; if ((!instrumentProf) && currFreq == 0 && partialCount == 0 && bb.GetFrequency() != 0) { @@ -328,17 +328,17 @@ void LoopUnrolling::ResetFrequency() { auto exitBB = cfg->GetBBFromID(loop->inloopBB2exitBBs.begin()->first); auto latchBB = loop->latch; if (isUnrollWithVar) { - auto latchFreq = loop->head->GetFrequency() % replicatedLoopNum - loop->preheader->GetFrequency(); - exitBB->SetFrequency(static_cast(loop->head->GetFrequency() % replicatedLoopNum - latchFreq)); + uint64 latchFreq = loop->head->GetFrequency() % replicatedLoopNum - loop->preheader->GetFrequency(); + exitBB->SetFrequency(loop->head->GetFrequency() % replicatedLoopNum - latchFreq); exitBB->SetEdgeFreq(latchBB, latchFreq); - latchBB->SetFrequency(static_cast(latchFreq)); + latchBB->SetFrequency(latchFreq); latchBB->SetEdgeFreq(loop->head, latchFreq); } else { - auto exitFreq = exitBB->GetFrequency() / replicatedLoopNum; + uint64 exitFreq = exitBB->GetFrequency() / replicatedLoopNum; if (exitFreq == 0 && exitBB->GetFrequency() != 0) { exitFreq = 1; } - exitBB->SetFrequency(static_cast(exitFreq)); + exitBB->SetFrequency(exitFreq); auto exitEdgeFreq = exitBB->GetEdgeFreq(latchBB) / replicatedLoopNum; if (exitEdgeFreq == 0 && exitBB->GetEdgeFreq(latchBB) != 0) { exitEdgeFreq = 1; @@ -348,7 +348,7 @@ void LoopUnrolling::ResetFrequency() { if (latchFreq == 0 && latchBB->GetFrequency() != 0) { latchFreq = 1; } - latchBB->SetFrequency(static_cast(latchFreq)); + latchBB->SetFrequency(latchFreq); latchBB->SetEdgeFreq(loop->head, latchFreq); } } @@ -532,7 +532,7 @@ LoopUnrolling::ReturnKindOfFullyUnroll LoopUnrolling::LoopFullyUnroll(int64 trip return kCanFullyUnroll; } -void LoopUnrolling::ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint32 headFreq) { +void LoopUnrolling::ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint64 headFreq) { if (profValid) { newCondGotoBB.SetFrequency(headFreq); exitingBB.SetEdgeFreq(&exitedBB, 0); @@ -544,7 +544,7 @@ void LoopUnrolling::InsertCondGotoBB() { BB *exitingBB = cfg->GetBBFromID(loop->inloopBB2exitBBs.begin()->first); BB *exitedBB = *(loop->inloopBB2exitBBs.cbegin()->second->cbegin()); BB *newCondGotoBB = CopyBB(*exitingBB, true); - auto headFreq = loop->head->GetFrequency(); + uint64 headFreq = loop->head->GetFrequency(); ResetFrequency(*newCondGotoBB, *exitingBB, *exitedBB, headFreq); MeStmt *lastMeStmt = newCondGotoBB->GetLastMe(); CHECK_FATAL(lastMeStmt != nullptr, "last meStmt must not be nullptr"); @@ -642,7 +642,7 @@ void LoopUnrolling::AddPreHeader(BB *oldPreHeader, BB *head) { head->AddPred(*preheader, index); if (profValid) { preheader->PushBackSuccFreq(preheaderFreq); - preheader->SetFrequency(static_cast(preheaderFreq)); + preheader->SetFrequency(preheaderFreq); } CondGotoMeStmt *condGotoStmt = static_cast(oldPreHeader->GetLastMe()); LabelIdx oldlabIdx = condGotoStmt->GetOffset(); @@ -818,8 +818,7 @@ void LoopUnrolling::CopyLoopForPartial(BB &partialCondGoto, BB &exitedBB, BB &ex partialCondGoto.AddSucc(*partialHead); if (profValid) { partialCondGoto.PushBackSuccFreq(loop->head->GetFrequency() % replicatedLoopNum); - partialCondGoto.SetFrequency( - static_cast(partialCondGoto.GetEdgeFreq(static_cast(0)) + partialCondGoto.GetEdgeFreq(1))); + partialCondGoto.SetFrequency(partialCondGoto.GetEdgeFreq(static_cast(0)) + partialCondGoto.GetEdgeFreq(1)); } CHECK_FATAL(partialCondGoto.GetKind() == kBBCondGoto, "must be partialCondGoto"); CHECK_FATAL(!partialCondGoto.GetMeStmts().empty(), "must not be empty"); diff --git a/src/mapleall/maple_me/src/me_predict.cpp b/src/mapleall/maple_me/src/me_predict.cpp index b8e00bc52f..33f8e892a3 100644 --- a/src/mapleall/maple_me/src/me_predict.cpp +++ b/src/mapleall/maple_me/src/me_predict.cpp @@ -734,7 +734,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) return false; } } - uint32 freq = 0; + uint64 freq = 0; double cyclicProb = 0; for (BB *pred : bb.GetPred()) { Edge *edge = FindEdge(*pred, bb); @@ -749,7 +749,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) cyclicProb = 1 - std::numeric_limits::epsilon(); } // Floating-point numbers have precision problems, consider using integers to represent backEdgeProb? - bb.SetFrequency(static_cast(freq / (1 - cyclicProb))); + bb.SetFrequency(freq / (1 - cyclicProb)); } // 2. calculate frequencies of bb's out edges if (predictDebug) { @@ -757,7 +757,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) } bbVisited[bb.GetBBId()] = true; uint32 tmp = 0; - uint32 total = 0; + uint64 total = 0; Edge *bestEdge = nullptr; for (size_t i = 0; i < bb.GetSucc().size(); ++i) { Edge *edge = FindEdge(bb, *bb.GetSucc(i)); diff --git a/src/mapleall/maple_me/src/me_profile_use.cpp b/src/mapleall/maple_me/src/me_profile_use.cpp index 44538d4780..815a7a4d97 100644 --- a/src/mapleall/maple_me/src/me_profile_use.cpp +++ b/src/mapleall/maple_me/src/me_profile_use.cpp @@ -244,7 +244,7 @@ void MeProfUse::SetFuncEdgeInfo() { for (auto bIt = cfg->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; auto *bbInfo = GetBBUseInfo(*bb); - bb->SetFrequency(static_cast(bbInfo->GetCount())); + bb->SetFrequency(bbInfo->GetCount()); if (bIt == cfg->common_entry() || bIt == cfg->common_exit()) { continue; } diff --git a/src/mapleall/maple_me/src/me_value_range_prop.cpp b/src/mapleall/maple_me/src/me_value_range_prop.cpp index 67448df356..07de0b43eb 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3240,7 +3240,7 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB bb.SetKind(kBBFallthru); if (func.GetCfg()->UpdateCFGFreq()) { bb.SetSuccFreq(0, bb.GetFrequency()); - succBB.SetFrequency(static_cast(succBB.GetFrequency() + removedFreq)); + succBB.SetFrequency(succBB.GetFrequency() + removedFreq); unreachableBB.SetFrequency(0); } auto *loop = loops->GetBBLoopParent(bb.GetBBId()); @@ -3625,7 +3625,7 @@ void ValueRangePropagation::RemoveUnreachableBB( if (func.GetCfg()->UpdateCFGFreq()) { int64_t removedFreq = static_cast(condGotoBB.GetSuccFreq()[1]); condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ0->SetFrequency(static_cast(succ0->GetFrequency() + removedFreq)); + succ0->SetFrequency(succ0->GetFrequency() + removedFreq); } condGotoBB.RemoveSucc(*succ1); DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ1, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3647,7 +3647,7 @@ void ValueRangePropagation::RemoveUnreachableBB( condGotoBB.RemoveSucc(*succ0); if (func.GetCfg()->UpdateCFGFreq()) { condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ1->SetFrequency(static_cast(succ1->GetFrequency() + removedFreq)); + succ1->SetFrequency(succ1->GetFrequency() + removedFreq); } DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ0, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); condGotoBB.RemoveMeStmt(condGotoBB.GetLastMe()); @@ -3815,11 +3815,11 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - exitCopyFallthru->SetFrequency(static_cast(exitCopyFallthru->GetFrequency() + edgeFreq)); + exitCopyFallthru->SetFrequency(exitCopyFallthru->GetFrequency() + edgeFreq); pred.AddSuccFreq(static_cast(edgeFreq), index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); } return true; @@ -3862,12 +3862,12 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( pred.RemoveSucc(bb); pred.AddSucc(*mergeAllFallthruBBs, index); if (func.GetCfg()->UpdateCFGFreq()) { - mergeAllFallthruBBs->SetFrequency(static_cast(edgeFreq)); + mergeAllFallthruBBs->SetFrequency(edgeFreq); mergeAllFallthruBBs->PushBackSuccFreq(static_cast(edgeFreq)); pred.AddSuccFreq(static_cast(edgeFreq), index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); } mergeAllFallthruBBs->AddSucc(trueBranch); @@ -3948,7 +3948,7 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(trueBranch, index); CreateLabelForTargetBB(pred, trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); // transform may not be consistent with frequency value @@ -3971,8 +3971,8 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); - exitCopyFallthru->SetFrequency(static_cast(edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); + exitCopyFallthru->SetFrequency(edgeFreq); exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); int64_t updatedtrueFreq = static_cast( @@ -4003,9 +4003,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*newBB, index); newBB->AddSucc(trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); - newBB->SetFrequency(static_cast(edgeFreq)); + newBB->SetFrequency(static_cast(edgeFreq)); newBB->PushBackSuccFreq(static_cast(edgeFreq)); pred.AddSuccFreq(static_cast(edgeFreq), index); } diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index 776d206d46..75038c932f 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1842,7 +1842,7 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { if (cfg->UpdateCFGFreq()) { succ.SetSuccFreq(0, succ.GetFrequency()); auto *succofSucc = succ.GetSucc(0); - succofSucc->SetFrequency(static_cast(succofSucc->GetFrequency() + deletedSuccFreq)); + succofSucc->SetFrequency(succofSucc->GetFrequency() + deletedSuccFreq); } DEBUG_LOG() << "Remove succ BB" << LOG_BBID(rmBB) << " of pred BB" << LOG_BBID(&succ) << "\n"; return true; @@ -1897,12 +1897,12 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { if (cfg->UpdateCFGFreq()) { int idx = pred.GetSuccIndex(*newBB); ASSERT(idx >= 0 && idx < pred.GetSucc().size(), "sanity check"); - uint64_t freq = pred.GetEdgeFreq(idx); + uint64 freq = pred.GetEdgeFreq(idx); newBB->SetFrequency(freq); newBB->PushBackSuccFreq(freq); // update frequency of succ because one of its pred is removed // frequency of - uint32_t freqOfSucc = succ.GetFrequency(); + uint64 freqOfSucc = succ.GetFrequency(); ASSERT(freqOfSucc >= freq, "sanity check"); succ.SetFrequency(freqOfSucc - freq); // update edge frequency @@ -2111,9 +2111,9 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { needUpdatePhi = true; } if (cfg->UpdateCFGFreq()) { - int64_t succFreq = succ->GetFrequency(); + uint64 succFreq = succ->GetFrequency(); ASSERT(succFreq >= removedFreq, "sanity check"); - succ->SetFrequency(static_cast(succFreq - removedFreq)); + succ->SetFrequency(succFreq - removedFreq); succ->SetSuccFreq(0, succ->GetFrequency()); } DEBUG_LOG() << "Merge Uncond BB" << LOG_BBID(succ) << " to its pred BB" << LOG_BBID(pred) << ": BB" << LOG_BBID(pred) diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 0c3cc8c300..4d331cd7d2 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -766,7 +766,7 @@ void PreMeEmitter::UpdateStmtInfoForLabelNode(LabelNode &label, BB &bb) { label.SetStmtInfoId(ipaInfo->GetRealFirstStmtInfoId(bb)); } -void PreMeEmitter::UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint32 frequency) { +void PreMeEmitter::UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint64 frequency) { if (ipaInfo == nullptr || meStmt.GetStmtInfoId() == kInvalidIndex) { return; } -- Gitee From 3603722d02dcbf19088d23bebff53bdc2cd74249 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 6 Sep 2022 14:01:19 -0700 Subject: [PATCH 02/10] Fix bug introduced by last commit --- src/mapleall/maple_me/src/me_predict.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapleall/maple_me/src/me_predict.cpp b/src/mapleall/maple_me/src/me_predict.cpp index 33f8e892a3..7d3069c397 100644 --- a/src/mapleall/maple_me/src/me_predict.cpp +++ b/src/mapleall/maple_me/src/me_predict.cpp @@ -749,7 +749,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) cyclicProb = 1 - std::numeric_limits::epsilon(); } // Floating-point numbers have precision problems, consider using integers to represent backEdgeProb? - bb.SetFrequency(freq / (1 - cyclicProb)); + bb.SetFrequency(static_cast(static_cast(freq / (1 - cyclicProb)))); } // 2. calculate frequencies of bb's out edges if (predictDebug) { -- Gitee From f80cd1d47f09a3904dfacd57b4a16b01cfe8b5d4 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 6 Sep 2022 15:32:55 -0700 Subject: [PATCH 03/10] Fix more type compatibility issues Make maple parser accept switch statement's default label being 0 --- .../maple_ipa/include/stmt_identify.h | 6 +-- src/mapleall/maple_ir/src/mir_parser.cpp | 2 + src/mapleall/maple_me/include/me_function.h | 6 +-- src/mapleall/maple_me/src/bb.cpp | 12 ++--- src/mapleall/maple_me/src/hdse.cpp | 4 +- src/mapleall/maple_me/src/me_loop_canon.cpp | 6 +-- .../maple_me/src/me_value_range_prop.cpp | 53 +++++++++---------- src/mapleall/maple_me/src/optimizeCFG.cpp | 10 ++-- src/mapleall/maple_me/src/pme_emit.cpp | 8 +-- 9 files changed, 54 insertions(+), 53 deletions(-) diff --git a/src/mapleall/maple_ipa/include/stmt_identify.h b/src/mapleall/maple_ipa/include/stmt_identify.h index 7d77185165..43625a3e10 100644 --- a/src/mapleall/maple_ipa/include/stmt_identify.h +++ b/src/mapleall/maple_ipa/include/stmt_identify.h @@ -148,11 +148,11 @@ class StmtInfo { return puIdx; } - const uint32 GetFrequency() const { + const uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 freq) { + void SetFrequency(uint64 freq) { frequency = freq; } @@ -185,7 +185,7 @@ class StmtInfo { BlockNode *currBlock = nullptr; MeStmt *meStmt = nullptr; PUIdx puIdx = kInvalidPuIdx; - uint32 frequency = 0; + uint64 frequency = 0; std::vector hashCandidate; std::unordered_map symbolDefUse; std::unordered_map regDefUse; diff --git a/src/mapleall/maple_ir/src/mir_parser.cpp b/src/mapleall/maple_ir/src/mir_parser.cpp index d425dad181..a422fccbb0 100644 --- a/src/mapleall/maple_ir/src/mir_parser.cpp +++ b/src/mapleall/maple_ir/src/mir_parser.cpp @@ -610,6 +610,8 @@ bool MIRParser::ParseStmtSwitch(StmtNodePtr &stmt) { } if (lexer.NextToken() == TK_label) { switchNode->SetDefaultLabel(mod.CurFunction()->GetOrCreateLableIdxFromName(lexer.GetName())); + } else if (lexer.GetTokenKind() == TK_intconst && lexer.GetTheIntVal() == 0) { + switchNode->SetDefaultLabel(0); } else { Error("expect label in switch but get "); return false; diff --git a/src/mapleall/maple_me/include/me_function.h b/src/mapleall/maple_me/include/me_function.h index ab1f8d8533..33169261da 100644 --- a/src/mapleall/maple_me/include/me_function.h +++ b/src/mapleall/maple_me/include/me_function.h @@ -302,11 +302,11 @@ class MeFunction : public FuncEmit { profValid = val; } - uint32 GetFrequency() const { + uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 f) { + void SetFrequency(uint64 f) { frequency = f; } @@ -399,7 +399,7 @@ class MeFunction : public FuncEmit { bool hasWriteInputAsmNode = false; /* set when ssa tab build */ bool profValid = false; IRProfileDesc *profileDesc = nullptr; - uint32 frequency = 0; + uint64 frequency = 0; // lfo bool isLfo = false; // during pme processing diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index 4413d3751a..4107aca7f2 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -486,17 +486,17 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { } uint64 diff = abs(succFreqs - static_cast(GetFrequency())); if (len == 0 || diff <= 1) {return;} - for (uint32 i = 0; i < len; ++i) { - int64_t sfreq = GetSuccFreq()[static_cast(i)]; - int64_t scalefreq = (succFreqs == 0 ? (frequency / len) : (sfreq * frequency / succFreqs)); - SetSuccFreq(static_cast(i), scalefreq); + for (int i = 0; i < len; ++i) { + uint64 sfreq = GetSuccFreq()[i]; + uint64 scalefreq = (succFreqs == 0 ? (frequency / len) : (sfreq * frequency / succFreqs)); + SetSuccFreq(i, scalefreq); // update succ frequency with new difference if needed if (updateBBFreqOfSucc) { - auto *succBBLoc = GetSucc(static_cast(i)); + auto *succBBLoc = GetSucc(i); int64_t diffFreq = scalefreq - sfreq; int64_t succBBnewFreq = succBBLoc->GetFrequency() + diffFreq; if (succBBnewFreq >= 0) { - succBBLoc->SetFrequency(succBBnewFreq); + succBBLoc->SetFrequency(static_cast(succBBnewFreq)); } } } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index a7a45591d2..afdb9f537f 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -250,7 +250,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { } bb.SetKind(kBBFallthru); if (UpdateFreq()) { - int64_t succ0Freq = static_cast(bb.GetSuccFreq()[0]); + uint64 succ0Freq = static_cast(bb.GetSuccFreq()[0]); bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); ASSERT(bb.GetFrequency() >= succ0Freq, "sanity check"); @@ -280,7 +280,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { bool isPme = mirModule.CurFunction()->GetMeFunc()->GetPreMeFunc() != nullptr; if (mestmt->IsCondBr() && !isPme) { // see if foldable to unconditional branch CondGotoMeStmt *condbr = static_cast(mestmt); - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (!mirModule.IsJavaModule() && condbr->GetOpnd()->GetMeOp() == kMeOpConst) { CHECK_FATAL(IsPrimitiveInteger(condbr->GetOpnd()->GetPrimType()), "MeHDSE::DseProcess: branch condition must be integer type"); diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index 412713ee3a..4edad67654 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -105,9 +105,9 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, mergedBB->PushBackSuccFreq(freq); } splittedBB->ReplacePred(pred, mergedBB); - pred->AddSucc(*mergedBB, index); + pred->AddSucc(*mergedBB, static_cast(index)); if (updateFreqs) { - pred->AddSuccFreq(mergedBB->GetFrequency(), index); + pred->AddSuccFreq(mergedBB->GetFrequency(), static_cast(index)); } if (!pred->GetMeStmts().empty()) { UpdateTheOffsetOfStmtWhenTargetBBIsChange(*pred, *splittedBB, *mergedBB); @@ -134,7 +134,7 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); - freq = pred->GetEdgeFreq(idx); + freq = pred->GetEdgeFreq(static_cast(idx)); mergedBB->SetFrequency(mergedBB->GetFrequency() + freq); } pred->ReplaceSucc(splittedBB, mergedBB); diff --git a/src/mapleall/maple_me/src/me_value_range_prop.cpp b/src/mapleall/maple_me/src/me_value_range_prop.cpp index 07de0b43eb..2f5dffcaaf 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3230,10 +3230,10 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB } Insert2UnreachableBBs(unreachableBB); // update frequency before cfg changed - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { int idx = bb.GetSuccIndex(unreachableBB); - removedFreq = static_cast(bb.GetSuccFreq()[static_cast(idx)]); + removedFreq = bb.GetSuccFreq()[static_cast(idx)]; } bb.RemoveSucc(unreachableBB); bb.RemoveMeStmt(bb.GetLastMe()); @@ -3623,7 +3623,7 @@ void ValueRangePropagation::RemoveUnreachableBB( condGotoBB.SetKind(kBBFallthru); // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - int64_t removedFreq = static_cast(condGotoBB.GetSuccFreq()[1]); + uint64 removedFreq = condGotoBB.GetSuccFreq()[1]; condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); succ0->SetFrequency(succ0->GetFrequency() + removedFreq); } @@ -3639,10 +3639,10 @@ void ValueRangePropagation::RemoveUnreachableBB( UpdateProfile(*condGotoBB.GetPred(0), condGotoBB, trueBranch); } condGotoBB.SetKind(kBBFallthru); - int64_t removedFreq = 0; + uint64 removedFreq = 0; // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - removedFreq = static_cast(condGotoBB.GetSuccFreq()[0]); + removedFreq = condGotoBB.GetSuccFreq()[0]; } condGotoBB.RemoveSucc(*succ0); if (func.GetCfg()->UpdateCFGFreq()) { @@ -3806,9 +3806,9 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( if (exitCopyFallthru != nullptr) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; } pred.RemoveSucc(bb); DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3816,7 +3816,7 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { exitCopyFallthru->SetFrequency(exitCopyFallthru->GetFrequency() + edgeFreq); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); bb.SetFrequency(bb.GetFrequency() - edgeFreq); @@ -3855,16 +3855,16 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( mergeAllFallthruBBs->AddMeStmtLast(gotoMeStmt); PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; } pred.RemoveSucc(bb); pred.AddSucc(*mergeAllFallthruBBs, index); if (func.GetCfg()->UpdateCFGFreq()) { mergeAllFallthruBBs->SetFrequency(edgeFreq); - mergeAllFallthruBBs->PushBackSuccFreq(static_cast(edgeFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + mergeAllFallthruBBs->PushBackSuccFreq(edgeFreq); + pred.AddSuccFreq(edgeFreq, index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); bb.SetFrequency(bb.GetFrequency() - edgeFreq); @@ -3938,9 +3938,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (OnlyHaveCondGotoStmt(bb)) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -3950,20 +3950,20 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); // transform may not be consistent with frequency value updatedtrueFreq = updatedtrueFreq > 0 ? updatedtrueFreq : 0; bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); } } else { auto *exitCopyFallthru = GetNewCopyFallthruBB(trueBranch, bb); if (exitCopyFallthru != nullptr) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -3973,13 +3973,12 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); exitCopyFallthru->SetFrequency(edgeFreq); - exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); + exitCopyFallthru->PushBackSuccFreq(edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast( - bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); ASSERT(updatedtrueFreq >= 0, "sanity check"); bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); } return true; } @@ -3994,9 +3993,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( newBB->AddMeStmtLast(gotoMeStmt); PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -4005,9 +4004,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); - newBB->SetFrequency(static_cast(edgeFreq)); - newBB->PushBackSuccFreq(static_cast(edgeFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + newBB->SetFrequency(edgeFreq); + newBB->PushBackSuccFreq(edgeFreq); + pred.AddSuccFreq(edgeFreq, index); } DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); (void)func.GetOrCreateBBLabel(trueBranch); diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index 75038c932f..b7036bdbe6 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1833,10 +1833,10 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { DEBUG_LOG() << "SkipRedundantCond : Remove condBr in BB" << LOG_BBID(&succ) << ", turn it to fallthruBB\n"; } BB *rmBB = (FindFirstRealSucc(succ.GetSucc(0)) == newTarget) ? succ.GetSucc(1) : succ.GetSucc(0); - int64_t deletedSuccFreq = 0; + uint64 deletedSuccFreq = 0; if (cfg->UpdateCFGFreq()) { int idx = succ.GetSuccIndex(*rmBB); - deletedSuccFreq = static_cast(succ.GetSuccFreq()[static_cast(idx)]); + deletedSuccFreq = succ.GetSuccFreq()[static_cast(idx)]; } succ.RemoveSucc(*rmBB, true); if (cfg->UpdateCFGFreq()) { @@ -2095,16 +2095,16 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { } int predIdx = succ->GetPredIndex(*pred); bool needUpdatePhi = false; - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (cfg->UpdateCFGFreq()) { int idx = pred->GetSuccIndex(*succ); - removedFreq = static_cast(pred->GetSuccFreq()[static_cast(idx)]); + removedFreq = pred->GetSuccFreq()[static_cast(idx)]; } if (pred->IsPredBB(*newTarget)) { pred->RemoveSucc(*succ, true); // one of pred's succ has been newTarget, avoid duplicate succ here if (cfg->UpdateCFGFreq()) { int idx = pred->GetSuccIndex(*newTarget); - pred->SetSuccFreq(idx, pred->GetSuccFreq()[static_cast(idx)] + static_cast(removedFreq)); + pred->SetSuccFreq(idx, pred->GetSuccFreq()[static_cast(idx)] + removedFreq); } } else { pred->ReplaceSucc(succ, newTarget); // phi opnd is not removed from currBB's philist, we will remove it later diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 4d331cd7d2..300870dbf9 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -1065,10 +1065,10 @@ uint32 PreMeEmitter::Raise2PreMeIf(uint32 curJ, BlockNode *curBlk) { CHECK_FATAL(j < bbvec.size(), ""); if (GetFuncProfData()) { // set then part/else part frequency - int64_t ifFreq = GetFuncProfData()->GetStmtFreq(ifStmtNode->GetStmtID()); - int64_t branchFreq = bbvec[curJ + 1]->GetFrequency(); - GetFuncProfData()->SetStmtFreq(branchBlock->GetStmtID(), static_cast(branchFreq)); - GetFuncProfData()->SetStmtFreq(emptyBlock->GetStmtID(), static_cast(ifFreq - branchFreq)); + uint64 ifFreq = GetFuncProfData()->GetStmtFreq(ifStmtNode->GetStmtID()); + uint64 branchFreq = bbvec[curJ + 1]->GetFrequency(); + GetFuncProfData()->SetStmtFreq(branchBlock->GetStmtID(), branchFreq); + GetFuncProfData()->SetStmtFreq(emptyBlock->GetStmtID(), ifFreq - branchFreq); } return j; } -- Gitee From 495045222abe77e5625f33f95be73d85eb06d39d Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 1 Sep 2022 15:13:27 -0700 Subject: [PATCH 04/10] changed BB::frequency field from uint32 to uint64 --- src/mapleall/maple_ir/include/mir_function.h | 24 +++++++++--------- src/mapleall/maple_me/include/bb.h | 6 ++--- .../maple_me/include/me_loop_unrolling.h | 2 +- src/mapleall/maple_me/include/me_predict.h | 2 +- src/mapleall/maple_me/include/pme_emit.h | 2 +- src/mapleall/maple_me/src/bb.cpp | 4 +-- src/mapleall/maple_me/src/hdse.cpp | 5 ++-- src/mapleall/maple_me/src/me_bb_analyze.cpp | 2 +- src/mapleall/maple_me/src/me_bb_layout.cpp | 8 +++--- src/mapleall/maple_me/src/me_loop_canon.cpp | 14 +++++------ .../maple_me/src/me_loop_unrolling.cpp | 25 +++++++++---------- src/mapleall/maple_me/src/me_predict.cpp | 6 ++--- src/mapleall/maple_me/src/me_profile_use.cpp | 2 +- .../maple_me/src/me_value_range_prop.cpp | 24 +++++++++--------- src/mapleall/maple_me/src/optimizeCFG.cpp | 10 ++++---- src/mapleall/maple_me/src/pme_emit.cpp | 2 +- 16 files changed, 68 insertions(+), 70 deletions(-) diff --git a/src/mapleall/maple_ir/include/mir_function.h b/src/mapleall/maple_ir/include/mir_function.h index f54bf54a60..03ef310967 100644 --- a/src/mapleall/maple_ir/include/mir_function.h +++ b/src/mapleall/maple_ir/include/mir_function.h @@ -776,44 +776,44 @@ class MIRFunction { return freqFirstMap != nullptr; } - const MapleMap &GetFirstFreqMap() const { + const MapleMap &GetFirstFreqMap() const { return *freqFirstMap; } - void SetFirstFreqMap(uint32 stmtID, uint32 freq) { + void SetFirstFreqMap(uint32 stmtID, uint64 freq) { if (freqFirstMap == nullptr) { - freqFirstMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); + freqFirstMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); } (*freqFirstMap)[stmtID] = freq; } - const MapleMap &GetLastFreqMap() const { + const MapleMap &GetLastFreqMap() const { return *freqLastMap; } - int32 GetFreqFromLastStmt(uint32 stmtId) const { + int64 GetFreqFromLastStmt(uint32 stmtId) const { if (freqLastMap == nullptr) { return -1; } if ((*freqLastMap).find(stmtId) == (*freqLastMap).end()) { return -1; } - return static_cast((*freqLastMap)[stmtId]); + return (*freqLastMap)[stmtId]; } - int32 GetFreqFromFirstStmt(uint32 stmtId) const { + int64 GetFreqFromFirstStmt(uint32 stmtId) const { if (freqFirstMap == nullptr) { return -1; } if ((*freqFirstMap).find(stmtId) == (*freqFirstMap).end()) { return -1; } - return static_cast((*freqFirstMap)[stmtId]); + return (*freqFirstMap)[stmtId]; } - void SetLastFreqMap(uint32 stmtID, uint32 freq) { + void SetLastFreqMap(uint32 stmtID, uint64 freq) { if (freqLastMap == nullptr) { - freqLastMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); + freqLastMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); } (*freqLastMap)[stmtID] = freq; } @@ -1340,8 +1340,8 @@ class MIRFunction { MIRInfoVector info{module->GetMPAllocator().Adapter()}; MapleVector infoIsString{module->GetMPAllocator().Adapter()}; // tells if an entry has string value MIRScope *scope = nullptr; - MapleMap *freqFirstMap = nullptr; // save bb frequency in its first_stmt, key is stmtId - MapleMap *freqLastMap = nullptr; // save bb frequency in its last_stmt, key is stmtId + MapleMap *freqFirstMap = nullptr; // save bb frequency in its first_stmt, key is stmtId + MapleMap *freqLastMap = nullptr; // save bb frequency in its last_stmt, key is stmtId MapleSet referedPregs{module->GetMPAllocator().Adapter()}; bool referedRegsValid = false; bool hasVlaOrAlloca = false; diff --git a/src/mapleall/maple_me/include/bb.h b/src/mapleall/maple_me/include/bb.h index 93f6e4f6b7..582a403ca2 100644 --- a/src/mapleall/maple_me/include/bb.h +++ b/src/mapleall/maple_me/include/bb.h @@ -337,11 +337,11 @@ class BB { bbLabel = idx; } - uint32 GetFrequency() const { + uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 f) { + void SetFrequency(uint64 f) { frequency = f; } @@ -548,7 +548,7 @@ class BB { MapleMap phiList; MapleMap mePhiList; MapleMap> meVarPiList; - uint32 frequency = 0; + uint64 frequency = 0; BBKind kind = kBBUnknown; uint32 attributes = 0; diff --git a/src/mapleall/maple_me/include/me_loop_unrolling.h b/src/mapleall/maple_me/include/me_loop_unrolling.h index fe36d56e73..d28667d9a8 100644 --- a/src/mapleall/maple_me/include/me_loop_unrolling.h +++ b/src/mapleall/maple_me/include/me_loop_unrolling.h @@ -80,7 +80,7 @@ class LoopUnrolling { MeExpr *CreateExprWithCRNode(CRNode &crNode); void InsertCondGotoBB(); void ResetFrequency(BB &bb); - void ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint32 headFreq); + void ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint64 headFreq); void ResetFrequency(); void ResetFrequency(const BB &curBB, const BB &succ, const BB &exitBB, BB &curCopyBB, bool copyAllLoop); BB *CopyBB(BB &bb, bool isInLoop); diff --git a/src/mapleall/maple_me/include/me_predict.h b/src/mapleall/maple_me/include/me_predict.h index 57f2f932c6..8e99c43a9d 100644 --- a/src/mapleall/maple_me/include/me_predict.h +++ b/src/mapleall/maple_me/include/me_predict.h @@ -23,7 +23,7 @@ namespace maple { // The base value for branch probability notes and edge probabilities. constexpr int kProbBase = 10000; // The base value for BB frequency. -constexpr int kFreqBase = 100000; +constexpr uint64 kFreqBase = 100000; // Information about each branch predictor. struct PredictorInfo { diff --git a/src/mapleall/maple_me/include/pme_emit.h b/src/mapleall/maple_me/include/pme_emit.h index 40642c1757..895f1f1256 100644 --- a/src/mapleall/maple_me/include/pme_emit.h +++ b/src/mapleall/maple_me/include/pme_emit.h @@ -82,7 +82,7 @@ class PreMeEmitter : public AnalysisResult { MapleMap *GetPreMeExprExtensionMap() { return &preMeExprExtensionMap; } FuncProfInfo *GetFuncProfData() { return mirFunc->GetFuncProfData(); } void SetIpaInfo(CollectIpaInfo *info) { ipaInfo = info; } - void UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint32 frequency); + void UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint64 frequency); void UpdateStmtInfoForLabelNode(LabelNode &label, BB &bb); private: ArrayNode *ConvertToArray(BaseNode *x, TyIdx ptrTyIdx); diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index e39445da40..b0beef455f 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -486,7 +486,7 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { for (int i = 0; i < len; i++) { succFreqs += GetSuccFreq()[i]; } - int diff = static_cast(abs(succFreqs - GetFrequency())); + uint64 diff = abs(succFreqs - static_cast(GetFrequency())); if (len == 0 || diff <= 1) {return;} for (uint32 i = 0; i < len; ++i) { int64_t sfreq = GetSuccFreq()[static_cast(i)]; @@ -498,7 +498,7 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { int64_t diffFreq = scalefreq - sfreq; int64_t succBBnewFreq = succBBLoc->GetFrequency() + diffFreq; if (succBBnewFreq >= 0) { - succBBLoc->SetFrequency(static_cast(succBBnewFreq)); + succBBLoc->SetFrequency(succBBnewFreq); } } } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index c20ee03498..ee3ab4d0fd 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -254,8 +254,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); ASSERT(bb.GetFrequency() >= succ0Freq, "sanity check"); - bb.GetSucc(0)->SetFrequency(static_cast(bb.GetSucc(0)->GetFrequency() + - (bb.GetFrequency() - succ0Freq))); + bb.GetSucc(0)->SetFrequency(bb.GetSucc(0)->GetFrequency() + (bb.GetFrequency() - succ0Freq)); } } // A ivar contained in stmt @@ -317,7 +316,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { if (UpdateFreq()) { bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); - bb.GetSucc(0)->SetFrequency(static_cast(bb.GetSucc(0)->GetFrequency() + removedFreq)); + bb.GetSucc(0)->SetFrequency(bb.GetSucc(0)->GetFrequency() + removedFreq); } } else { DetermineUseCounts(condbr->GetOpnd()); diff --git a/src/mapleall/maple_me/src/me_bb_analyze.cpp b/src/mapleall/maple_me/src/me_bb_analyze.cpp index bd34586662..2909ee682b 100644 --- a/src/mapleall/maple_me/src/me_bb_analyze.cpp +++ b/src/mapleall/maple_me/src/me_bb_analyze.cpp @@ -16,7 +16,7 @@ namespace maple { void BBAnalyze::SetHotAndColdBBCountThreshold() { - std::vector times; + std::vector times; auto eIt = cfg->valid_end(); for (auto bIt = cfg->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; diff --git a/src/mapleall/maple_me/src/me_bb_layout.cpp b/src/mapleall/maple_me/src/me_bb_layout.cpp index 8c5612db86..93074c96f1 100644 --- a/src/mapleall/maple_me/src/me_bb_layout.cpp +++ b/src/mapleall/maple_me/src/me_bb_layout.cpp @@ -206,15 +206,15 @@ bool BBLayout::HasBetterLayoutPred(const BB &bb, BB &succ) { if (predList.size() <= 1) { return false; } - uint32 sumEdgeFreq = succ.GetFrequency(); + uint64 sumEdgeFreq = succ.GetFrequency(); const double hotEdgeFreqPercent = 0.8; // should further fine tuning - uint32 hotEdgeFreq = static_cast(sumEdgeFreq * hotEdgeFreqPercent); + uint64 hotEdgeFreq = static_cast(sumEdgeFreq * hotEdgeFreqPercent); // if edge freq(bb->succ) contribute more than 80% to succ block freq, no better layout pred than bb for (uint32 i = 0; i < predList.size(); ++i) { if (predList[i] == &bb) { continue; } - uint32 edgeFreq = static_cast(predList[i]->GetEdgeFreq(&succ)); + uint64 edgeFreq = predList[i]->GetEdgeFreq(&succ); if (edgeFreq > (sumEdgeFreq - hotEdgeFreq)) { return true; } @@ -258,7 +258,7 @@ BB *BBLayout::GetBestSucc(BB &bb, const BBChain &chain, const MapleVector } // (2) search in readyToLayoutChains - uint32 bestFreq = 0; + uint64 bestFreq = 0; for (auto it = readyToLayoutChains.begin(); it != readyToLayoutChains.end(); ++it) { BBChain *readyChain = *it; BB *header = readyChain->GetHeader(); diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index 3aae6c2514..412713ee3a 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -95,19 +95,19 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (splitList.size() == 1) { // quick split auto *pred = splitList[0]; - auto index = pred->GetSuccIndex(*splittedBB); + int index = pred->GetSuccIndex(*splittedBB); // add frequency to mergedBB if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); uint64_t freq = pred->GetEdgeFreq(static_cast(idx)); - mergedBB->SetFrequency(static_cast(freq)); + mergedBB->SetFrequency(freq); mergedBB->PushBackSuccFreq(freq); } splittedBB->ReplacePred(pred, mergedBB); - pred->AddSucc(*mergedBB, static_cast(static_cast(index))); + pred->AddSucc(*mergedBB, index); if (updateFreqs) { - pred->AddSuccFreq(mergedBB->GetFrequency(), static_cast(static_cast(index))); + pred->AddSuccFreq(mergedBB->GetFrequency(), index); } if (!pred->GetMeStmts().empty()) { UpdateTheOffsetOfStmtWhenTargetBBIsChange(*pred, *splittedBB, *mergedBB); @@ -134,8 +134,8 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); - freq = pred->GetEdgeFreq(static_cast(idx)); - mergedBB->SetFrequency(static_cast(mergedBB->GetFrequency() + freq)); + freq = pred->GetEdgeFreq(idx); + mergedBB->SetFrequency(mergedBB->GetFrequency() + freq); } pred->ReplaceSucc(splittedBB, mergedBB); if (updateFreqs) { @@ -277,7 +277,7 @@ void MeLoopCanon::InsertExitBB(LoopDesc &loop) { curBB->ReplaceSucc(succ, newExitBB); succ->AddPred(*newExitBB, pos); if (updateFreqs) { - newExitBB->SetFrequency(static_cast(freq)); + newExitBB->SetFrequency(freq); newExitBB->PushBackSuccFreq(freq); } if (!curBB->GetMeStmts().empty()) { diff --git a/src/mapleall/maple_me/src/me_loop_unrolling.cpp b/src/mapleall/maple_me/src/me_loop_unrolling.cpp index 11ef561b38..5e39fd56c1 100644 --- a/src/mapleall/maple_me/src/me_loop_unrolling.cpp +++ b/src/mapleall/maple_me/src/me_loop_unrolling.cpp @@ -309,11 +309,11 @@ void LoopUnrolling::CopyLoopBody(BB &newHeadBB, std::unordered_map &ol // Update frequency of old BB. void LoopUnrolling::ResetFrequency(BB &bb) { - auto freq = bb.GetFrequency() / replicatedLoopNum; + uint64 freq = bb.GetFrequency() / replicatedLoopNum; if ((!instrumentProf) && freq == 0 && partialCount == 0 && bb.GetFrequency() != 0) { freq = 1; } - bb.SetFrequency(static_cast(freq + partialCount)); + bb.SetFrequency(freq + partialCount); for (size_t i = 0; i < bb.GetSucc().size(); ++i) { auto currFreq = bb.GetEdgeFreq(i) / replicatedLoopNum; if ((!instrumentProf) && currFreq == 0 && partialCount == 0 && bb.GetFrequency() != 0) { @@ -328,17 +328,17 @@ void LoopUnrolling::ResetFrequency() { auto exitBB = cfg->GetBBFromID(loop->inloopBB2exitBBs.begin()->first); auto latchBB = loop->latch; if (isUnrollWithVar) { - auto latchFreq = loop->head->GetFrequency() % replicatedLoopNum - loop->preheader->GetFrequency(); - exitBB->SetFrequency(static_cast(loop->head->GetFrequency() % replicatedLoopNum - latchFreq)); + uint64 latchFreq = loop->head->GetFrequency() % replicatedLoopNum - loop->preheader->GetFrequency(); + exitBB->SetFrequency(loop->head->GetFrequency() % replicatedLoopNum - latchFreq); exitBB->SetEdgeFreq(latchBB, latchFreq); - latchBB->SetFrequency(static_cast(latchFreq)); + latchBB->SetFrequency(latchFreq); latchBB->SetEdgeFreq(loop->head, latchFreq); } else { - auto exitFreq = exitBB->GetFrequency() / replicatedLoopNum; + uint64 exitFreq = exitBB->GetFrequency() / replicatedLoopNum; if (exitFreq == 0 && exitBB->GetFrequency() != 0) { exitFreq = 1; } - exitBB->SetFrequency(static_cast(exitFreq)); + exitBB->SetFrequency(exitFreq); auto exitEdgeFreq = exitBB->GetEdgeFreq(latchBB) / replicatedLoopNum; if (exitEdgeFreq == 0 && exitBB->GetEdgeFreq(latchBB) != 0) { exitEdgeFreq = 1; @@ -348,7 +348,7 @@ void LoopUnrolling::ResetFrequency() { if (latchFreq == 0 && latchBB->GetFrequency() != 0) { latchFreq = 1; } - latchBB->SetFrequency(static_cast(latchFreq)); + latchBB->SetFrequency(latchFreq); latchBB->SetEdgeFreq(loop->head, latchFreq); } } @@ -532,7 +532,7 @@ LoopUnrolling::ReturnKindOfFullyUnroll LoopUnrolling::LoopFullyUnroll(int64 trip return kCanFullyUnroll; } -void LoopUnrolling::ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint32 headFreq) { +void LoopUnrolling::ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint64 headFreq) { if (profValid) { newCondGotoBB.SetFrequency(headFreq); exitingBB.SetEdgeFreq(&exitedBB, 0); @@ -544,7 +544,7 @@ void LoopUnrolling::InsertCondGotoBB() { BB *exitingBB = cfg->GetBBFromID(loop->inloopBB2exitBBs.begin()->first); BB *exitedBB = *(loop->inloopBB2exitBBs.cbegin()->second->cbegin()); BB *newCondGotoBB = CopyBB(*exitingBB, true); - auto headFreq = loop->head->GetFrequency(); + uint64 headFreq = loop->head->GetFrequency(); ResetFrequency(*newCondGotoBB, *exitingBB, *exitedBB, headFreq); MeStmt *lastMeStmt = newCondGotoBB->GetLastMe(); CHECK_FATAL(lastMeStmt != nullptr, "last meStmt must not be nullptr"); @@ -642,7 +642,7 @@ void LoopUnrolling::AddPreHeader(BB *oldPreHeader, BB *head) { head->AddPred(*preheader, index); if (profValid) { preheader->PushBackSuccFreq(preheaderFreq); - preheader->SetFrequency(static_cast(preheaderFreq)); + preheader->SetFrequency(preheaderFreq); } CondGotoMeStmt *condGotoStmt = static_cast(oldPreHeader->GetLastMe()); LabelIdx oldlabIdx = condGotoStmt->GetOffset(); @@ -818,8 +818,7 @@ void LoopUnrolling::CopyLoopForPartial(BB &partialCondGoto, BB &exitedBB, BB &ex partialCondGoto.AddSucc(*partialHead); if (profValid) { partialCondGoto.PushBackSuccFreq(loop->head->GetFrequency() % replicatedLoopNum); - partialCondGoto.SetFrequency( - static_cast(partialCondGoto.GetEdgeFreq(static_cast(0)) + partialCondGoto.GetEdgeFreq(1))); + partialCondGoto.SetFrequency(partialCondGoto.GetEdgeFreq(static_cast(0)) + partialCondGoto.GetEdgeFreq(1)); } CHECK_FATAL(partialCondGoto.GetKind() == kBBCondGoto, "must be partialCondGoto"); CHECK_FATAL(!partialCondGoto.GetMeStmts().empty(), "must not be empty"); diff --git a/src/mapleall/maple_me/src/me_predict.cpp b/src/mapleall/maple_me/src/me_predict.cpp index 80f6db36e0..df8efa1da4 100644 --- a/src/mapleall/maple_me/src/me_predict.cpp +++ b/src/mapleall/maple_me/src/me_predict.cpp @@ -735,7 +735,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) return false; } } - uint32 freq = 0; + uint64 freq = 0; double cyclicProb = 0; for (BB *pred : bb.GetPred()) { Edge *edge = FindEdge(*pred, bb); @@ -750,7 +750,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) cyclicProb = 1 - std::numeric_limits::epsilon(); } // Floating-point numbers have precision problems, consider using integers to represent backEdgeProb? - bb.SetFrequency(static_cast(freq / (1 - cyclicProb))); + bb.SetFrequency(freq / (1 - cyclicProb)); } // 2. calculate frequencies of bb's out edges if (predictDebug) { @@ -758,7 +758,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) } bbVisited[bb.GetBBId()] = true; uint32 tmp = 0; - uint32 total = 0; + uint64 total = 0; Edge *bestEdge = nullptr; for (size_t i = 0; i < bb.GetSucc().size(); ++i) { Edge *edge = FindEdge(bb, *bb.GetSucc(i)); diff --git a/src/mapleall/maple_me/src/me_profile_use.cpp b/src/mapleall/maple_me/src/me_profile_use.cpp index 195eb16512..d43fa03e73 100644 --- a/src/mapleall/maple_me/src/me_profile_use.cpp +++ b/src/mapleall/maple_me/src/me_profile_use.cpp @@ -244,7 +244,7 @@ void MeProfUse::SetFuncEdgeInfo() { for (auto bIt = cfg->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; auto *bbInfo = GetBBUseInfo(*bb); - bb->SetFrequency(static_cast(bbInfo->GetCount())); + bb->SetFrequency(bbInfo->GetCount()); if (bIt == cfg->common_entry() || bIt == cfg->common_exit()) { continue; } diff --git a/src/mapleall/maple_me/src/me_value_range_prop.cpp b/src/mapleall/maple_me/src/me_value_range_prop.cpp index 67448df356..07de0b43eb 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3240,7 +3240,7 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB bb.SetKind(kBBFallthru); if (func.GetCfg()->UpdateCFGFreq()) { bb.SetSuccFreq(0, bb.GetFrequency()); - succBB.SetFrequency(static_cast(succBB.GetFrequency() + removedFreq)); + succBB.SetFrequency(succBB.GetFrequency() + removedFreq); unreachableBB.SetFrequency(0); } auto *loop = loops->GetBBLoopParent(bb.GetBBId()); @@ -3625,7 +3625,7 @@ void ValueRangePropagation::RemoveUnreachableBB( if (func.GetCfg()->UpdateCFGFreq()) { int64_t removedFreq = static_cast(condGotoBB.GetSuccFreq()[1]); condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ0->SetFrequency(static_cast(succ0->GetFrequency() + removedFreq)); + succ0->SetFrequency(succ0->GetFrequency() + removedFreq); } condGotoBB.RemoveSucc(*succ1); DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ1, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3647,7 +3647,7 @@ void ValueRangePropagation::RemoveUnreachableBB( condGotoBB.RemoveSucc(*succ0); if (func.GetCfg()->UpdateCFGFreq()) { condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ1->SetFrequency(static_cast(succ1->GetFrequency() + removedFreq)); + succ1->SetFrequency(succ1->GetFrequency() + removedFreq); } DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ0, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); condGotoBB.RemoveMeStmt(condGotoBB.GetLastMe()); @@ -3815,11 +3815,11 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - exitCopyFallthru->SetFrequency(static_cast(exitCopyFallthru->GetFrequency() + edgeFreq)); + exitCopyFallthru->SetFrequency(exitCopyFallthru->GetFrequency() + edgeFreq); pred.AddSuccFreq(static_cast(edgeFreq), index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); } return true; @@ -3862,12 +3862,12 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( pred.RemoveSucc(bb); pred.AddSucc(*mergeAllFallthruBBs, index); if (func.GetCfg()->UpdateCFGFreq()) { - mergeAllFallthruBBs->SetFrequency(static_cast(edgeFreq)); + mergeAllFallthruBBs->SetFrequency(edgeFreq); mergeAllFallthruBBs->PushBackSuccFreq(static_cast(edgeFreq)); pred.AddSuccFreq(static_cast(edgeFreq), index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); } mergeAllFallthruBBs->AddSucc(trueBranch); @@ -3948,7 +3948,7 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(trueBranch, index); CreateLabelForTargetBB(pred, trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); // transform may not be consistent with frequency value @@ -3971,8 +3971,8 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); - exitCopyFallthru->SetFrequency(static_cast(edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); + exitCopyFallthru->SetFrequency(edgeFreq); exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); int64_t updatedtrueFreq = static_cast( @@ -4003,9 +4003,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*newBB, index); newBB->AddSucc(trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); - newBB->SetFrequency(static_cast(edgeFreq)); + newBB->SetFrequency(static_cast(edgeFreq)); newBB->PushBackSuccFreq(static_cast(edgeFreq)); pred.AddSuccFreq(static_cast(edgeFreq), index); } diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index a9ec25606c..c378d2d04b 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1831,7 +1831,7 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { if (cfg->UpdateCFGFreq()) { succ.SetSuccFreq(0, succ.GetFrequency()); auto *succofSucc = succ.GetSucc(0); - succofSucc->SetFrequency(static_cast(succofSucc->GetFrequency() + deletedSuccFreq)); + succofSucc->SetFrequency(succofSucc->GetFrequency() + deletedSuccFreq); } DEBUG_LOG() << "Remove succ BB" << LOG_BBID(rmBB) << " of pred BB" << LOG_BBID(&succ) << "\n"; return true; @@ -1886,12 +1886,12 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { if (cfg->UpdateCFGFreq()) { int idx = pred.GetSuccIndex(*newBB); ASSERT(idx >= 0 && idx < pred.GetSucc().size(), "sanity check"); - uint64_t freq = pred.GetEdgeFreq(idx); + uint64 freq = pred.GetEdgeFreq(idx); newBB->SetFrequency(freq); newBB->PushBackSuccFreq(freq); // update frequency of succ because one of its pred is removed // frequency of - uint32_t freqOfSucc = succ.GetFrequency(); + uint64 freqOfSucc = succ.GetFrequency(); ASSERT(freqOfSucc >= freq, "sanity check"); succ.SetFrequency(freqOfSucc - freq); // update edge frequency @@ -2100,9 +2100,9 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { needUpdatePhi = true; } if (cfg->UpdateCFGFreq()) { - int64_t succFreq = succ->GetFrequency(); + uint64 succFreq = succ->GetFrequency(); ASSERT(succFreq >= removedFreq, "sanity check"); - succ->SetFrequency(static_cast(succFreq - removedFreq)); + succ->SetFrequency(succFreq - removedFreq); succ->SetSuccFreq(0, succ->GetFrequency()); } DEBUG_LOG() << "Merge Uncond BB" << LOG_BBID(succ) << " to its pred BB" << LOG_BBID(pred) << ": BB" << LOG_BBID(pred) diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 4f3f8c4b74..31d26620ff 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -767,7 +767,7 @@ void PreMeEmitter::UpdateStmtInfoForLabelNode(LabelNode &label, BB &bb) { label.SetStmtInfoId(ipaInfo->GetRealFirstStmtInfoId(bb)); } -void PreMeEmitter::UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint32 frequency) { +void PreMeEmitter::UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint64 frequency) { if (ipaInfo == nullptr || meStmt.GetStmtInfoId() == kInvalidIndex) { return; } -- Gitee From 1feb72cfe6bb08ed4801ed49f1cdced71cc231f1 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 6 Sep 2022 14:01:19 -0700 Subject: [PATCH 05/10] Fix bug introduced by last commit --- src/mapleall/maple_me/src/me_predict.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapleall/maple_me/src/me_predict.cpp b/src/mapleall/maple_me/src/me_predict.cpp index df8efa1da4..acbe0c74ad 100644 --- a/src/mapleall/maple_me/src/me_predict.cpp +++ b/src/mapleall/maple_me/src/me_predict.cpp @@ -750,7 +750,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) cyclicProb = 1 - std::numeric_limits::epsilon(); } // Floating-point numbers have precision problems, consider using integers to represent backEdgeProb? - bb.SetFrequency(freq / (1 - cyclicProb)); + bb.SetFrequency(static_cast(static_cast(freq / (1 - cyclicProb)))); } // 2. calculate frequencies of bb's out edges if (predictDebug) { -- Gitee From e826c376159745adc6197080da2cf0158001c07b Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 6 Sep 2022 15:32:55 -0700 Subject: [PATCH 06/10] Fix more type compatibility issues Make maple parser accept switch statement's default label being 0 --- .../maple_ipa/include/stmt_identify.h | 6 +-- src/mapleall/maple_ir/src/mir_parser.cpp | 2 + src/mapleall/maple_me/include/me_function.h | 6 +-- src/mapleall/maple_me/src/bb.cpp | 12 ++--- src/mapleall/maple_me/src/hdse.cpp | 4 +- src/mapleall/maple_me/src/me_loop_canon.cpp | 6 +-- .../maple_me/src/me_value_range_prop.cpp | 53 +++++++++---------- src/mapleall/maple_me/src/optimizeCFG.cpp | 10 ++-- src/mapleall/maple_me/src/pme_emit.cpp | 8 +-- 9 files changed, 54 insertions(+), 53 deletions(-) diff --git a/src/mapleall/maple_ipa/include/stmt_identify.h b/src/mapleall/maple_ipa/include/stmt_identify.h index 7239add8f3..b8561c6643 100644 --- a/src/mapleall/maple_ipa/include/stmt_identify.h +++ b/src/mapleall/maple_ipa/include/stmt_identify.h @@ -177,11 +177,11 @@ class StmtInfo { return puIdx; } - const uint32 GetFrequency() const { + const uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 freq) { + void SetFrequency(uint64 freq) { frequency = freq; } @@ -214,7 +214,7 @@ class StmtInfo { BlockNode *currBlock = nullptr; MeStmt *meStmt = nullptr; PUIdx puIdx = kInvalidPuIdx; - uint32 frequency = 0; + uint64 frequency = 0; bool valid = true; std::vector hashCandidate; std::unordered_map symbolDefUse; diff --git a/src/mapleall/maple_ir/src/mir_parser.cpp b/src/mapleall/maple_ir/src/mir_parser.cpp index d425dad181..a422fccbb0 100644 --- a/src/mapleall/maple_ir/src/mir_parser.cpp +++ b/src/mapleall/maple_ir/src/mir_parser.cpp @@ -610,6 +610,8 @@ bool MIRParser::ParseStmtSwitch(StmtNodePtr &stmt) { } if (lexer.NextToken() == TK_label) { switchNode->SetDefaultLabel(mod.CurFunction()->GetOrCreateLableIdxFromName(lexer.GetName())); + } else if (lexer.GetTokenKind() == TK_intconst && lexer.GetTheIntVal() == 0) { + switchNode->SetDefaultLabel(0); } else { Error("expect label in switch but get "); return false; diff --git a/src/mapleall/maple_me/include/me_function.h b/src/mapleall/maple_me/include/me_function.h index ab1f8d8533..33169261da 100644 --- a/src/mapleall/maple_me/include/me_function.h +++ b/src/mapleall/maple_me/include/me_function.h @@ -302,11 +302,11 @@ class MeFunction : public FuncEmit { profValid = val; } - uint32 GetFrequency() const { + uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 f) { + void SetFrequency(uint64 f) { frequency = f; } @@ -399,7 +399,7 @@ class MeFunction : public FuncEmit { bool hasWriteInputAsmNode = false; /* set when ssa tab build */ bool profValid = false; IRProfileDesc *profileDesc = nullptr; - uint32 frequency = 0; + uint64 frequency = 0; // lfo bool isLfo = false; // during pme processing diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index b0beef455f..d3519ad12a 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -488,17 +488,17 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { } uint64 diff = abs(succFreqs - static_cast(GetFrequency())); if (len == 0 || diff <= 1) {return;} - for (uint32 i = 0; i < len; ++i) { - int64_t sfreq = GetSuccFreq()[static_cast(i)]; - int64_t scalefreq = (succFreqs == 0 ? (frequency / len) : (sfreq * frequency / succFreqs)); - SetSuccFreq(static_cast(i), scalefreq); + for (int i = 0; i < len; ++i) { + uint64 sfreq = GetSuccFreq()[i]; + uint64 scalefreq = (succFreqs == 0 ? (frequency / len) : (sfreq * frequency / succFreqs)); + SetSuccFreq(i, scalefreq); // update succ frequency with new difference if needed if (updateBBFreqOfSucc) { - auto *succBBLoc = GetSucc(static_cast(i)); + auto *succBBLoc = GetSucc(i); int64_t diffFreq = scalefreq - sfreq; int64_t succBBnewFreq = succBBLoc->GetFrequency() + diffFreq; if (succBBnewFreq >= 0) { - succBBLoc->SetFrequency(succBBnewFreq); + succBBLoc->SetFrequency(static_cast(succBBnewFreq)); } } } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index ee3ab4d0fd..312c6e2ced 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -250,7 +250,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { } bb.SetKind(kBBFallthru); if (UpdateFreq()) { - int64_t succ0Freq = static_cast(bb.GetSuccFreq()[0]); + uint64 succ0Freq = static_cast(bb.GetSuccFreq()[0]); bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); ASSERT(bb.GetFrequency() >= succ0Freq, "sanity check"); @@ -280,7 +280,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { bool isPme = mirModule.CurFunction()->GetMeFunc()->GetPreMeFunc() != nullptr; if (mestmt->IsCondBr() && !isPme) { // see if foldable to unconditional branch CondGotoMeStmt *condbr = static_cast(mestmt); - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (!mirModule.IsJavaModule() && condbr->GetOpnd()->GetMeOp() == kMeOpConst) { CHECK_FATAL(IsPrimitiveInteger(condbr->GetOpnd()->GetPrimType()), "MeHDSE::DseProcess: branch condition must be integer type"); diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index 412713ee3a..4edad67654 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -105,9 +105,9 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, mergedBB->PushBackSuccFreq(freq); } splittedBB->ReplacePred(pred, mergedBB); - pred->AddSucc(*mergedBB, index); + pred->AddSucc(*mergedBB, static_cast(index)); if (updateFreqs) { - pred->AddSuccFreq(mergedBB->GetFrequency(), index); + pred->AddSuccFreq(mergedBB->GetFrequency(), static_cast(index)); } if (!pred->GetMeStmts().empty()) { UpdateTheOffsetOfStmtWhenTargetBBIsChange(*pred, *splittedBB, *mergedBB); @@ -134,7 +134,7 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); - freq = pred->GetEdgeFreq(idx); + freq = pred->GetEdgeFreq(static_cast(idx)); mergedBB->SetFrequency(mergedBB->GetFrequency() + freq); } pred->ReplaceSucc(splittedBB, mergedBB); diff --git a/src/mapleall/maple_me/src/me_value_range_prop.cpp b/src/mapleall/maple_me/src/me_value_range_prop.cpp index 07de0b43eb..2f5dffcaaf 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3230,10 +3230,10 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB } Insert2UnreachableBBs(unreachableBB); // update frequency before cfg changed - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { int idx = bb.GetSuccIndex(unreachableBB); - removedFreq = static_cast(bb.GetSuccFreq()[static_cast(idx)]); + removedFreq = bb.GetSuccFreq()[static_cast(idx)]; } bb.RemoveSucc(unreachableBB); bb.RemoveMeStmt(bb.GetLastMe()); @@ -3623,7 +3623,7 @@ void ValueRangePropagation::RemoveUnreachableBB( condGotoBB.SetKind(kBBFallthru); // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - int64_t removedFreq = static_cast(condGotoBB.GetSuccFreq()[1]); + uint64 removedFreq = condGotoBB.GetSuccFreq()[1]; condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); succ0->SetFrequency(succ0->GetFrequency() + removedFreq); } @@ -3639,10 +3639,10 @@ void ValueRangePropagation::RemoveUnreachableBB( UpdateProfile(*condGotoBB.GetPred(0), condGotoBB, trueBranch); } condGotoBB.SetKind(kBBFallthru); - int64_t removedFreq = 0; + uint64 removedFreq = 0; // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - removedFreq = static_cast(condGotoBB.GetSuccFreq()[0]); + removedFreq = condGotoBB.GetSuccFreq()[0]; } condGotoBB.RemoveSucc(*succ0); if (func.GetCfg()->UpdateCFGFreq()) { @@ -3806,9 +3806,9 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( if (exitCopyFallthru != nullptr) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; } pred.RemoveSucc(bb); DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3816,7 +3816,7 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { exitCopyFallthru->SetFrequency(exitCopyFallthru->GetFrequency() + edgeFreq); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); bb.SetFrequency(bb.GetFrequency() - edgeFreq); @@ -3855,16 +3855,16 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( mergeAllFallthruBBs->AddMeStmtLast(gotoMeStmt); PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; } pred.RemoveSucc(bb); pred.AddSucc(*mergeAllFallthruBBs, index); if (func.GetCfg()->UpdateCFGFreq()) { mergeAllFallthruBBs->SetFrequency(edgeFreq); - mergeAllFallthruBBs->PushBackSuccFreq(static_cast(edgeFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + mergeAllFallthruBBs->PushBackSuccFreq(edgeFreq); + pred.AddSuccFreq(edgeFreq, index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); bb.SetFrequency(bb.GetFrequency() - edgeFreq); @@ -3938,9 +3938,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (OnlyHaveCondGotoStmt(bb)) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -3950,20 +3950,20 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); // transform may not be consistent with frequency value updatedtrueFreq = updatedtrueFreq > 0 ? updatedtrueFreq : 0; bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); } } else { auto *exitCopyFallthru = GetNewCopyFallthruBB(trueBranch, bb); if (exitCopyFallthru != nullptr) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -3973,13 +3973,12 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); exitCopyFallthru->SetFrequency(edgeFreq); - exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); + exitCopyFallthru->PushBackSuccFreq(edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast( - bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); ASSERT(updatedtrueFreq >= 0, "sanity check"); bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); } return true; } @@ -3994,9 +3993,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( newBB->AddMeStmtLast(gotoMeStmt); PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -4005,9 +4004,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); - newBB->SetFrequency(static_cast(edgeFreq)); - newBB->PushBackSuccFreq(static_cast(edgeFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + newBB->SetFrequency(edgeFreq); + newBB->PushBackSuccFreq(edgeFreq); + pred.AddSuccFreq(edgeFreq, index); } DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); (void)func.GetOrCreateBBLabel(trueBranch); diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index c378d2d04b..fc467d968c 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1822,10 +1822,10 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { DEBUG_LOG() << "SkipRedundantCond : Remove condBr in BB" << LOG_BBID(&succ) << ", turn it to fallthruBB\n"; } BB *rmBB = (FindFirstRealSucc(succ.GetSucc(0)) == newTarget) ? succ.GetSucc(1) : succ.GetSucc(0); - int64_t deletedSuccFreq = 0; + uint64 deletedSuccFreq = 0; if (cfg->UpdateCFGFreq()) { int idx = succ.GetSuccIndex(*rmBB); - deletedSuccFreq = static_cast(succ.GetSuccFreq()[static_cast(idx)]); + deletedSuccFreq = succ.GetSuccFreq()[static_cast(idx)]; } succ.RemoveSucc(*rmBB, true); if (cfg->UpdateCFGFreq()) { @@ -2084,16 +2084,16 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { } int predIdx = succ->GetPredIndex(*pred); bool needUpdatePhi = false; - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (cfg->UpdateCFGFreq()) { int idx = pred->GetSuccIndex(*succ); - removedFreq = static_cast(pred->GetSuccFreq()[static_cast(idx)]); + removedFreq = pred->GetSuccFreq()[static_cast(idx)]; } if (pred->IsPredBB(*newTarget)) { pred->RemoveSucc(*succ, true); // one of pred's succ has been newTarget, avoid duplicate succ here if (cfg->UpdateCFGFreq()) { int idx = pred->GetSuccIndex(*newTarget); - pred->SetSuccFreq(idx, pred->GetSuccFreq()[static_cast(idx)] + static_cast(removedFreq)); + pred->SetSuccFreq(idx, pred->GetSuccFreq()[static_cast(idx)] + removedFreq); } } else { pred->ReplaceSucc(succ, newTarget); // phi opnd is not removed from currBB's philist, we will remove it later diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 31d26620ff..56dbc5b764 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -1066,10 +1066,10 @@ uint32 PreMeEmitter::Raise2PreMeIf(uint32 curJ, BlockNode *curBlk) { CHECK_FATAL(j < bbvec.size(), ""); if (GetFuncProfData()) { // set then part/else part frequency - int64_t ifFreq = GetFuncProfData()->GetStmtFreq(ifStmtNode->GetStmtID()); - int64_t branchFreq = bbvec[curJ + 1]->GetFrequency(); - GetFuncProfData()->SetStmtFreq(branchBlock->GetStmtID(), static_cast(branchFreq)); - GetFuncProfData()->SetStmtFreq(emptyBlock->GetStmtID(), static_cast(ifFreq - branchFreq)); + uint64 ifFreq = GetFuncProfData()->GetStmtFreq(ifStmtNode->GetStmtID()); + uint64 branchFreq = bbvec[curJ + 1]->GetFrequency(); + GetFuncProfData()->SetStmtFreq(branchBlock->GetStmtID(), branchFreq); + GetFuncProfData()->SetStmtFreq(emptyBlock->GetStmtID(), ifFreq - branchFreq); } return j; } -- Gitee From c7f660c1c028eff65307d33941b1dfd7ec3e6056 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 1 Sep 2022 15:13:27 -0700 Subject: [PATCH 07/10] changed BB::frequency field from uint32 to uint64 --- src/mapleall/maple_ir/include/mir_function.h | 24 +++++++++--------- src/mapleall/maple_me/include/bb.h | 6 ++--- .../maple_me/include/me_loop_unrolling.h | 2 +- src/mapleall/maple_me/include/me_predict.h | 2 +- src/mapleall/maple_me/include/pme_emit.h | 2 +- src/mapleall/maple_me/src/bb.cpp | 6 ++--- src/mapleall/maple_me/src/hdse.cpp | 5 ++-- src/mapleall/maple_me/src/me_bb_analyze.cpp | 2 +- src/mapleall/maple_me/src/me_bb_layout.cpp | 8 +++--- src/mapleall/maple_me/src/me_loop_canon.cpp | 14 +++++------ .../maple_me/src/me_loop_unrolling.cpp | 25 +++++++++---------- src/mapleall/maple_me/src/me_predict.cpp | 6 ++--- src/mapleall/maple_me/src/me_profile_use.cpp | 2 +- .../maple_me/src/me_value_range_prop.cpp | 24 +++++++++--------- src/mapleall/maple_me/src/optimizeCFG.cpp | 10 ++++---- src/mapleall/maple_me/src/pme_emit.cpp | 2 +- 16 files changed, 69 insertions(+), 71 deletions(-) diff --git a/src/mapleall/maple_ir/include/mir_function.h b/src/mapleall/maple_ir/include/mir_function.h index f54bf54a60..03ef310967 100644 --- a/src/mapleall/maple_ir/include/mir_function.h +++ b/src/mapleall/maple_ir/include/mir_function.h @@ -776,44 +776,44 @@ class MIRFunction { return freqFirstMap != nullptr; } - const MapleMap &GetFirstFreqMap() const { + const MapleMap &GetFirstFreqMap() const { return *freqFirstMap; } - void SetFirstFreqMap(uint32 stmtID, uint32 freq) { + void SetFirstFreqMap(uint32 stmtID, uint64 freq) { if (freqFirstMap == nullptr) { - freqFirstMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); + freqFirstMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); } (*freqFirstMap)[stmtID] = freq; } - const MapleMap &GetLastFreqMap() const { + const MapleMap &GetLastFreqMap() const { return *freqLastMap; } - int32 GetFreqFromLastStmt(uint32 stmtId) const { + int64 GetFreqFromLastStmt(uint32 stmtId) const { if (freqLastMap == nullptr) { return -1; } if ((*freqLastMap).find(stmtId) == (*freqLastMap).end()) { return -1; } - return static_cast((*freqLastMap)[stmtId]); + return (*freqLastMap)[stmtId]; } - int32 GetFreqFromFirstStmt(uint32 stmtId) const { + int64 GetFreqFromFirstStmt(uint32 stmtId) const { if (freqFirstMap == nullptr) { return -1; } if ((*freqFirstMap).find(stmtId) == (*freqFirstMap).end()) { return -1; } - return static_cast((*freqFirstMap)[stmtId]); + return (*freqFirstMap)[stmtId]; } - void SetLastFreqMap(uint32 stmtID, uint32 freq) { + void SetLastFreqMap(uint32 stmtID, uint64 freq) { if (freqLastMap == nullptr) { - freqLastMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); + freqLastMap = module->GetMemPool()->New>(module->GetMPAllocator().Adapter()); } (*freqLastMap)[stmtID] = freq; } @@ -1340,8 +1340,8 @@ class MIRFunction { MIRInfoVector info{module->GetMPAllocator().Adapter()}; MapleVector infoIsString{module->GetMPAllocator().Adapter()}; // tells if an entry has string value MIRScope *scope = nullptr; - MapleMap *freqFirstMap = nullptr; // save bb frequency in its first_stmt, key is stmtId - MapleMap *freqLastMap = nullptr; // save bb frequency in its last_stmt, key is stmtId + MapleMap *freqFirstMap = nullptr; // save bb frequency in its first_stmt, key is stmtId + MapleMap *freqLastMap = nullptr; // save bb frequency in its last_stmt, key is stmtId MapleSet referedPregs{module->GetMPAllocator().Adapter()}; bool referedRegsValid = false; bool hasVlaOrAlloca = false; diff --git a/src/mapleall/maple_me/include/bb.h b/src/mapleall/maple_me/include/bb.h index 93f6e4f6b7..582a403ca2 100644 --- a/src/mapleall/maple_me/include/bb.h +++ b/src/mapleall/maple_me/include/bb.h @@ -337,11 +337,11 @@ class BB { bbLabel = idx; } - uint32 GetFrequency() const { + uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 f) { + void SetFrequency(uint64 f) { frequency = f; } @@ -548,7 +548,7 @@ class BB { MapleMap phiList; MapleMap mePhiList; MapleMap> meVarPiList; - uint32 frequency = 0; + uint64 frequency = 0; BBKind kind = kBBUnknown; uint32 attributes = 0; diff --git a/src/mapleall/maple_me/include/me_loop_unrolling.h b/src/mapleall/maple_me/include/me_loop_unrolling.h index fe36d56e73..d28667d9a8 100644 --- a/src/mapleall/maple_me/include/me_loop_unrolling.h +++ b/src/mapleall/maple_me/include/me_loop_unrolling.h @@ -80,7 +80,7 @@ class LoopUnrolling { MeExpr *CreateExprWithCRNode(CRNode &crNode); void InsertCondGotoBB(); void ResetFrequency(BB &bb); - void ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint32 headFreq); + void ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint64 headFreq); void ResetFrequency(); void ResetFrequency(const BB &curBB, const BB &succ, const BB &exitBB, BB &curCopyBB, bool copyAllLoop); BB *CopyBB(BB &bb, bool isInLoop); diff --git a/src/mapleall/maple_me/include/me_predict.h b/src/mapleall/maple_me/include/me_predict.h index 57f2f932c6..8e99c43a9d 100644 --- a/src/mapleall/maple_me/include/me_predict.h +++ b/src/mapleall/maple_me/include/me_predict.h @@ -23,7 +23,7 @@ namespace maple { // The base value for branch probability notes and edge probabilities. constexpr int kProbBase = 10000; // The base value for BB frequency. -constexpr int kFreqBase = 100000; +constexpr uint64 kFreqBase = 100000; // Information about each branch predictor. struct PredictorInfo { diff --git a/src/mapleall/maple_me/include/pme_emit.h b/src/mapleall/maple_me/include/pme_emit.h index 40642c1757..895f1f1256 100644 --- a/src/mapleall/maple_me/include/pme_emit.h +++ b/src/mapleall/maple_me/include/pme_emit.h @@ -82,7 +82,7 @@ class PreMeEmitter : public AnalysisResult { MapleMap *GetPreMeExprExtensionMap() { return &preMeExprExtensionMap; } FuncProfInfo *GetFuncProfData() { return mirFunc->GetFuncProfData(); } void SetIpaInfo(CollectIpaInfo *info) { ipaInfo = info; } - void UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint32 frequency); + void UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint64 frequency); void UpdateStmtInfoForLabelNode(LabelNode &label, BB &bb); private: ArrayNode *ConvertToArray(BaseNode *x, TyIdx ptrTyIdx); diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index fd287332f5..995d8a61d6 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -482,11 +482,11 @@ void BB::DumpMePhiList(const IRMap *irMap) { void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { int len = GetSucc().size(); ASSERT(len == GetSuccFreq().size(), "sanity check"); - int64_t succFreqs = 0; + uint64 succFreqs = 0; for (int i = 0; i < len; i++) { succFreqs += GetSuccFreq()[i]; } - int diff = static_cast(abs(succFreqs - GetFrequency())); + uint64 diff = abs(succFreqs - GetFrequency()); if (len == 0 || (len == 1 && diff == 0) || (len > 1 && diff <= 1)) { @@ -502,7 +502,7 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { int64_t diffFreq = scalefreq - sfreq; int64_t succBBnewFreq = succBBLoc->GetFrequency() + diffFreq; if (succBBnewFreq >= 0) { - succBBLoc->SetFrequency(static_cast(succBBnewFreq)); + succBBLoc->SetFrequency(succBBnewFreq); } } } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index c20ee03498..ee3ab4d0fd 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -254,8 +254,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); ASSERT(bb.GetFrequency() >= succ0Freq, "sanity check"); - bb.GetSucc(0)->SetFrequency(static_cast(bb.GetSucc(0)->GetFrequency() + - (bb.GetFrequency() - succ0Freq))); + bb.GetSucc(0)->SetFrequency(bb.GetSucc(0)->GetFrequency() + (bb.GetFrequency() - succ0Freq)); } } // A ivar contained in stmt @@ -317,7 +316,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { if (UpdateFreq()) { bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); - bb.GetSucc(0)->SetFrequency(static_cast(bb.GetSucc(0)->GetFrequency() + removedFreq)); + bb.GetSucc(0)->SetFrequency(bb.GetSucc(0)->GetFrequency() + removedFreq); } } else { DetermineUseCounts(condbr->GetOpnd()); diff --git a/src/mapleall/maple_me/src/me_bb_analyze.cpp b/src/mapleall/maple_me/src/me_bb_analyze.cpp index bd34586662..2909ee682b 100644 --- a/src/mapleall/maple_me/src/me_bb_analyze.cpp +++ b/src/mapleall/maple_me/src/me_bb_analyze.cpp @@ -16,7 +16,7 @@ namespace maple { void BBAnalyze::SetHotAndColdBBCountThreshold() { - std::vector times; + std::vector times; auto eIt = cfg->valid_end(); for (auto bIt = cfg->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; diff --git a/src/mapleall/maple_me/src/me_bb_layout.cpp b/src/mapleall/maple_me/src/me_bb_layout.cpp index ceafc3e6b0..49a42897bd 100644 --- a/src/mapleall/maple_me/src/me_bb_layout.cpp +++ b/src/mapleall/maple_me/src/me_bb_layout.cpp @@ -206,15 +206,15 @@ bool BBLayout::HasBetterLayoutPred(const BB &bb, BB &succ) { if (predList.size() <= 1) { return false; } - uint32 sumEdgeFreq = succ.GetFrequency(); + uint64 sumEdgeFreq = succ.GetFrequency(); const double hotEdgeFreqPercent = 0.8; // should further fine tuning - uint32 hotEdgeFreq = static_cast(sumEdgeFreq * hotEdgeFreqPercent); + uint64 hotEdgeFreq = static_cast(sumEdgeFreq * hotEdgeFreqPercent); // if edge freq(bb->succ) contribute more than 80% to succ block freq, no better layout pred than bb for (uint32 i = 0; i < predList.size(); ++i) { if (predList[i] == &bb) { continue; } - uint32 edgeFreq = static_cast(predList[i]->GetEdgeFreq(&succ)); + uint64 edgeFreq = predList[i]->GetEdgeFreq(&succ); if (edgeFreq > (sumEdgeFreq - hotEdgeFreq)) { return true; } @@ -258,7 +258,7 @@ BB *BBLayout::GetBestSucc(BB &bb, const BBChain &chain, const MapleVector } // (2) search in readyToLayoutChains - uint32 bestFreq = 0; + uint64 bestFreq = 0; for (auto it = readyToLayoutChains.begin(); it != readyToLayoutChains.end(); ++it) { BBChain *readyChain = *it; BB *header = readyChain->GetHeader(); diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index 3aae6c2514..412713ee3a 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -95,19 +95,19 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (splitList.size() == 1) { // quick split auto *pred = splitList[0]; - auto index = pred->GetSuccIndex(*splittedBB); + int index = pred->GetSuccIndex(*splittedBB); // add frequency to mergedBB if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); uint64_t freq = pred->GetEdgeFreq(static_cast(idx)); - mergedBB->SetFrequency(static_cast(freq)); + mergedBB->SetFrequency(freq); mergedBB->PushBackSuccFreq(freq); } splittedBB->ReplacePred(pred, mergedBB); - pred->AddSucc(*mergedBB, static_cast(static_cast(index))); + pred->AddSucc(*mergedBB, index); if (updateFreqs) { - pred->AddSuccFreq(mergedBB->GetFrequency(), static_cast(static_cast(index))); + pred->AddSuccFreq(mergedBB->GetFrequency(), index); } if (!pred->GetMeStmts().empty()) { UpdateTheOffsetOfStmtWhenTargetBBIsChange(*pred, *splittedBB, *mergedBB); @@ -134,8 +134,8 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); - freq = pred->GetEdgeFreq(static_cast(idx)); - mergedBB->SetFrequency(static_cast(mergedBB->GetFrequency() + freq)); + freq = pred->GetEdgeFreq(idx); + mergedBB->SetFrequency(mergedBB->GetFrequency() + freq); } pred->ReplaceSucc(splittedBB, mergedBB); if (updateFreqs) { @@ -277,7 +277,7 @@ void MeLoopCanon::InsertExitBB(LoopDesc &loop) { curBB->ReplaceSucc(succ, newExitBB); succ->AddPred(*newExitBB, pos); if (updateFreqs) { - newExitBB->SetFrequency(static_cast(freq)); + newExitBB->SetFrequency(freq); newExitBB->PushBackSuccFreq(freq); } if (!curBB->GetMeStmts().empty()) { diff --git a/src/mapleall/maple_me/src/me_loop_unrolling.cpp b/src/mapleall/maple_me/src/me_loop_unrolling.cpp index 11ef561b38..5e39fd56c1 100644 --- a/src/mapleall/maple_me/src/me_loop_unrolling.cpp +++ b/src/mapleall/maple_me/src/me_loop_unrolling.cpp @@ -309,11 +309,11 @@ void LoopUnrolling::CopyLoopBody(BB &newHeadBB, std::unordered_map &ol // Update frequency of old BB. void LoopUnrolling::ResetFrequency(BB &bb) { - auto freq = bb.GetFrequency() / replicatedLoopNum; + uint64 freq = bb.GetFrequency() / replicatedLoopNum; if ((!instrumentProf) && freq == 0 && partialCount == 0 && bb.GetFrequency() != 0) { freq = 1; } - bb.SetFrequency(static_cast(freq + partialCount)); + bb.SetFrequency(freq + partialCount); for (size_t i = 0; i < bb.GetSucc().size(); ++i) { auto currFreq = bb.GetEdgeFreq(i) / replicatedLoopNum; if ((!instrumentProf) && currFreq == 0 && partialCount == 0 && bb.GetFrequency() != 0) { @@ -328,17 +328,17 @@ void LoopUnrolling::ResetFrequency() { auto exitBB = cfg->GetBBFromID(loop->inloopBB2exitBBs.begin()->first); auto latchBB = loop->latch; if (isUnrollWithVar) { - auto latchFreq = loop->head->GetFrequency() % replicatedLoopNum - loop->preheader->GetFrequency(); - exitBB->SetFrequency(static_cast(loop->head->GetFrequency() % replicatedLoopNum - latchFreq)); + uint64 latchFreq = loop->head->GetFrequency() % replicatedLoopNum - loop->preheader->GetFrequency(); + exitBB->SetFrequency(loop->head->GetFrequency() % replicatedLoopNum - latchFreq); exitBB->SetEdgeFreq(latchBB, latchFreq); - latchBB->SetFrequency(static_cast(latchFreq)); + latchBB->SetFrequency(latchFreq); latchBB->SetEdgeFreq(loop->head, latchFreq); } else { - auto exitFreq = exitBB->GetFrequency() / replicatedLoopNum; + uint64 exitFreq = exitBB->GetFrequency() / replicatedLoopNum; if (exitFreq == 0 && exitBB->GetFrequency() != 0) { exitFreq = 1; } - exitBB->SetFrequency(static_cast(exitFreq)); + exitBB->SetFrequency(exitFreq); auto exitEdgeFreq = exitBB->GetEdgeFreq(latchBB) / replicatedLoopNum; if (exitEdgeFreq == 0 && exitBB->GetEdgeFreq(latchBB) != 0) { exitEdgeFreq = 1; @@ -348,7 +348,7 @@ void LoopUnrolling::ResetFrequency() { if (latchFreq == 0 && latchBB->GetFrequency() != 0) { latchFreq = 1; } - latchBB->SetFrequency(static_cast(latchFreq)); + latchBB->SetFrequency(latchFreq); latchBB->SetEdgeFreq(loop->head, latchFreq); } } @@ -532,7 +532,7 @@ LoopUnrolling::ReturnKindOfFullyUnroll LoopUnrolling::LoopFullyUnroll(int64 trip return kCanFullyUnroll; } -void LoopUnrolling::ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint32 headFreq) { +void LoopUnrolling::ResetFrequency(BB &newCondGotoBB, BB &exitingBB, const BB &exitedBB, uint64 headFreq) { if (profValid) { newCondGotoBB.SetFrequency(headFreq); exitingBB.SetEdgeFreq(&exitedBB, 0); @@ -544,7 +544,7 @@ void LoopUnrolling::InsertCondGotoBB() { BB *exitingBB = cfg->GetBBFromID(loop->inloopBB2exitBBs.begin()->first); BB *exitedBB = *(loop->inloopBB2exitBBs.cbegin()->second->cbegin()); BB *newCondGotoBB = CopyBB(*exitingBB, true); - auto headFreq = loop->head->GetFrequency(); + uint64 headFreq = loop->head->GetFrequency(); ResetFrequency(*newCondGotoBB, *exitingBB, *exitedBB, headFreq); MeStmt *lastMeStmt = newCondGotoBB->GetLastMe(); CHECK_FATAL(lastMeStmt != nullptr, "last meStmt must not be nullptr"); @@ -642,7 +642,7 @@ void LoopUnrolling::AddPreHeader(BB *oldPreHeader, BB *head) { head->AddPred(*preheader, index); if (profValid) { preheader->PushBackSuccFreq(preheaderFreq); - preheader->SetFrequency(static_cast(preheaderFreq)); + preheader->SetFrequency(preheaderFreq); } CondGotoMeStmt *condGotoStmt = static_cast(oldPreHeader->GetLastMe()); LabelIdx oldlabIdx = condGotoStmt->GetOffset(); @@ -818,8 +818,7 @@ void LoopUnrolling::CopyLoopForPartial(BB &partialCondGoto, BB &exitedBB, BB &ex partialCondGoto.AddSucc(*partialHead); if (profValid) { partialCondGoto.PushBackSuccFreq(loop->head->GetFrequency() % replicatedLoopNum); - partialCondGoto.SetFrequency( - static_cast(partialCondGoto.GetEdgeFreq(static_cast(0)) + partialCondGoto.GetEdgeFreq(1))); + partialCondGoto.SetFrequency(partialCondGoto.GetEdgeFreq(static_cast(0)) + partialCondGoto.GetEdgeFreq(1)); } CHECK_FATAL(partialCondGoto.GetKind() == kBBCondGoto, "must be partialCondGoto"); CHECK_FATAL(!partialCondGoto.GetMeStmts().empty(), "must not be empty"); diff --git a/src/mapleall/maple_me/src/me_predict.cpp b/src/mapleall/maple_me/src/me_predict.cpp index 80f6db36e0..df8efa1da4 100644 --- a/src/mapleall/maple_me/src/me_predict.cpp +++ b/src/mapleall/maple_me/src/me_predict.cpp @@ -735,7 +735,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) return false; } } - uint32 freq = 0; + uint64 freq = 0; double cyclicProb = 0; for (BB *pred : bb.GetPred()) { Edge *edge = FindEdge(*pred, bb); @@ -750,7 +750,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) cyclicProb = 1 - std::numeric_limits::epsilon(); } // Floating-point numbers have precision problems, consider using integers to represent backEdgeProb? - bb.SetFrequency(static_cast(freq / (1 - cyclicProb))); + bb.SetFrequency(freq / (1 - cyclicProb)); } // 2. calculate frequencies of bb's out edges if (predictDebug) { @@ -758,7 +758,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) } bbVisited[bb.GetBBId()] = true; uint32 tmp = 0; - uint32 total = 0; + uint64 total = 0; Edge *bestEdge = nullptr; for (size_t i = 0; i < bb.GetSucc().size(); ++i) { Edge *edge = FindEdge(bb, *bb.GetSucc(i)); diff --git a/src/mapleall/maple_me/src/me_profile_use.cpp b/src/mapleall/maple_me/src/me_profile_use.cpp index 195eb16512..d43fa03e73 100644 --- a/src/mapleall/maple_me/src/me_profile_use.cpp +++ b/src/mapleall/maple_me/src/me_profile_use.cpp @@ -244,7 +244,7 @@ void MeProfUse::SetFuncEdgeInfo() { for (auto bIt = cfg->valid_begin(); bIt != eIt; ++bIt) { auto *bb = *bIt; auto *bbInfo = GetBBUseInfo(*bb); - bb->SetFrequency(static_cast(bbInfo->GetCount())); + bb->SetFrequency(bbInfo->GetCount()); if (bIt == cfg->common_entry() || bIt == cfg->common_exit()) { continue; } diff --git a/src/mapleall/maple_me/src/me_value_range_prop.cpp b/src/mapleall/maple_me/src/me_value_range_prop.cpp index 67448df356..07de0b43eb 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3240,7 +3240,7 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB bb.SetKind(kBBFallthru); if (func.GetCfg()->UpdateCFGFreq()) { bb.SetSuccFreq(0, bb.GetFrequency()); - succBB.SetFrequency(static_cast(succBB.GetFrequency() + removedFreq)); + succBB.SetFrequency(succBB.GetFrequency() + removedFreq); unreachableBB.SetFrequency(0); } auto *loop = loops->GetBBLoopParent(bb.GetBBId()); @@ -3625,7 +3625,7 @@ void ValueRangePropagation::RemoveUnreachableBB( if (func.GetCfg()->UpdateCFGFreq()) { int64_t removedFreq = static_cast(condGotoBB.GetSuccFreq()[1]); condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ0->SetFrequency(static_cast(succ0->GetFrequency() + removedFreq)); + succ0->SetFrequency(succ0->GetFrequency() + removedFreq); } condGotoBB.RemoveSucc(*succ1); DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ1, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3647,7 +3647,7 @@ void ValueRangePropagation::RemoveUnreachableBB( condGotoBB.RemoveSucc(*succ0); if (func.GetCfg()->UpdateCFGFreq()) { condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ1->SetFrequency(static_cast(succ1->GetFrequency() + removedFreq)); + succ1->SetFrequency(succ1->GetFrequency() + removedFreq); } DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ0, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); condGotoBB.RemoveMeStmt(condGotoBB.GetLastMe()); @@ -3815,11 +3815,11 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - exitCopyFallthru->SetFrequency(static_cast(exitCopyFallthru->GetFrequency() + edgeFreq)); + exitCopyFallthru->SetFrequency(exitCopyFallthru->GetFrequency() + edgeFreq); pred.AddSuccFreq(static_cast(edgeFreq), index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); } return true; @@ -3862,12 +3862,12 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( pred.RemoveSucc(bb); pred.AddSucc(*mergeAllFallthruBBs, index); if (func.GetCfg()->UpdateCFGFreq()) { - mergeAllFallthruBBs->SetFrequency(static_cast(edgeFreq)); + mergeAllFallthruBBs->SetFrequency(edgeFreq); mergeAllFallthruBBs->PushBackSuccFreq(static_cast(edgeFreq)); pred.AddSuccFreq(static_cast(edgeFreq), index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); } mergeAllFallthruBBs->AddSucc(trueBranch); @@ -3948,7 +3948,7 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(trueBranch, index); CreateLabelForTargetBB(pred, trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); // transform may not be consistent with frequency value @@ -3971,8 +3971,8 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); - exitCopyFallthru->SetFrequency(static_cast(edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); + exitCopyFallthru->SetFrequency(edgeFreq); exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); int64_t updatedtrueFreq = static_cast( @@ -4003,9 +4003,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*newBB, index); newBB->AddSucc(trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); - newBB->SetFrequency(static_cast(edgeFreq)); + newBB->SetFrequency(static_cast(edgeFreq)); newBB->PushBackSuccFreq(static_cast(edgeFreq)); pred.AddSuccFreq(static_cast(edgeFreq), index); } diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index 051b59542a..28178d1c66 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1831,7 +1831,7 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { if (cfg->UpdateCFGFreq()) { succ.SetSuccFreq(0, succ.GetFrequency()); auto *succofSucc = succ.GetSucc(0); - succofSucc->SetFrequency(static_cast(succofSucc->GetFrequency() + deletedSuccFreq)); + succofSucc->SetFrequency(succofSucc->GetFrequency() + deletedSuccFreq); } DEBUG_LOG() << "Remove succ BB" << LOG_BBID(rmBB) << " of pred BB" << LOG_BBID(&succ) << "\n"; return true; @@ -1886,12 +1886,12 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { if (cfg->UpdateCFGFreq()) { int idx = pred.GetSuccIndex(*newBB); ASSERT(idx >= 0 && idx < pred.GetSucc().size(), "sanity check"); - uint64_t freq = pred.GetEdgeFreq(idx); + uint64 freq = pred.GetEdgeFreq(idx); newBB->SetFrequency(freq); newBB->PushBackSuccFreq(freq); // update frequency of succ because one of its pred is removed // frequency of - uint32_t freqOfSucc = succ.GetFrequency(); + uint64 freqOfSucc = succ.GetFrequency(); ASSERT(freqOfSucc >= freq, "sanity check"); succ.SetFrequency(freqOfSucc - freq); // update edge frequency @@ -2100,9 +2100,9 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { needUpdatePhi = true; } if (cfg->UpdateCFGFreq()) { - int64_t succFreq = succ->GetFrequency(); + uint64 succFreq = succ->GetFrequency(); ASSERT(succFreq >= removedFreq, "sanity check"); - succ->SetFrequency(static_cast(succFreq - removedFreq)); + succ->SetFrequency(succFreq - removedFreq); succ->SetSuccFreq(0, succ->GetFrequency()); } DEBUG_LOG() << "Merge Uncond BB" << LOG_BBID(succ) << " to its pred BB" << LOG_BBID(pred) << ": BB" << LOG_BBID(pred) diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 4f3f8c4b74..31d26620ff 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -767,7 +767,7 @@ void PreMeEmitter::UpdateStmtInfoForLabelNode(LabelNode &label, BB &bb) { label.SetStmtInfoId(ipaInfo->GetRealFirstStmtInfoId(bb)); } -void PreMeEmitter::UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint32 frequency) { +void PreMeEmitter::UpdateStmtInfo(const MeStmt &meStmt, StmtNode &stmt, BlockNode &currBlock, uint64 frequency) { if (ipaInfo == nullptr || meStmt.GetStmtInfoId() == kInvalidIndex) { return; } -- Gitee From 6b919072ee0f8c96a6195b91b32f6c5fd8b5f685 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 6 Sep 2022 14:01:19 -0700 Subject: [PATCH 08/10] Fix bug introduced by last commit --- src/mapleall/maple_me/src/me_predict.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapleall/maple_me/src/me_predict.cpp b/src/mapleall/maple_me/src/me_predict.cpp index df8efa1da4..acbe0c74ad 100644 --- a/src/mapleall/maple_me/src/me_predict.cpp +++ b/src/mapleall/maple_me/src/me_predict.cpp @@ -750,7 +750,7 @@ bool MePrediction::DoPropFreq(const BB *head, std::vector *headers, BB &bb) cyclicProb = 1 - std::numeric_limits::epsilon(); } // Floating-point numbers have precision problems, consider using integers to represent backEdgeProb? - bb.SetFrequency(freq / (1 - cyclicProb)); + bb.SetFrequency(static_cast(static_cast(freq / (1 - cyclicProb)))); } // 2. calculate frequencies of bb's out edges if (predictDebug) { -- Gitee From 21c57f8fb3f2f9de5af9cc2047dd622547920730 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 6 Sep 2022 15:32:55 -0700 Subject: [PATCH 09/10] Fix more type compatibility issues Make maple parser accept switch statement's default label being 0 --- .../maple_ipa/include/stmt_identify.h | 6 +-- src/mapleall/maple_ir/src/mir_parser.cpp | 2 + src/mapleall/maple_me/include/me_function.h | 6 +-- src/mapleall/maple_me/src/bb.cpp | 12 ++--- src/mapleall/maple_me/src/hdse.cpp | 4 +- src/mapleall/maple_me/src/me_loop_canon.cpp | 6 +-- .../maple_me/src/me_value_range_prop.cpp | 53 +++++++++---------- src/mapleall/maple_me/src/optimizeCFG.cpp | 10 ++-- src/mapleall/maple_me/src/pme_emit.cpp | 8 +-- 9 files changed, 54 insertions(+), 53 deletions(-) diff --git a/src/mapleall/maple_ipa/include/stmt_identify.h b/src/mapleall/maple_ipa/include/stmt_identify.h index 7239add8f3..b8561c6643 100644 --- a/src/mapleall/maple_ipa/include/stmt_identify.h +++ b/src/mapleall/maple_ipa/include/stmt_identify.h @@ -177,11 +177,11 @@ class StmtInfo { return puIdx; } - const uint32 GetFrequency() const { + const uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 freq) { + void SetFrequency(uint64 freq) { frequency = freq; } @@ -214,7 +214,7 @@ class StmtInfo { BlockNode *currBlock = nullptr; MeStmt *meStmt = nullptr; PUIdx puIdx = kInvalidPuIdx; - uint32 frequency = 0; + uint64 frequency = 0; bool valid = true; std::vector hashCandidate; std::unordered_map symbolDefUse; diff --git a/src/mapleall/maple_ir/src/mir_parser.cpp b/src/mapleall/maple_ir/src/mir_parser.cpp index d425dad181..a422fccbb0 100644 --- a/src/mapleall/maple_ir/src/mir_parser.cpp +++ b/src/mapleall/maple_ir/src/mir_parser.cpp @@ -610,6 +610,8 @@ bool MIRParser::ParseStmtSwitch(StmtNodePtr &stmt) { } if (lexer.NextToken() == TK_label) { switchNode->SetDefaultLabel(mod.CurFunction()->GetOrCreateLableIdxFromName(lexer.GetName())); + } else if (lexer.GetTokenKind() == TK_intconst && lexer.GetTheIntVal() == 0) { + switchNode->SetDefaultLabel(0); } else { Error("expect label in switch but get "); return false; diff --git a/src/mapleall/maple_me/include/me_function.h b/src/mapleall/maple_me/include/me_function.h index ab1f8d8533..33169261da 100644 --- a/src/mapleall/maple_me/include/me_function.h +++ b/src/mapleall/maple_me/include/me_function.h @@ -302,11 +302,11 @@ class MeFunction : public FuncEmit { profValid = val; } - uint32 GetFrequency() const { + uint64 GetFrequency() const { return frequency; } - void SetFrequency(uint32 f) { + void SetFrequency(uint64 f) { frequency = f; } @@ -399,7 +399,7 @@ class MeFunction : public FuncEmit { bool hasWriteInputAsmNode = false; /* set when ssa tab build */ bool profValid = false; IRProfileDesc *profileDesc = nullptr; - uint32 frequency = 0; + uint64 frequency = 0; // lfo bool isLfo = false; // during pme processing diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index 995d8a61d6..11e837b388 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -492,17 +492,17 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { (len > 1 && diff <= 1)) { return; } - for (uint32 i = 0; i < len; ++i) { - int64_t sfreq = GetSuccFreq()[static_cast(i)]; - int64_t scalefreq = (succFreqs == 0 ? (frequency / len) : (sfreq * frequency / succFreqs)); - SetSuccFreq(static_cast(i), scalefreq); + for (int i = 0; i < len; ++i) { + uint64 sfreq = GetSuccFreq()[i]; + uint64 scalefreq = (succFreqs == 0 ? (frequency / len) : (sfreq * frequency / succFreqs)); + SetSuccFreq(i, scalefreq); // update succ frequency with new difference if needed if (updateBBFreqOfSucc) { - auto *succBBLoc = GetSucc(static_cast(i)); + auto *succBBLoc = GetSucc(i); int64_t diffFreq = scalefreq - sfreq; int64_t succBBnewFreq = succBBLoc->GetFrequency() + diffFreq; if (succBBnewFreq >= 0) { - succBBLoc->SetFrequency(succBBnewFreq); + succBBLoc->SetFrequency(static_cast(succBBnewFreq)); } } } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index ee3ab4d0fd..312c6e2ced 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -250,7 +250,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { } bb.SetKind(kBBFallthru); if (UpdateFreq()) { - int64_t succ0Freq = static_cast(bb.GetSuccFreq()[0]); + uint64 succ0Freq = static_cast(bb.GetSuccFreq()[0]); bb.GetSuccFreq().resize(1); bb.SetSuccFreq(0, bb.GetFrequency()); ASSERT(bb.GetFrequency() >= succ0Freq, "sanity check"); @@ -280,7 +280,7 @@ void HDSE::RemoveNotRequiredStmtsInBB(BB &bb) { bool isPme = mirModule.CurFunction()->GetMeFunc()->GetPreMeFunc() != nullptr; if (mestmt->IsCondBr() && !isPme) { // see if foldable to unconditional branch CondGotoMeStmt *condbr = static_cast(mestmt); - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (!mirModule.IsJavaModule() && condbr->GetOpnd()->GetMeOp() == kMeOpConst) { CHECK_FATAL(IsPrimitiveInteger(condbr->GetOpnd()->GetPrimType()), "MeHDSE::DseProcess: branch condition must be integer type"); diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index 412713ee3a..4edad67654 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -105,9 +105,9 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, mergedBB->PushBackSuccFreq(freq); } splittedBB->ReplacePred(pred, mergedBB); - pred->AddSucc(*mergedBB, index); + pred->AddSucc(*mergedBB, static_cast(index)); if (updateFreqs) { - pred->AddSuccFreq(mergedBB->GetFrequency(), index); + pred->AddSuccFreq(mergedBB->GetFrequency(), static_cast(index)); } if (!pred->GetMeStmts().empty()) { UpdateTheOffsetOfStmtWhenTargetBBIsChange(*pred, *splittedBB, *mergedBB); @@ -134,7 +134,7 @@ void MeLoopCanon::SplitPreds(const std::vector &splitList, BB *splittedBB, if (updateFreqs) { int idx = pred->GetSuccIndex(*splittedBB); ASSERT(idx >= 0 && idx < pred->GetSucc().size(), "sanity check"); - freq = pred->GetEdgeFreq(idx); + freq = pred->GetEdgeFreq(static_cast(idx)); mergedBB->SetFrequency(mergedBB->GetFrequency() + freq); } pred->ReplaceSucc(splittedBB, mergedBB); diff --git a/src/mapleall/maple_me/src/me_value_range_prop.cpp b/src/mapleall/maple_me/src/me_value_range_prop.cpp index 07de0b43eb..2f5dffcaaf 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3230,10 +3230,10 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB } Insert2UnreachableBBs(unreachableBB); // update frequency before cfg changed - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { int idx = bb.GetSuccIndex(unreachableBB); - removedFreq = static_cast(bb.GetSuccFreq()[static_cast(idx)]); + removedFreq = bb.GetSuccFreq()[static_cast(idx)]; } bb.RemoveSucc(unreachableBB); bb.RemoveMeStmt(bb.GetLastMe()); @@ -3623,7 +3623,7 @@ void ValueRangePropagation::RemoveUnreachableBB( condGotoBB.SetKind(kBBFallthru); // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - int64_t removedFreq = static_cast(condGotoBB.GetSuccFreq()[1]); + uint64 removedFreq = condGotoBB.GetSuccFreq()[1]; condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); succ0->SetFrequency(succ0->GetFrequency() + removedFreq); } @@ -3639,10 +3639,10 @@ void ValueRangePropagation::RemoveUnreachableBB( UpdateProfile(*condGotoBB.GetPred(0), condGotoBB, trueBranch); } condGotoBB.SetKind(kBBFallthru); - int64_t removedFreq = 0; + uint64 removedFreq = 0; // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - removedFreq = static_cast(condGotoBB.GetSuccFreq()[0]); + removedFreq = condGotoBB.GetSuccFreq()[0]; } condGotoBB.RemoveSucc(*succ0); if (func.GetCfg()->UpdateCFGFreq()) { @@ -3806,9 +3806,9 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( if (exitCopyFallthru != nullptr) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; } pred.RemoveSucc(bb); DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3816,7 +3816,7 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { exitCopyFallthru->SetFrequency(exitCopyFallthru->GetFrequency() + edgeFreq); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); bb.SetFrequency(bb.GetFrequency() - edgeFreq); @@ -3855,16 +3855,16 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( mergeAllFallthruBBs->AddMeStmtLast(gotoMeStmt); PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; } pred.RemoveSucc(bb); pred.AddSucc(*mergeAllFallthruBBs, index); if (func.GetCfg()->UpdateCFGFreq()) { mergeAllFallthruBBs->SetFrequency(edgeFreq); - mergeAllFallthruBBs->PushBackSuccFreq(static_cast(edgeFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + mergeAllFallthruBBs->PushBackSuccFreq(edgeFreq); + pred.AddSuccFreq(edgeFreq, index); // update bb frequency ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); bb.SetFrequency(bb.GetFrequency() - edgeFreq); @@ -3938,9 +3938,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (OnlyHaveCondGotoStmt(bb)) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -3950,20 +3950,20 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); // transform may not be consistent with frequency value updatedtrueFreq = updatedtrueFreq > 0 ? updatedtrueFreq : 0; bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); } } else { auto *exitCopyFallthru = GetNewCopyFallthruBB(trueBranch, bb); if (exitCopyFallthru != nullptr) { PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -3973,13 +3973,12 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); exitCopyFallthru->SetFrequency(edgeFreq); - exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); + exitCopyFallthru->PushBackSuccFreq(edgeFreq); size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast( - bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); ASSERT(updatedtrueFreq >= 0, "sanity check"); bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + pred.AddSuccFreq(edgeFreq, index); } return true; } @@ -3994,9 +3993,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( newBB->AddMeStmtLast(gotoMeStmt); PrepareForSSAUpdateWhenPredBBIsRemoved(pred, bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); size_t index = FindBBInSuccs(pred, bb); - int64_t edgeFreq = 0; + uint64 edgeFreq = 0; if (func.GetCfg()->UpdateCFGFreq()) { - edgeFreq = static_cast(pred.GetSuccFreq()[index]); + edgeFreq = pred.GetSuccFreq()[index]; ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); } pred.RemoveSucc(bb); @@ -4005,9 +4004,9 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( if (func.GetCfg()->UpdateCFGFreq()) { bb.SetFrequency(bb.GetFrequency() - edgeFreq); bb.UpdateEdgeFreqs(); - newBB->SetFrequency(static_cast(edgeFreq)); - newBB->PushBackSuccFreq(static_cast(edgeFreq)); - pred.AddSuccFreq(static_cast(edgeFreq), index); + newBB->SetFrequency(edgeFreq); + newBB->PushBackSuccFreq(edgeFreq); + pred.AddSuccFreq(edgeFreq, index); } DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); (void)func.GetOrCreateBBLabel(trueBranch); diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index 28178d1c66..79b0ba7d01 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1822,10 +1822,10 @@ bool OptimizeBB::SkipRedundantCond(BB &pred, BB &succ) { DEBUG_LOG() << "SkipRedundantCond : Remove condBr in BB" << LOG_BBID(&succ) << ", turn it to fallthruBB\n"; } BB *rmBB = (FindFirstRealSucc(succ.GetSucc(0)) == newTarget) ? succ.GetSucc(1) : succ.GetSucc(0); - int64_t deletedSuccFreq = 0; + uint64 deletedSuccFreq = 0; if (cfg->UpdateCFGFreq()) { int idx = succ.GetSuccIndex(*rmBB); - deletedSuccFreq = static_cast(succ.GetSuccFreq()[static_cast(idx)]); + deletedSuccFreq = succ.GetSuccFreq()[static_cast(idx)]; } succ.RemoveSucc(*rmBB, true); if (cfg->UpdateCFGFreq()) { @@ -2084,16 +2084,16 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { } int predIdx = succ->GetPredIndex(*pred); bool needUpdatePhi = false; - int64_t removedFreq = 0; + uint64 removedFreq = 0; if (cfg->UpdateCFGFreq()) { int idx = pred->GetSuccIndex(*succ); - removedFreq = static_cast(pred->GetSuccFreq()[static_cast(idx)]); + removedFreq = pred->GetSuccFreq()[static_cast(idx)]; } if (pred->IsPredBB(*newTarget)) { pred->RemoveSucc(*succ, true); // one of pred's succ has been newTarget, avoid duplicate succ here if (cfg->UpdateCFGFreq()) { int idx = pred->GetSuccIndex(*newTarget); - pred->SetSuccFreq(idx, pred->GetSuccFreq()[static_cast(idx)] + static_cast(removedFreq)); + pred->SetSuccFreq(idx, pred->GetSuccFreq()[static_cast(idx)] + removedFreq); } } else { pred->ReplaceSucc(succ, newTarget); // phi opnd is not removed from currBB's philist, we will remove it later diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 31d26620ff..56dbc5b764 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -1066,10 +1066,10 @@ uint32 PreMeEmitter::Raise2PreMeIf(uint32 curJ, BlockNode *curBlk) { CHECK_FATAL(j < bbvec.size(), ""); if (GetFuncProfData()) { // set then part/else part frequency - int64_t ifFreq = GetFuncProfData()->GetStmtFreq(ifStmtNode->GetStmtID()); - int64_t branchFreq = bbvec[curJ + 1]->GetFrequency(); - GetFuncProfData()->SetStmtFreq(branchBlock->GetStmtID(), static_cast(branchFreq)); - GetFuncProfData()->SetStmtFreq(emptyBlock->GetStmtID(), static_cast(ifFreq - branchFreq)); + uint64 ifFreq = GetFuncProfData()->GetStmtFreq(ifStmtNode->GetStmtID()); + uint64 branchFreq = bbvec[curJ + 1]->GetFrequency(); + GetFuncProfData()->SetStmtFreq(branchBlock->GetStmtID(), branchFreq); + GetFuncProfData()->SetStmtFreq(emptyBlock->GetStmtID(), ifFreq - branchFreq); } return j; } -- Gitee From bdda0b1a6517ba99bf802511b3474654342c178c Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 8 Sep 2022 12:04:44 -0700 Subject: [PATCH 10/10] fixed usage of abs() --- src/mapleall/maple_me/src/bb.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mapleall/maple_me/src/bb.cpp b/src/mapleall/maple_me/src/bb.cpp index 11e837b388..a2c038fc11 100644 --- a/src/mapleall/maple_me/src/bb.cpp +++ b/src/mapleall/maple_me/src/bb.cpp @@ -486,7 +486,8 @@ void BB::UpdateEdgeFreqs(bool updateBBFreqOfSucc) { for (int i = 0; i < len; i++) { succFreqs += GetSuccFreq()[i]; } - uint64 diff = abs(succFreqs - GetFrequency()); + int64 diff = succFreqs - GetFrequency(); + diff = abs(diff); if (len == 0 || (len == 1 && diff == 0) || (len > 1 && diff <= 1)) { -- Gitee