summaryrefslogtreecommitdiffstats
path: root/llvm/utils
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils')
-rw-r--r--llvm/utils/TableGen/DFAPacketizerEmitter.cpp140
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 {
OpenPOWER on IntegriCloud