diff --git a/src/mapleall/maple_me/src/me_cfg.cpp b/src/mapleall/maple_me/src/me_cfg.cpp index 533a5361233c5a6c75725bf4048c2ed90d8c6475..52957520ee9d9bd191c2b044f6e8d346d1b202ac 100644 --- a/src/mapleall/maple_me/src/me_cfg.cpp +++ b/src/mapleall/maple_me/src/me_cfg.cpp @@ -1588,6 +1588,24 @@ void MeCFG::CreateBasicBlocks() { curBB = newBB; break; } + case OP_call: { + CallNode *callStmt = static_cast(stmt); + MIRFunction *callee = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(callStmt->GetPUIdx()); + if (callee->GetFuncAttrs().GetAttr(FUNCATTR_noreturn)) { + if (curBB->IsEmpty()) { + curBB->SetFirst(stmt); + } + curBB->SetLast(stmt); + curBB->SetKindReturn(); + if (nextStmt != nullptr) { + BB *newBB = NewBasicBlock(); + curBB = newBB; + } + break; + } + // fall thru to handle as default + [[clang::fallthrough]]; + } default: { if (curBB->IsEmpty()) { curBB->SetFirst(stmt); diff --git a/src/mapleall/maple_me/src/me_hdse.cpp b/src/mapleall/maple_me/src/me_hdse.cpp index a12c440fb08ae5342a35bc624e6061a4da01ce65..bfd958c20b43dcf43624287433cd71187d0bef3c 100644 --- a/src/mapleall/maple_me/src/me_hdse.cpp +++ b/src/mapleall/maple_me/src/me_hdse.cpp @@ -202,7 +202,6 @@ bool MEHdse::PhaseRun(maple::MeFunction &f) { f.GetCfg()->WontExitAnalysis(); // update frequency if (hdse.UpdateFreq()) { - f.GetCfg()->UpdateEdgeFreqWithBBFreq(); if (f.GetCfg()->DumpIRProfileFile()) { f.GetCfg()->DumpToFile("after-HDSE" + std::to_string(f.hdseRuns), false, true); } diff --git a/src/mapleall/maple_me/src/me_loop_canon.cpp b/src/mapleall/maple_me/src/me_loop_canon.cpp index eb645a9f3235294427270027da5edacd8f8d94c4..a865a8babbb4c376e62bde9cbc861c0169d45507 100644 --- a/src/mapleall/maple_me/src/me_loop_canon.cpp +++ b/src/mapleall/maple_me/src/me_loop_canon.cpp @@ -295,7 +295,7 @@ void MeLoopCanon::NormalizationHeadAndPreHeaderOfLoop(Dominance &dom) { if (isDebugFunc) { LogInfo::MapleLogger() << "-----------------Dump mefunction before loop normalization----------\n"; func.Dump(true); - func.GetCfg()->DumpToFile("cfgbeforLoopNormalization"); + func.GetCfg()->DumpToFile("cfgbeforLoopNormalization", false, func.GetCfg()->UpdateCFGFreq()); } std::map> heads; isCFGChange = false; @@ -316,7 +316,7 @@ void MeLoopCanon::NormalizationExitOfLoop(IdentifyLoops &meLoop) { if (isDebugFunc) { LogInfo::MapleLogger() << "-----------------Dump mefunction after loop normalization-----------\n"; func.Dump(true); - func.GetCfg()->DumpToFile("cfgafterLoopNormalization"); + func.GetCfg()->DumpToFile("cfgafterLoopNormalization", false, func.GetCfg()->UpdateCFGFreq()); } } 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 2f5dffcaafa20ce52f167fa5f850041f0ecdd19e..9d958d0296ec59ed6161a23787b5e04ef45b8696 100644 --- a/src/mapleall/maple_me/src/me_value_range_prop.cpp +++ b/src/mapleall/maple_me/src/me_value_range_prop.cpp @@ -3238,11 +3238,6 @@ void ValueRangePropagation::AnalysisUnreachableBBOrEdge(BB &bb, BB &unreachableB bb.RemoveSucc(unreachableBB); bb.RemoveMeStmt(bb.GetLastMe()); bb.SetKind(kBBFallthru); - if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetSuccFreq(0, bb.GetFrequency()); - succBB.SetFrequency(succBB.GetFrequency() + removedFreq); - unreachableBB.SetFrequency(0); - } auto *loop = loops->GetBBLoopParent(bb.GetBBId()); if (loop == nullptr) { return; @@ -3621,12 +3616,6 @@ void ValueRangePropagation::RemoveUnreachableBB( UpdateProfile(*condGotoBB.GetPred(0), condGotoBB, trueBranch); } condGotoBB.SetKind(kBBFallthru); - // update frequency before cfg changed - if (func.GetCfg()->UpdateCFGFreq()) { - uint64 removedFreq = condGotoBB.GetSuccFreq()[1]; - condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ0->SetFrequency(succ0->GetFrequency() + removedFreq); - } condGotoBB.RemoveSucc(*succ1); DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ1, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); condGotoBB.RemoveMeStmt(condGotoBB.GetLastMe()); @@ -3639,16 +3628,10 @@ void ValueRangePropagation::RemoveUnreachableBB( UpdateProfile(*condGotoBB.GetPred(0), condGotoBB, trueBranch); } condGotoBB.SetKind(kBBFallthru); - uint64 removedFreq = 0; - // update frequency before cfg changed if (func.GetCfg()->UpdateCFGFreq()) { - removedFreq = condGotoBB.GetSuccFreq()[0]; + condGotoBB.SetSuccFreq(0, condGotoBB.GetSuccFreq()[1]); } condGotoBB.RemoveSucc(*succ0); - if (func.GetCfg()->UpdateCFGFreq()) { - condGotoBB.SetSuccFreq(0, condGotoBB.GetFrequency()); - succ1->SetFrequency(succ1->GetFrequency() + removedFreq); - } DeleteThePhiNodeWhichOnlyHasOneOpnd(*succ0, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); condGotoBB.RemoveMeStmt(condGotoBB.GetLastMe()); } @@ -3866,9 +3849,10 @@ bool ValueRangePropagation::ChangeTheSuccOfPred2TrueBranch( mergeAllFallthruBBs->PushBackSuccFreq(edgeFreq); pred.AddSuccFreq(edgeFreq, index); // update bb frequency - ASSERT(bb.GetFrequency() >= edgeFreq, "sanity check"); - bb.SetFrequency(bb.GetFrequency() - edgeFreq); - bb.UpdateEdgeFreqs(); + if (bb.GetFrequency() >= edgeFreq) { + bb.SetFrequency(bb.GetFrequency() - edgeFreq); + bb.UpdateEdgeFreqs(); + } } mergeAllFallthruBBs->AddSucc(trueBranch); DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); @@ -3948,13 +3932,15 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(trueBranch, index); CreateLabelForTargetBB(pred, trueBranch); 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] - edgeFreq); - // transform may not be consistent with frequency value - updatedtrueFreq = updatedtrueFreq > 0 ? updatedtrueFreq : 0; - bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(edgeFreq, index); + if ((static_cast(bb.GetFrequency()) - edgeFreq) > 0) { + bb.SetFrequency(static_cast(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 + updatedtrueFreq = updatedtrueFreq > 0 ? updatedtrueFreq : 0; + bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); + } + pred.AddSuccFreq(static_cast(edgeFreq), index); } } else { auto *exitCopyFallthru = GetNewCopyFallthruBB(trueBranch, bb); @@ -3971,14 +3957,17 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*exitCopyFallthru, index); CreateLabelForTargetBB(pred, *exitCopyFallthru); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(bb.GetFrequency() - edgeFreq); - exitCopyFallthru->SetFrequency(edgeFreq); - exitCopyFallthru->PushBackSuccFreq(edgeFreq); - size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); - int64_t updatedtrueFreq = static_cast(bb.GetSuccFreq()[trueBranchIdx] - edgeFreq); - ASSERT(updatedtrueFreq >= 0, "sanity check"); - bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); - pred.AddSuccFreq(edgeFreq, index); + if ((static_cast(bb.GetFrequency()) - edgeFreq) > 0) { + bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + exitCopyFallthru->SetFrequency(static_cast(edgeFreq)); + exitCopyFallthru->PushBackSuccFreq(static_cast(edgeFreq)); + size_t trueBranchIdx = static_cast(bb.GetSuccIndex(trueBranch)); + int64_t updatedtrueFreq = static_cast( + bb.GetSuccFreq()[trueBranchIdx] - static_cast(edgeFreq)); + ASSERT(updatedtrueFreq >= 0, "sanity check"); + bb.SetSuccFreq(static_cast(trueBranchIdx), static_cast(updatedtrueFreq)); + } + pred.AddSuccFreq(static_cast(edgeFreq), index); } return true; } @@ -4002,11 +3991,13 @@ bool ValueRangePropagation::RemoveTheEdgeOfPredBB( pred.AddSucc(*newBB, index); newBB->AddSucc(trueBranch); if (func.GetCfg()->UpdateCFGFreq()) { - bb.SetFrequency(bb.GetFrequency() - edgeFreq); - bb.UpdateEdgeFreqs(); - newBB->SetFrequency(edgeFreq); - newBB->PushBackSuccFreq(edgeFreq); - pred.AddSuccFreq(edgeFreq, index); + if ((static_cast(bb.GetFrequency()) - edgeFreq) > 0) { + bb.SetFrequency(static_cast(bb.GetFrequency() - edgeFreq)); + bb.UpdateEdgeFreqs(); + } + newBB->SetFrequency(static_cast(edgeFreq)); + newBB->PushBackSuccFreq(static_cast(edgeFreq)); + pred.AddSuccFreq(static_cast(edgeFreq), index); } DeleteThePhiNodeWhichOnlyHasOneOpnd(bb, updateSSAExceptTheScalarExpr, ssaupdateCandsForCondExpr); (void)func.GetOrCreateBBLabel(trueBranch); @@ -5223,7 +5214,6 @@ bool MEValueRangePropagation::PhaseRun(maple::MeFunction &f) { GetAnalysisInfoHook()->ForceRunTransFormPhase(&MELoopCanon::id, f); // update cfg frequency if (f.GetCfg()->UpdateCFGFreq()) { - f.GetCfg()->UpdateEdgeFreqWithBBFreq(); if (f.GetCfg()->DumpIRProfileFile()) { f.GetCfg()->DumpToFile("after-valuerange" + std::to_string(f.vrpRuns), false, true); } diff --git a/src/mapleall/maple_me/src/pme_emit.cpp b/src/mapleall/maple_me/src/pme_emit.cpp index 12606c14ec3845fe2d8a6c23900f70793bc4a3eb..efd76f295eddb8df92ff3bb55c712c08db3bf60a 100644 --- a/src/mapleall/maple_me/src/pme_emit.cpp +++ b/src/mapleall/maple_me/src/pme_emit.cpp @@ -499,6 +499,7 @@ StmtNode* PreMeEmitter::EmitPreMeStmt(MeStmt *meStmt, BaseNode *parent) { callnode->SetOriginalID(meStmt->GetOriginalId()); callnode->SetMeStmtID(callMeStmt->GetMeStmtId()); preMeStmtExtensionMap[callnode->GetStmtID()] = pmeExt; + callnode->SetEnclosingBlock(static_cast(parent)); return callnode; } case OP_icall: