diff --git a/src/mapleall/maple_me/src/me_cfg.cpp b/src/mapleall/maple_me/src/me_cfg.cpp index b2e0986c397ecd7216bd07396753ab0076dabf3e..87320d4744f1530d16761944431f336d5a5c82de 100644 --- a/src/mapleall/maple_me/src/me_cfg.cpp +++ b/src/mapleall/maple_me/src/me_cfg.cpp @@ -1882,7 +1882,7 @@ inline void ConstructEdgeFreqForBBWith2Succs(BB &bb) { // special case: WontExitAnalysis() has pushed 0 to bb->succFreq bb.GetSuccFreq()[0] = bb.GetFrequency(); bb.PushBackSuccFreq(0); - } else if (bb.GetFrequency() >= succ1Freq) { // tolerate inaccuracy + } else if (bb.GetFrequency() <= succ1Freq) { // tolerate inaccuracy bb.PushBackSuccFreq(0); bb.PushBackSuccFreq(bb.GetFrequency()); } else { diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index a567e52090ba422da0a62f3f90042aa0f76662cd..cab8aab318d120a2597fc3c60a3e6b2329c67678 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -833,7 +833,9 @@ void PreMeEmitter::EmitBB(BB *bb, BlockNode *curBlk) { if (setLastFreq) { GetFuncProfData()->SetStmtFreq(curBlk->GetLast()->GetStmtID(), bb->GetFrequency()); } else if (bbIsEmpty) { - LogInfo::MapleLogger() << " bb " << bb->GetBBId() << ": no stmt used to add frequency; added comment node\n"; + if (!MeOption::quiet) { + LogInfo::MapleLogger() << " bb " << bb->GetBBId() << ": no stmt used to add frequency; added comment node\n"; + } CommentNode *commentNode = codeMP->New(*(mirFunc->GetModule())); commentNode->SetComment("freqStmt"+std::to_string(commentNode->GetStmtID())); GetFuncProfData()->SetStmtFreq(commentNode->GetStmtID(), bb->GetFrequency()); diff --git a/src/mapleall/maple_me/src/pme_mir_lower.cpp b/src/mapleall/maple_me/src/pme_mir_lower.cpp index c30a98121817e3df323d92c9dd4404b4b9e1cb30..a7f05476b665e35002e0a7fd589c82e14b74f32f 100644 --- a/src/mapleall/maple_me/src/pme_mir_lower.cpp +++ b/src/mapleall/maple_me/src/pme_mir_lower.cpp @@ -71,9 +71,11 @@ BlockNode *PreMeMIRLower::LowerWhileStmt(WhileStmtNode &whileStmt) { endlblstmt->SetSrcPos(pos); blk->AddStatement(endlblstmt); if (GetFuncProfData()) { + CHECK_FATAL(GetFuncProfData()->GetStmtFreq(whileStmt.GetStmtID()) >= + GetFuncProfData()->GetStmtFreq(whilegotonode->GetStmtID()), "inconsistent profiling on while stmt"); int64_t freq = GetFuncProfData()->GetStmtFreq(whileStmt.GetStmtID()) - GetFuncProfData()->GetStmtFreq(whilegotonode->GetStmtID()); - GetFuncProfData()->SetStmtFreq(endlblstmt->GetStmtID(), freq > 0 ? freq : 0); + GetFuncProfData()->SetStmtFreq(endlblstmt->GetStmtID(), freq); } return blk; } @@ -240,7 +242,15 @@ BlockNode *PreMeMIRLower::LowerIfStmt(IfStmtNode &ifstmt, bool recursive) { // set stmtfreqs if (GetFuncProfData()) { if (!thenempty) { - GetFuncProfData()->CopyStmtFreq(gotostmt->GetStmtID(), ifstmt.GetThenPart()->GetStmtID()); + if (ifstmt.GetThenPart()->GetLast()->IsCondBr()) { + // Estimate a freq within [0, ifstmt-freq] without going after further + uint64 ifFreq = GetFuncProfData()->GetStmtFreq(ifstmt.GetStmtID()); + uint64 ifElseFreq = GetFuncProfData()->GetStmtFreq(ifstmt.GetElsePart()->GetStmtID()); + uint64 freqDiff = (ifFreq >= ifElseFreq) ? (ifFreq - ifElseFreq) : 0; + GetFuncProfData()->SetStmtFreq(gotostmt->GetStmtID(), freqDiff); + } else { + GetFuncProfData()->CopyStmtFreq(gotostmt->GetStmtID(), ifstmt.GetThenPart()->GetStmtID()); + } } else { GetFuncProfData()->SetStmtFreq(gotostmt->GetStmtID(), 0); } @@ -252,7 +262,9 @@ BlockNode *PreMeMIRLower::LowerIfStmt(IfStmtNode &ifstmt, bool recursive) { SrcPosition pos = func->GetMirFunc()->GetScope()->GetScopeEndPos(ifstmt.GetThenPart()->GetSrcPos()); labstmt->SetSrcPos(pos); blk->AddStatement(labstmt); - + if (GetFuncProfData()) { + GetFuncProfData()->CopyStmtFreq(labstmt->GetStmtID(), ifstmt.GetElsePart()->GetStmtID()); + } if (!elseempty) { blk->AppendStatementsFromBlock(*ifstmt.GetElsePart()); }