diff --git a/src/mapleall/maple_ir/src/mir_nodes.cpp b/src/mapleall/maple_ir/src/mir_nodes.cpp index 7e12b75e3e3f4f68f5446963cf474ea98a61c282..cc1a665a4eb5c042f24a238b55fdeac753609d67 100644 --- a/src/mapleall/maple_ir/src/mir_nodes.cpp +++ b/src/mapleall/maple_ir/src/mir_nodes.cpp @@ -335,6 +335,7 @@ BlockNode *BlockNode::CloneTreeWithFreqs(MapleAllocator &allocator, } ASSERT(newStmt != nullptr, "null ptr check"); newStmt->SetSrcPos(stmt.GetSrcPos()); + newStmt->SetMeStmtID(stmt.GetMeStmtID()); newStmt->SetPrev(nullptr); newStmt->SetNext(nullptr); nnode->AddStatement(newStmt); diff --git a/src/mapleall/maple_me/src/me_cfg.cpp b/src/mapleall/maple_me/src/me_cfg.cpp index 533a5361233c5a6c75725bf4048c2ed90d8c6475..c7b55558dc23f854ce013269dd4bfec39cfc3ea0 100644 --- a/src/mapleall/maple_me/src/me_cfg.cpp +++ b/src/mapleall/maple_me/src/me_cfg.cpp @@ -2009,11 +2009,10 @@ int MeCFG::VerifyBBFreq(bool checkFatal) { } // check case 1: entry count is zero, internal bb has frequency value > 0 if (entryIsZero && bb->GetFrequency() > 0) { + LogInfo::MapleLogger() << func.GetName() << ": entry freq is 0 but freq of BB " << bb->GetBBId() << " is " << bb->GetFrequency() << std::endl; if (checkFatal) { - LogInfo::MapleLogger() << func.GetName() << "wrong BB " << bb->GetBBId() << std::endl; - CHECK_FATAL(false, "VerifyBBFreq: function entryFreq is zero but internal bb frequency > 0"); + CHECK_FATAL(false, "VerifyBBFreq: verification fails"); } else { - ClearFuncFreqInfo(); return 1; } } diff --git a/src/mapleall/maple_me/src/optimizeCFG.cpp b/src/mapleall/maple_me/src/optimizeCFG.cpp index 79b0ba7d01e3a2c167267b3c1343f8b770a3ef34..0526e05e0ca167b65baed5d5c88199197d890359 100644 --- a/src/mapleall/maple_me/src/optimizeCFG.cpp +++ b/src/mapleall/maple_me/src/optimizeCFG.cpp @@ -1570,7 +1570,16 @@ bool OptimizeBB::FoldCondBranch() { stmt1->SetBranchProb(stmt2->GetBranchProb()); succBB->RemoveLastMeStmt(); succBB->SetKind(kBBFallthru); - succBB->RemoveSucc(*succBB->GetSucc(1)); + if (cfg->UpdateCFGFreq()) { + uint64 freqToMove = succBB->GetSuccFreq()[1]; + currBB->SetSuccFreq(0, currBB->GetSuccFreq()[0] - freqToMove); + succBB->SetFrequency(succBB->GetFrequency() - freqToMove); + currBB->SetSuccFreq(1, currBB->GetSuccFreq()[1] + freqToMove); + currBB->GetSucc(1)->SetFrequency(currBB->GetSucc(1)->GetFrequency() + freqToMove); + } + BB *succOfSuccBB = succBB->GetSucc(1); + succBB->RemoveBBFromSucc(*succOfSuccBB); + succOfSuccBB->RemoveBBFromPred(*succBB, true); return true; } return false; @@ -2101,9 +2110,10 @@ bool OptimizeBB::MergeGotoBBToPred(BB *succ, BB *pred) { } if (cfg->UpdateCFGFreq()) { uint64 succFreq = succ->GetFrequency(); - ASSERT(succFreq >= removedFreq, "sanity check"); - succ->SetFrequency(succFreq - removedFreq); - succ->SetSuccFreq(0, succ->GetFrequency()); + if (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) << "->BB" << LOG_BBID(succ) << "(merged)->BB" << LOG_BBID(newTarget) << "\n"; @@ -2157,7 +2167,7 @@ bool OptimizeBB::OptimizeUncondBB() { // try to move pred from currBB to newTarget for (size_t i = 0; i < currBB->GetPred().size();) { BB *pred = currBB->GetPred(i); - if (pred == nullptr || pred->GetLastMe() == nullptr) { + if (pred == nullptr || pred->GetLastMe() == nullptr || pred->GetPred().empty()) { ++i; continue; } @@ -2659,11 +2669,8 @@ bool MEOptimizeCFG::PhaseRun(maple::MeFunction &f) { MeSSAUpdate ssaUpdate(f, *f.GetMeSSATab(), *dom, cands); ssaUpdate.Run(); } - if (f.GetCfg()->UpdateCFGFreq()) { - f.GetCfg()->UpdateEdgeFreqWithBBFreq(); - if (f.GetCfg()->DumpIRProfileFile()) { - f.GetCfg()->DumpToFile("after-OptimizeCFG", false, f.GetCfg()->UpdateCFGFreq()); - } + if (f.GetCfg()->DumpIRProfileFile()) { + f.GetCfg()->DumpToFile("after-OptimizeCFG", false, f.GetCfg()->UpdateCFGFreq()); } } return change;