[llvm-commits] [llvm] r159281 - /llvm/trunk/utils/TableGen/DFAPacketizerEmitter.cpp
Alexey Samsonov
samsonov at google.com
Thu Jun 28 00:53:15 PDT 2012
On Wed, Jun 27, 2012 at 11:38 PM, Anshuman Dasgupta <adasgupt at codeaurora.org
> wrote:
> Author: adasgupt
> Date: Wed Jun 27 14:38:29 2012
> New Revision: 159281
>
> URL: http://llvm.org/viewvc/llvm-project?rev=159281&view=rev
> Log:
> Refactor and speed up DFA generator.
>
> Patch by Ivan Llopard!
>
> Modified:
> llvm/trunk/utils/TableGen/DFAPacketizerEmitter.cpp
>
> Modified: llvm/trunk/utils/TableGen/DFAPacketizerEmitter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DFAPacketizerEmitter.cpp?rev=159281&r1=159280&r2=159281&view=diff
>
> ==============================================================================
> --- llvm/trunk/utils/TableGen/DFAPacketizerEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/DFAPacketizerEmitter.cpp Wed Jun 27 14:38:29
> 2012
> @@ -94,7 +94,12 @@
> // PossibleStates is the set of valid resource states that ensue from
> valid
> // transitions.
> //
> - bool canAddInsnClass(unsigned InsnClass, std::set<unsigned>
> &PossibleStates);
> + bool canAddInsnClass(unsigned InsnClass) const;
> + //
> + // AddInsnClass - Return all combinations of resource reservation
> + // which are possible from this state (PossibleStates).
> + //
> + void AddInsnClass(unsigned InsnClass, std::set<unsigned>
> &PossibleStates);
> };
> } // End anonymous namespace.
>
> @@ -120,6 +125,10 @@
> struct ltState {
> bool operator()(const State *s1, const State *s2) const;
> };
> +
> +struct ltTransition {
> + bool operator()(const Transition *s1, const Transition *s2) const;
> +};
> } // End anonymous namespace.
>
>
> @@ -135,7 +144,8 @@
> std::set<State*, ltState> states;
>
> // Map from a state to the list of transitions with that state as source.
> - std::map<State*, SmallVector<Transition*, 16>, ltState>
> stateTransitions;
> + std::map<State*, std::set<Transition*, ltTransition>, ltState>
> + stateTransitions;
> State *currentState;
>
> // Highest valued Input seen.
> @@ -193,21 +203,19 @@
> return (s1->stateNum < s2->stateNum);
> }
>
> +bool ltTransition::operator()(const Transition *s1, const Transition *s2)
> const {
> + return (s1->input < s2->input);
> +}
>
> //
> -// canAddInsnClass - Returns true if an instruction of type InsnClass is a
> -// valid transition from this state i.e., can an instruction of type
> InsnClass
> -// be added to the packet represented by this state.
> +// AddInsnClass - Return all combinations of resource reservation
> +// which are possible from this state (PossibleStates).
> //
> -// PossibleStates is the set of valid resource states that ensue from
> valid
> -// transitions.
> -//
> -bool State::canAddInsnClass(unsigned InsnClass,
> +void State::AddInsnClass(unsigned InsnClass,
> std::set<unsigned> &PossibleStates) {
> //
> // Iterate over all resource states in currentState.
> //
> - bool AddedState = false;
>
> for (std::set<unsigned>::iterator SI = stateInfo.begin();
> SI != stateInfo.end(); ++SI) {
> @@ -240,13 +248,26 @@
> (VisitedResourceStates.count(ResultingResourceState) == 0)) {
> VisitedResourceStates.insert(ResultingResourceState);
> PossibleStates.insert(ResultingResourceState);
> - AddedState = true;
> }
> }
> }
> }
>
> - return AddedState;
> +}
> +
> +
> +//
> +// canAddInsnClass - Quickly verifies if an instruction of type InsnClass
> is a
> +// valid transition from this state i.e., can an instruction of type
> InsnClass
> +// be added to the packet represented by this state.
> +//
> +bool State::canAddInsnClass(unsigned InsnClass) const {
> + for (std::set<unsigned>::iterator SI = stateInfo.begin();
> + SI != stateInfo.end(); ++SI) {
> + if (~*SI & InsnClass)
> + return true;
> + }
> + return false;
> }
>
I guess we should use const_iterator here. Submitted a fixup as r159334.
>
>
> @@ -267,7 +288,8 @@
> LargestInput = T->input;
>
> // Add the new transition.
> - stateTransitions[T->from].push_back(T);
> + bool Added = stateTransitions[T->from].insert(T).second;
> + assert(Added && "Cannot have multiple states for the same input");
> }
>
>
> @@ -281,11 +303,13 @@
> return NULL;
>
> // Do we have a transition from state From with Input I?
> - for (SmallVector<Transition*, 16>::iterator VI =
> - stateTransitions[From].begin();
> - VI != stateTransitions[From].end(); ++VI)
> - if ((*VI)->input == I)
> - return (*VI)->to;
> + Transition TVal(NULL, I, NULL);
> + // Do not count this temporal instance
> + Transition::currentTransitionNum--;
> + std::set<Transition*, ltTransition>::iterator T =
> + stateTransitions[From].find(&TVal);
> + if (T != stateTransitions[From].end())
> + return (*T)->to;
>
> return NULL;
> }
> @@ -331,11 +355,12 @@
> StateEntry[i] = ValidTransitions;
> for (unsigned j = 0; j <= LargestInput; ++j) {
> assert (((*SI)->stateNum == (int) i) && "Mismatch in state numbers");
> - if (!isValidTransition(*SI, j))
> + State *To = getTransition(*SI, j);
> + if (To == NULL)
> continue;
>
> OS << "{" << j << ", "
> - << getTransition(*SI, j)->stateNum
> + << To->stateNum
> << "}, ";
> ++ValidTransitions;
> }
> @@ -514,8 +539,10 @@
> // and the state can accommodate this InsnClass, create a transition.
> //
> if (!D.getTransition(current, InsnClass) &&
> - current->canAddInsnClass(InsnClass, NewStateResources)) {
> + current->canAddInsnClass(InsnClass)) {
> State *NewState = NULL;
> + current->AddInsnClass(InsnClass, NewStateResources);
> + assert(NewStateResources.size() && "New states must be
> generated");
>
> //
> // If we have seen this state before, then do not create a new
> state.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120628/d7f7c11a/attachment.html>
More information about the llvm-commits
mailing list