diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-09-09 12:33:22 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-09-09 12:33:22 +0000 |
commit | 462e3d8050faf6442b678a9089933542b7c0e84c (patch) | |
tree | 0ace17df642cf39f2acf38adb8fd6c33b7ee97ad /llvm/utils/TableGen/DFAPacketizerEmitter.cpp | |
parent | 5b270932cc6ee39d977d397bafc363e9c5df040f (diff) | |
download | bcm5719-llvm-462e3d8050faf6442b678a9089933542b7c0e84c.tar.gz bcm5719-llvm-462e3d8050faf6442b678a9089933542b7c0e84c.zip |
Revert rL371198 from llvm/trunk: [DFAPacketizer] Track resources for packetized instructions
This patch allows the DFAPacketizer to be queried after a packet is formed to work out which
resources were allocated to the packetized instructions.
This is particularly important for targets that do their own bundle packing - it's not
sufficient to know simply that instructions can share a packet; which slots are used is
also required for encoding.
This extends the emitter to emit a side-table containing resource usage diffs for each
state transition. The packetizer maintains a set of all possible resource states in its
current state. After packetization is complete, all remaining resource states are
possible packetization strategies.
The sidetable is only ~500K for Hexagon, but the extra tracking is disabled by default
(most uses of the packetizer like MachinePipeliner don't care and don't need the extra
maintained state).
Differential Revision: https://reviews.llvm.org/D66936
........
Reverted as this is causing "compiler out of heap space" errors on MSVC 2017/19 NDEBUG builds
llvm-svn: 371393
Diffstat (limited to 'llvm/utils/TableGen/DFAPacketizerEmitter.cpp')
-rw-r--r-- | llvm/utils/TableGen/DFAPacketizerEmitter.cpp | 140 |
1 files changed, 48 insertions, 92 deletions
diff --git a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp index 8952151cdf7..19a6580c1d4 100644 --- a/llvm/utils/TableGen/DFAPacketizerEmitter.cpp +++ b/llvm/utils/TableGen/DFAPacketizerEmitter.cpp @@ -192,14 +192,7 @@ class State { const int stateNum; mutable bool isInitial; mutable std::set<unsigned> stateInfo; - - struct TransitionInfo { - // Maps from a resource bitmask in this state to the equivalent resource - // bitmap in the transitioned-to state. This is a 1-to-N mapping. - std::vector<std::pair<unsigned, unsigned>> ResourceTransitions; - const State *S; - }; - using TransitionMap = std::map<std::vector<unsigned>, TransitionInfo>; + typedef std::map<std::vector<unsigned>, const State *> TransitionMap; mutable TransitionMap Transitions; State(); @@ -228,14 +221,9 @@ class State { // PossibleStates is the set of valid resource states that ensue from valid // transitions. // - // TransitionInfo maps from a resource bitmask B in this state to a resource - // bitmask B' in PossibleStates. This is a one-to-many (or none) mapping. - // - void AddInsnClass( - std::vector<unsigned> &InsnClass, - std::map<unsigned, unsigned> &ComboBitToBitsMap, - std::set<unsigned> &PossibleStates, - std::vector<std::pair<unsigned, unsigned>> &TransitionInfo) const; + void AddInsnClass(std::vector<unsigned> &InsnClass, + std::map<unsigned, unsigned> &ComboBitToBitsMap, + std::set<unsigned> &PossibleStates) const; // // AddInsnClassStages - Return all combinations of resource reservation @@ -243,17 +231,16 @@ class State { // which are possible from this state (PossibleStates). // void AddInsnClassStages(std::vector<unsigned> &InsnClass, - std::map<unsigned, unsigned> &ComboBitToBitsMap, - unsigned chkstage, unsigned numstages, - unsigned prevState, unsigned origState, - DenseSet<unsigned> &VisitedResourceStates) const; + std::map<unsigned, unsigned> &ComboBitToBitsMap, + unsigned chkstage, unsigned numstages, + unsigned prevState, unsigned origState, + DenseSet<unsigned> &VisitedResourceStates, + std::set<unsigned> &PossibleStates) const; // - // addTransition - Add a transition from this state given the input InsnClass. + // addTransition - Add a transition from this state given the input InsnClass // - void addTransition( - std::vector<unsigned> InsnClass, const State *To, - const std::vector<std::pair<unsigned, unsigned>> &TransitionInfo) const; + void addTransition(std::vector<unsigned> InsnClass, const State *To) const; // // hasTransition - Returns true if there is a transition from this state @@ -342,12 +329,11 @@ State::State() : // // addTransition - Add a transition from this state given the input InsnClass // -void State::addTransition( - std::vector<unsigned> InsnClass, const State *To, - const std::vector<std::pair<unsigned, unsigned>> &TransitionInfo) const { +void State::addTransition(std::vector<unsigned> InsnClass, const State *To) + const { assert(!Transitions.count(InsnClass) && "Cannot have multiple transitions for the same input"); - Transitions[InsnClass] = {TransitionInfo, To}; + Transitions[InsnClass] = To; } // @@ -365,11 +351,9 @@ bool State::hasTransition(std::vector<unsigned> InsnClass) const { // PossibleStates is the set of valid resource states that ensue from valid // transitions. // -void State::AddInsnClass( - std::vector<unsigned> &InsnClass, - std::map<unsigned, unsigned> &ComboBitToBitsMap, - std::set<unsigned> &PossibleStates, - std::vector<std::pair<unsigned, unsigned>> &TransitionInfo) const { +void State::AddInsnClass(std::vector<unsigned> &InsnClass, + std::map<unsigned, unsigned> &ComboBitToBitsMap, + std::set<unsigned> &PossibleStates) const { // // Iterate over all resource states in currentState. // @@ -378,26 +362,25 @@ void State::AddInsnClass( for (std::set<unsigned>::iterator SI = stateInfo.begin(); SI != stateInfo.end(); ++SI) { - unsigned ThisState = *SI; + unsigned thisState = *SI; DenseSet<unsigned> VisitedResourceStates; - LLVM_DEBUG(dbgs() << " thisState: 0x" << Twine::utohexstr(ThisState) + LLVM_DEBUG(dbgs() << " thisState: 0x" << Twine::utohexstr(thisState) << "\n"); - AddInsnClassStages(InsnClass, ComboBitToBitsMap, numstages - 1, numstages, - ThisState, ThisState, VisitedResourceStates); - for (unsigned NewState : VisitedResourceStates) { - PossibleStates.insert(NewState); - TransitionInfo.emplace_back(ThisState, NewState); - } + AddInsnClassStages(InsnClass, ComboBitToBitsMap, + numstages - 1, numstages, + thisState, thisState, + VisitedResourceStates, PossibleStates); } } -void State::AddInsnClassStages( - std::vector<unsigned> &InsnClass, - std::map<unsigned, unsigned> &ComboBitToBitsMap, unsigned chkstage, - unsigned numstages, unsigned prevState, unsigned origState, - DenseSet<unsigned> &VisitedResourceStates) const { +void State::AddInsnClassStages(std::vector<unsigned> &InsnClass, + std::map<unsigned, unsigned> &ComboBitToBitsMap, + unsigned chkstage, unsigned numstages, + unsigned prevState, unsigned origState, + DenseSet<unsigned> &VisitedResourceStates, + std::set<unsigned> &PossibleStates) const { assert((chkstage < numstages) && "AddInsnClassStages: stage out of range"); unsigned thisStage = InsnClass[chkstage]; @@ -455,6 +438,7 @@ void State::AddInsnClassStages( if (ResultingResourceState != prevState) { if (VisitedResourceStates.count(ResultingResourceState) == 0) { VisitedResourceStates.insert(ResultingResourceState); + PossibleStates.insert(ResultingResourceState); LLVM_DEBUG(dbgs() << "\tResultingResourceState: 0x" << Twine::utohexstr(ResultingResourceState) << "\n"); @@ -472,9 +456,10 @@ void State::AddInsnClassStages( // if (ResultingResourceState != prevState) { LLVM_DEBUG(dbgs() << "\n"); - AddInsnClassStages(InsnClass, ComboBitToBitsMap, chkstage - 1, - numstages, ResultingResourceState, origState, - VisitedResourceStates); + AddInsnClassStages(InsnClass, ComboBitToBitsMap, + chkstage - 1, numstages, + ResultingResourceState, origState, + VisitedResourceStates, PossibleStates); } else { LLVM_DEBUG(dbgs() << "\tSkipped Add - no resources available\n"); } @@ -593,10 +578,17 @@ void DFA::writeTableAndAPI(raw_ostream &OS, const std::string &TargetName, II = SI->Transitions.begin(), IE = SI->Transitions.end(); II != IE; ++II) { OS << "{0x" << Twine::utohexstr(getDFAInsnInput(II->first)) << ", " - << II->second.S->stateNum << "},\t"; + << II->second->stateNum << "},\t"; } ValidTransitions += SI->Transitions.size(); + // If there are no valid transitions from this stage, we need a sentinel + // transition. + if (ValidTransitions == StateEntry[i]) { + OS << SentinelEntry << ",\t"; + ++ValidTransitions; + } + OS << " // state " << i << ": " << StateEntry[i]; if (StateEntry[i] != (ValidTransitions-1)) { // More than one transition. OS << "-" << (ValidTransitions-1); @@ -618,6 +610,8 @@ void DFA::writeTableAndAPI(raw_ostream &OS, const std::string &TargetName, OS << "// " << numStates << " states\n"; OS << "const unsigned int " << TargetName << "DFAStateEntryTable[] = {\n"; + // Multiply i by 2 since each entry in DFAStateInputTable is a set of + // two numbers. unsigned lastState = 0; for (unsigned i = 0; i < numStates; ++i) { if (i && ((i % 10) == 0)) { @@ -626,44 +620,11 @@ void DFA::writeTableAndAPI(raw_ostream &OS, const std::string &TargetName, } OS << StateEntry[i] << ", "; } + // Print out the index to the sentinel entry in StateInputTable OS << ValidTransitions << ", "; OS << " // states " << (lastState+1) << ":" << numStates << "\n"; OS << "};\n"; - - // Generate the resource transition table. - OS << "const std::pair<unsigned, unsigned> " << TargetName - << "DFAResourceTransitionTable[] = { \n"; - int N = 0; - StateEntry.clear(); - for (const State &S : states) { - for (auto &KV : S.Transitions) { - StateEntry.push_back(N); - for (std::pair<unsigned, unsigned> &T : KV.second.ResourceTransitions) { - OS << "{0x" << utohexstr(T.first) << ", 0x" << utohexstr(T.second) - << "}, "; - ++N; - } - } - OS << "\n "; - } - // Add a sentinel entry to terminate the search. - StateEntry.push_back(N); - OS << "\n {~0U,~0U}\n};\n\n"; - - OS << "// " << TargetName << "DFAResourceTransitionEntryTable[i] = " - << "Index of the first entry in DFAResourceTransitionTable for\n"; - OS << "// the ith transition.\n"; - OS << "const unsigned int " << TargetName - << "DFAResourceTransitionEntryTable[] = { \n"; - - N = 0; - for (int S : StateEntry) { - OS << S << ","; - if (N++ % 10 == 0) - OS << "\n "; - } - OS << "\n ~0U\n};\n"; } // @@ -985,9 +946,7 @@ void DFAPacketizerEmitter::emitForItineraries( if (!current->hasTransition(InsnClass) && current->canMaybeAddInsnClass(InsnClass, ComboBitToBitsMap)) { const State *NewState = nullptr; - std::vector<std::pair<unsigned, unsigned>> TransitionInfo; - current->AddInsnClass(InsnClass, ComboBitToBitsMap, NewStateResources, - TransitionInfo); + current->AddInsnClass(InsnClass, ComboBitToBitsMap, NewStateResources); if (NewStateResources.empty()) { LLVM_DEBUG(dbgs() << " Skipped - no new states generated\n"); continue; @@ -1023,7 +982,7 @@ void DFAPacketizerEmitter::emitForItineraries( }); } - current->addTransition(InsnClass, NewState, TransitionInfo); + current->addTransition(InsnClass, NewState); } } } @@ -1041,10 +1000,7 @@ void DFAPacketizerEmitter::emitForItineraries( << "DFAPacketizer(const InstrItineraryData *IID) const {\n" << " return new DFAPacketizer(IID, " << TargetName << DFAName << "DFAStateInputTable, " << TargetName << DFAName - << "DFAStateEntryTable, " << TargetName << DFAName - << "DFAResourceTransitionTable, " << TargetName << DFAName - << "DFAResourceTransitionEntryTable" - << ");\n}\n\n"; + << "DFAStateEntryTable);\n}\n\n"; } namespace llvm { |