From 2e3585448396da2091c01a778269217b3c685da1 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 5 Jan 2023 23:26:04 -0800 Subject: [PATCH] Added field phiOpndIndices in RGNode to designate the BB pred since the RGNode's predecessors are different from the CFG Use FreqType instead of uint64 in mc_ssa_pre.h and mc_ssa_pre.cpp --- src/mapleall/maple_me/include/mc_ssa_pre.h | 20 +++++++++-------- src/mapleall/maple_me/src/mc_ssa_pre.cpp | 25 ++++++++++++---------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/mapleall/maple_me/include/mc_ssa_pre.h b/src/mapleall/maple_me/include/mc_ssa_pre.h index 1304ab29d6..21bbc07867 100644 --- a/src/mapleall/maple_me/include/mc_ssa_pre.h +++ b/src/mapleall/maple_me/include/mc_ssa_pre.h @@ -25,14 +25,16 @@ class RGNode { public: RGNode(MapleAllocator *alloc, uint32 idx, MeOccur *oc) : id(idx), occ(oc), pred(alloc->Adapter()), + phiOpndIndices(alloc->Adapter()), inEdgesCap(alloc->Adapter()), usedCap(alloc->Adapter()) {} private: uint32 id; MeOccur *occ; MapleVector pred; - MapleVector inEdgesCap; // capacity of incoming edges - MapleVector usedCap; // used flow value of outgoing edges + MapleVector phiOpndIndices; // only applicable if occ is a phi + MapleVector inEdgesCap; // capacity of incoming edges + MapleVector usedCap; // used flow value of outgoing edges }; // designate a visited node and the next outgoing edge to take @@ -40,8 +42,8 @@ class Visit { friend class McSSAPre; private: Visit(RGNode *nd, uint32 idx) : node(nd), predIdx(idx) {} - uint64 AvailableCapacity() const { return node->inEdgesCap[predIdx] - node->usedCap[predIdx]; } - void IncreUsedCapacity(uint64 val) { node->usedCap[predIdx] += val; } + FreqType AvailableCapacity() const { return node->inEdgesCap[predIdx] - node->usedCap[predIdx]; } + void IncreUsedCapacity(FreqType val) { node->usedCap[predIdx] += val; } bool operator==(const Visit *rhs) const { return node == rhs->node && predIdx == rhs->predIdx; } RGNode *node; @@ -55,7 +57,7 @@ class Route { Route(MapleAllocator *alloc) : visits(alloc->Adapter()) {} private: MapleVector visits; - uint64 flowValue = 0; + FreqType flowValue = 0; }; class McSSAPre : public SSAPre { @@ -79,8 +81,8 @@ class McSSAPre : public SSAPre { void DumpRGToFile(); // dump reduced graph to dot file bool IncludedEarlier(Visit **cut, Visit *curVisit, uint32 nextRouteIdx); void RemoveRouteNodesFromCutSet(std::unordered_multiset &cutSet, Route *route); - bool SearchRelaxedMinCut(Visit **cut, std::unordered_multiset &cutSet, uint32 nextRouteIdx, uint64 flowSoFar); - bool SearchMinCut(Visit **cut, std::unordered_multiset &cutSet, uint32 nextRouteIdx, uint64 flowSoFar); + bool SearchRelaxedMinCut(Visit **cut, std::unordered_multiset &cutSet, uint32 nextRouteIdx, FreqType flowSoFar); + bool SearchMinCut(Visit **cut, std::unordered_multiset &cutSet, uint32 nextRouteIdx, FreqType flowSoFar); void DetermineMinCut(); bool VisitANode(RGNode *node, Route *route, std::vector &visitedNodes); bool FindAnotherRoute(); @@ -103,9 +105,9 @@ class McSSAPre : public SSAPre { uint32 numSourceEdges; MapleVector maxFlowRoutes; uint32 nextRGNodeId; - uint64 maxFlowValue; + FreqType maxFlowValue; // relax maxFlowValue to avoid excessive mincut search time when number of routes is large - uint64 relaxedMaxFlowValue; + FreqType relaxedMaxFlowValue; MapleVector minCut; // an array of Visits* to represent the minCut uint32 preUseProfileLimit = UINT32_MAX; }; diff --git a/src/mapleall/maple_me/src/mc_ssa_pre.cpp b/src/mapleall/maple_me/src/mc_ssa_pre.cpp index 209544cfbe..aadd380e58 100644 --- a/src/mapleall/maple_me/src/mc_ssa_pre.cpp +++ b/src/mapleall/maple_me/src/mc_ssa_pre.cpp @@ -56,7 +56,7 @@ void McSSAPre::ResetMCWillBeAvail(MePhiOcc *occ) const { void McSSAPre::ComputeMCWillBeAvail() const { if (minCut.size() == 0) { for (MePhiOcc *phiOcc : phiOccs) { - phiOcc->SetIsMCWillBeAvail(false); + phiOcc->SetIsMCWillBeAvail(phiOcc->IsFullyAvail()); } return; } @@ -65,7 +65,8 @@ void McSSAPre::ComputeMCWillBeAvail() const { MeOccur *occ = visit->node->occ; if (occ->GetOccType() == kOccPhiocc) { MePhiOcc *phiOcc = static_cast(occ); - MePhiOpndOcc *phiOpndOcc = phiOcc->GetPhiOpnd(visit->predIdx); + uint32 phiOpndIndex = visit->node->phiOpndIndices[visit->predIdx]; + MePhiOpndOcc *phiOpndOcc = phiOcc->GetPhiOpnd(phiOpndIndex); phiOpndOcc->SetIsMCInsert(true); } } @@ -172,7 +173,7 @@ void McSSAPre::RemoveRouteNodesFromCutSet(std::unordered_multiset &cutSe // find the cut closest to the sink whose total flow is relaxedMaxFlowValue bool McSSAPre::SearchRelaxedMinCut(Visit **cut, std::unordered_multiset &cutSet, - uint32 nextRouteIdx, uint64 flowSoFar) { + uint32 nextRouteIdx, FreqType flowSoFar) { Route *curRoute = maxFlowRoutes[nextRouteIdx]; Visit *curVisit = nullptr; @@ -200,7 +201,7 @@ bool McSSAPre::SearchRelaxedMinCut(Visit **cut, std::unordered_multiset return false; } curVisit = &curRoute->visits[visitIdx]; - uint64 visitCap = curVisit->node->inEdgesCap[curVisit->predIdx]; + FreqType visitCap = curVisit->node->inEdgesCap[curVisit->predIdx]; cut[nextRouteIdx] = curVisit; if (visitIdx != 0) { cutSet.insert(curVisit->node->id); @@ -219,7 +220,7 @@ bool McSSAPre::SearchRelaxedMinCut(Visit **cut, std::unordered_multiset // find the cut closest to the sink whose total flow is maxFlowValue bool McSSAPre::SearchMinCut(Visit **cut, std::unordered_multiset &cutSet, - uint32 nextRouteIdx, uint64 flowSoFar) { + uint32 nextRouteIdx, FreqType flowSoFar) { Route *curRoute = maxFlowRoutes[nextRouteIdx]; Visit *curVisit = nullptr; @@ -247,8 +248,8 @@ bool McSSAPre::SearchMinCut(Visit **cut, std::unordered_multiset &cutSet return false; } curVisit = &curRoute->visits[visitIdx]; - uint64 visitCap = curVisit->node->inEdgesCap[curVisit->predIdx]; - uint64 usedCap = curVisit->node->usedCap[curVisit->predIdx]; + FreqType visitCap = curVisit->node->inEdgesCap[curVisit->predIdx]; + FreqType usedCap = curVisit->node->usedCap[curVisit->predIdx]; if (visitCap != usedCap) { if (visitIdx != 0) { cutSet.insert(curVisit->node->id); @@ -284,7 +285,7 @@ void McSSAPre::DetermineMinCut() { // key is RGNode's id; must be kept in sync with cut[]; sink node is not entered std::unordered_multiset cutSet; constexpr double defaultRelaxScaling = 1.25; - relaxedMaxFlowValue = static_cast(static_cast(maxFlowValue) * defaultRelaxScaling); + relaxedMaxFlowValue = static_cast(static_cast(maxFlowValue) * defaultRelaxScaling); bool relaxedSearch = false; if (maxFlowRoutes.size() >= 20) { // apply arbitrary heuristics to reduce search time @@ -422,9 +423,9 @@ bool McSSAPre::FindAnotherRoute() { return false; } // find bottleneck capacity along route - uint64 minAvailCap = route->visits[0].AvailableCapacity(); + FreqType minAvailCap = route->visits[0].AvailableCapacity(); for (int32 i = 1; i < route->visits.size(); i++) { - uint64 curAvailCap = route->visits[i].AvailableCapacity(); + FreqType curAvailCap = route->visits[i].AvailableCapacity(); minAvailCap = std::min(minAvailCap, curAvailCap); } route->flowValue = minAvailCap; @@ -486,7 +487,7 @@ void McSSAPre::AddSingleSink() { RGNode *use = it->second; // add edge from this use node to sink sink->pred.push_back(use); - sink->inEdgesCap.push_back(UINT64_MAX); + sink->inEdgesCap.push_back(INT64_MAX); sink->usedCap.push_back(0); numToSink++; } @@ -511,6 +512,7 @@ void McSSAPre::AddSingleSource() { // add edge from source to this phi node RGNode *sucNode = occ2RGNodeMap[phiOcc]; sucNode->pred.push_back(source); + sucNode->phiOpndIndices.push_back(i); sucNode->inEdgesCap.push_back(phiOcc->GetBB()->GetPred(i)->GetFrequency()+1); sucNode->usedCap.push_back(0); numSourceEdges++; @@ -582,6 +584,7 @@ void McSSAPre::GraphReduction() { break; } } + use->phiOpndIndices.push_back(i); ASSERT(i != defPhiOcc->GetPhiOpnds().size(), "McSSAPre::GraphReduction: cannot find corresponding phi opnd"); use->inEdgesCap.push_back(defPhiOcc->GetBB()->GetPred(i)->GetFrequency()+1); use->usedCap.push_back(0); -- Gitee