aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/SparcV9/ModuloScheduling/MSchedGraphSB.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/SparcV9/ModuloScheduling/MSchedGraphSB.h')
-rw-r--r--lib/Target/SparcV9/ModuloScheduling/MSchedGraphSB.h410
1 files changed, 0 insertions, 410 deletions
diff --git a/lib/Target/SparcV9/ModuloScheduling/MSchedGraphSB.h b/lib/Target/SparcV9/ModuloScheduling/MSchedGraphSB.h
deleted file mode 100644
index 2e43f7ed6f..0000000000
--- a/lib/Target/SparcV9/ModuloScheduling/MSchedGraphSB.h
+++ /dev/null
@@ -1,410 +0,0 @@
-//===-- MSchedGraphSB.h - Scheduling Graph ------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// A graph class for dependencies. This graph only contains true, anti, and
-// output data dependencies for a vector of MachineBasicBlock. Dependencies
-// across iterations are also computed. Unless data dependence analysis
-// is provided, a conservative approach of adding dependencies between all
-// loads and stores is taken. It also includes pseudo predicate nodes for
-// modulo scheduling superblocks.
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_MSCHEDGRAPHSB_H
-#define LLVM_MSCHEDGRAPHSB_H
-#include "DependenceAnalyzer.h"
-#include "llvm/Analysis/AliasAnalysis.h"
-#include "llvm/CodeGen/MachineInstr.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetData.h"
-#include "llvm/ADT/GraphTraits.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/iterator"
-#include <vector>
-
-
-namespace llvm {
-
- class MSchedGraphSB;
- class MSchedGraphSBNode;
- template<class IteratorType, class NodeType>
- class MSchedGraphSBNodeIterator;
-
- //MSchedGraphSBEdge encapsulates the data dependence between nodes. It
- //identifies the dependence type, on what, and the iteration
- //difference
- struct MSchedGraphSBEdge {
- enum DataDepOrderType {
- TrueDep, AntiDep, OutputDep, NonDataDep
- };
-
- enum MSchedGraphSBEdgeType {
- MemoryDep, ValueDep, MachineRegister, PredDep
- };
-
- //Get or set edge data
- MSchedGraphSBNode *getDest() const { return dest; }
- unsigned getIteDiff() { return iteDiff; }
- unsigned getDepOrderType() { return depOrderType; }
- void setDest(MSchedGraphSBNode *newDest) { dest = newDest; }
-
- private:
- friend class MSchedGraphSBNode;
- MSchedGraphSBEdge(MSchedGraphSBNode *destination, MSchedGraphSBEdgeType type,
- unsigned deptype, unsigned diff)
- : dest(destination), depType(type), depOrderType(deptype), iteDiff(diff) {}
-
- MSchedGraphSBNode *dest;
- MSchedGraphSBEdgeType depType;
- unsigned depOrderType;
- unsigned iteDiff;
- };
-
- //MSchedGraphSBNode represents a machine instruction and its
- //corresponding latency. Each node also contains a list of its
- //predecessors and sucessors.
- class MSchedGraphSBNode {
-
- const MachineInstr* Inst; //Machine Instruction
- std::vector<const MachineInstr*> otherInstrs;
-
- MSchedGraphSB* Parent; //Graph this node belongs to
- unsigned index; //Index in BB
- unsigned latency; //Latency of Instruction
- bool isBranchInstr; //Is this node the branch instr or not
- bool isPredicateNode; //Indicate if this node should be treated like a predicate
-
- std::vector<MSchedGraphSBNode*> Predecessors; //Predecessor Nodes
- std::vector<MSchedGraphSBEdge> Successors; //Successor edges
-
- public:
- MSchedGraphSBNode(const MachineInstr* inst, MSchedGraphSB *graph,
- unsigned index, unsigned late=0, bool isBranch=false);
- MSchedGraphSBNode(const MachineInstr* inst, std::vector<const MachineInstr*> &other,
- MSchedGraphSB *graph,
- unsigned index, unsigned late=0, bool isPNode=true);
- MSchedGraphSBNode(const MSchedGraphSBNode &N);
-
- //Iterators - Predecessor and Succussor
- typedef std::vector<MSchedGraphSBNode*>::iterator pred_iterator;
- pred_iterator pred_begin() { return Predecessors.begin(); }
- pred_iterator pred_end() { return Predecessors.end(); }
- unsigned pred_size() { return Predecessors.size(); }
-
- typedef std::vector<MSchedGraphSBNode*>::const_iterator pred_const_iterator;
- pred_const_iterator pred_begin() const { return Predecessors.begin(); }
- pred_const_iterator pred_end() const { return Predecessors.end(); }
-
- typedef MSchedGraphSBNodeIterator<std::vector<MSchedGraphSBEdge>::const_iterator,
- const MSchedGraphSBNode> succ_const_iterator;
- succ_const_iterator succ_begin() const;
- succ_const_iterator succ_end() const;
-
- typedef MSchedGraphSBNodeIterator<std::vector<MSchedGraphSBEdge>::iterator,
- MSchedGraphSBNode> succ_iterator;
- succ_iterator succ_begin();
- succ_iterator succ_end();
- unsigned succ_size() { return Successors.size(); }
-
- //Get or set predecessor nodes, or successor edges
- void setPredecessor(unsigned index, MSchedGraphSBNode *dest) {
- Predecessors[index] = dest;
- }
-
- MSchedGraphSBNode* getPredecessor(unsigned index) {
- return Predecessors[index];
- }
-
- MSchedGraphSBEdge* getSuccessor(unsigned index) {
- return &Successors[index];
- }
-
- void deleteSuccessor(MSchedGraphSBNode *node) {
- for (unsigned i = 0; i != Successors.size(); ++i)
- if (Successors[i].getDest() == node) {
- Successors.erase(Successors.begin()+i);
- node->Predecessors.erase(std::find(node->Predecessors.begin(),
- node->Predecessors.end(), this));
- --i; //Decrease index var since we deleted a node
- }
- }
-
- void addOutEdge(MSchedGraphSBNode *destination,
- MSchedGraphSBEdge::MSchedGraphSBEdgeType type,
- unsigned deptype, unsigned diff=0) {
- Successors.push_back(MSchedGraphSBEdge(destination, type, deptype,diff));
- destination->Predecessors.push_back(this);
- }
-
- //General methods to get and set data for the node
- const MachineInstr* getInst() { return Inst; }
- MSchedGraphSB* getParent() { return Parent; }
- bool hasPredecessors() { return (Predecessors.size() > 0); }
- bool hasSuccessors() { return (Successors.size() > 0); }
- unsigned getLatency() { return latency; }
- unsigned getLatency() const { return latency; }
- unsigned getIndex() { return index; }
- unsigned getIteDiff(MSchedGraphSBNode *succ);
- MSchedGraphSBEdge getInEdge(MSchedGraphSBNode *pred);
- unsigned getInEdgeNum(MSchedGraphSBNode *pred);
- bool isSuccessor(MSchedGraphSBNode *);
- bool isPredecessor(MSchedGraphSBNode *);
- bool isBranch() { return isBranchInstr; }
- bool isPredicate() { return isPredicateNode; }
- bool isPredicate() const { return isPredicateNode; }
- std::vector<const MachineInstr*> getOtherInstrs() { return otherInstrs; }
-
- //Debug support
- void print(std::ostream &os) const;
- void setParent(MSchedGraphSB *p) { Parent = p; }
- };
-
- //Node iterator for graph generation
- template<class IteratorType, class NodeType>
- class MSchedGraphSBNodeIterator : public forward_iterator<NodeType*, ptrdiff_t> {
- IteratorType I; // std::vector<MSchedGraphSBEdge>::iterator or const_iterator
- public:
- MSchedGraphSBNodeIterator(IteratorType i) : I(i) {}
-
- bool operator==(const MSchedGraphSBNodeIterator RHS) const { return I == RHS.I; }
- bool operator!=(const MSchedGraphSBNodeIterator RHS) const { return I != RHS.I; }
-
- const MSchedGraphSBNodeIterator &operator=(const MSchedGraphSBNodeIterator &RHS) {
- I = RHS.I;
- return *this;
- }
-
- NodeType* operator*() const {
- return I->getDest();
- }
- NodeType* operator->() const { return operator*(); }
-
- MSchedGraphSBNodeIterator& operator++() { // Preincrement
- ++I;
- return *this;
- }
- MSchedGraphSBNodeIterator operator++(int) { // Postincrement
- MSchedGraphSBNodeIterator tmp = *this; ++*this; return tmp;
- }
-
- MSchedGraphSBEdge &getEdge() {
- return *I;
- }
- const MSchedGraphSBEdge &getEdge() const {
- return *I;
- }
- };
-
- inline MSchedGraphSBNode::succ_const_iterator MSchedGraphSBNode::succ_begin() const {
- return succ_const_iterator(Successors.begin());
- }
- inline MSchedGraphSBNode::succ_const_iterator MSchedGraphSBNode::succ_end() const {
- return succ_const_iterator(Successors.end());
- }
- inline MSchedGraphSBNode::succ_iterator MSchedGraphSBNode::succ_begin() {
- return succ_iterator(Successors.begin());
- }
- inline MSchedGraphSBNode::succ_iterator MSchedGraphSBNode::succ_end() {
- return succ_iterator(Successors.end());
- }
-
- // ostream << operator for MSGraphNode class
- inline std::ostream &operator<<(std::ostream &os,
- const MSchedGraphSBNode &node) {
- node.print(os);
- return os;
- }
-
-
- // Provide specializations of GraphTraits to be able to use graph
- // iterators on the scheduling graph!
- //
- template <> struct GraphTraits<MSchedGraphSBNode*> {
- typedef MSchedGraphSBNode NodeType;
- typedef MSchedGraphSBNode::succ_iterator ChildIteratorType;
-
- static inline ChildIteratorType child_begin(NodeType *N) {
- return N->succ_begin();
- }
- static inline ChildIteratorType child_end(NodeType *N) {
- return N->succ_end();
- }
-
- static NodeType *getEntryNode(NodeType* N) { return N; }
- };
-
-
-
- //Graph class to represent dependence graph
- class MSchedGraphSB {
-
- std::vector<const MachineBasicBlock *> BBs; //Machine basic block
- const TargetMachine &Target; //Target Machine
-
- //Nodes
- std::map<const MachineInstr*, MSchedGraphSBNode*> GraphMap;
-
- //Add Nodes and Edges to this graph for our BB
- typedef std::pair<int, MSchedGraphSBNode*> OpIndexNodePair;
- void buildNodesAndEdges(std::map<const MachineInstr*, unsigned> &ignoreInstrs, DependenceAnalyzer &DA, std::map<MachineInstr*, Instruction*> &machineTollvm, std::map<MSchedGraphSBNode*, std::set<MachineInstr*> > &liveOutsideTrace);
- void addValueEdges(std::vector<OpIndexNodePair> &NodesInMap,
- MSchedGraphSBNode *node,
- bool nodeIsUse, bool nodeIsDef, std::vector<const MachineInstr*> &phiInstrs, int diff=0);
- void addMachRegEdges(std::map<int,
- std::vector<OpIndexNodePair> >& regNumtoNodeMap);
- void addMemEdges(const std::vector<MSchedGraphSBNode*>& memInst,
- DependenceAnalyzer &DA, std::map<MachineInstr*, Instruction*> &machineTollvm);
-
-
- bool instrCauseException(MachineOpCode opCode);
-
- public:
- MSchedGraphSB(const MachineBasicBlock *bb, const TargetMachine &targ,
- std::map<const MachineInstr*, unsigned> &ignoreInstrs,
- DependenceAnalyzer &DA, std::map<MachineInstr*, Instruction*> &machineTollvm);
-
- //Copy constructor with maps to link old nodes to new nodes
- MSchedGraphSB(const MSchedGraphSB &G, std::map<MSchedGraphSBNode*, MSchedGraphSBNode*> &newNodes);
-
- MSchedGraphSB(std::vector<const MachineBasicBlock*> &bbs,
- const TargetMachine &targ,
- std::map<const MachineInstr*, unsigned> &ignoreInstrs,
- DependenceAnalyzer &DA,
- std::map<MachineInstr*, Instruction*> &machineTollvm);
-
- //Print graph
- void print(std::ostream &os) const;
-
- //Deconstructor!
- ~MSchedGraphSB();
-
- //Add or delete nodes from the Graph
- void addNode(const MachineInstr* MI, MSchedGraphSBNode *node);
- void deleteNode(MSchedGraphSBNode *node);
- int totalDelay();
-
- //iterators
- typedef std::map<const MachineInstr*, MSchedGraphSBNode*>::iterator iterator;
- typedef std::map<const MachineInstr*, MSchedGraphSBNode*>::const_iterator const_iterator;
- typedef std::map<const MachineInstr*, MSchedGraphSBNode*>::reverse_iterator reverse_iterator;
- iterator find(const MachineInstr* I) { return GraphMap.find(I); }
- iterator end() { return GraphMap.end(); }
- iterator begin() { return GraphMap.begin(); }
- unsigned size() { return GraphMap.size(); }
- reverse_iterator rbegin() { return GraphMap.rbegin(); }
- reverse_iterator rend() { return GraphMap.rend(); }
-
- //Get Target or original machine basic block
- const TargetMachine* getTarget() { return &Target; }
- std::vector<const MachineBasicBlock*> getBBs() { return BBs; }
- };
-
-
-
-
-
- // Provide specializations of GraphTraits to be able to use graph
- // iterators on the scheduling graph
- static MSchedGraphSBNode& getSecond(std::pair<const MachineInstr* const,
- MSchedGraphSBNode*> &Pair) {
- return *Pair.second;
- }
-
- template <> struct GraphTraits<MSchedGraphSB*> {
- typedef MSchedGraphSBNode NodeType;
- typedef MSchedGraphSBNode::succ_iterator ChildIteratorType;
-
- static inline ChildIteratorType child_begin(NodeType *N) {
- return N->succ_begin();
- }
- static inline ChildIteratorType child_end(NodeType *N) {
- return N->succ_end();
- }
-
- typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
- MSchedGraphSBNode*>&, MSchedGraphSBNode&> DerefFun;
-
- typedef mapped_iterator<MSchedGraphSB::iterator, DerefFun> nodes_iterator;
- static nodes_iterator nodes_begin(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->begin(), DerefFun(getSecond));
- }
- static nodes_iterator nodes_end(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->end(), DerefFun(getSecond));
- }
-
- };
-
- template <> struct GraphTraits<const MSchedGraphSB*> {
- typedef const MSchedGraphSBNode NodeType;
- typedef MSchedGraphSBNode::succ_const_iterator ChildIteratorType;
-
- static inline ChildIteratorType child_begin(NodeType *N) {
- return N->succ_begin();
- }
- static inline ChildIteratorType child_end(NodeType *N) {
- return N->succ_end();
- }
- typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
- MSchedGraphSBNode*>&, MSchedGraphSBNode&> DerefFun;
-
- typedef mapped_iterator<MSchedGraphSB::iterator, DerefFun> nodes_iterator;
- static nodes_iterator nodes_begin(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->begin(), DerefFun(getSecond));
- }
- static nodes_iterator nodes_end(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->end(), DerefFun(getSecond));
- }
- };
-
- template <> struct GraphTraits<Inverse<MSchedGraphSB*> > {
- typedef MSchedGraphSBNode NodeType;
- typedef MSchedGraphSBNode::pred_iterator ChildIteratorType;
-
- static inline ChildIteratorType child_begin(NodeType *N) {
- return N->pred_begin();
- }
- static inline ChildIteratorType child_end(NodeType *N) {
- return N->pred_end();
- }
- typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
- MSchedGraphSBNode*>&, MSchedGraphSBNode&> DerefFun;
-
- typedef mapped_iterator<MSchedGraphSB::iterator, DerefFun> nodes_iterator;
- static nodes_iterator nodes_begin(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->begin(), DerefFun(getSecond));
- }
- static nodes_iterator nodes_end(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->end(), DerefFun(getSecond));
- }
- };
-
- template <> struct GraphTraits<Inverse<const MSchedGraphSB*> > {
- typedef const MSchedGraphSBNode NodeType;
- typedef MSchedGraphSBNode::pred_const_iterator ChildIteratorType;
-
- static inline ChildIteratorType child_begin(NodeType *N) {
- return N->pred_begin();
- }
- static inline ChildIteratorType child_end(NodeType *N) {
- return N->pred_end();
- }
-
- typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
- MSchedGraphSBNode*>&, MSchedGraphSBNode&> DerefFun;
-
- typedef mapped_iterator<MSchedGraphSB::iterator, DerefFun> nodes_iterator;
- static nodes_iterator nodes_begin(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->begin(), DerefFun(getSecond));
- }
- static nodes_iterator nodes_end(MSchedGraphSB *G) {
- return map_iterator(((MSchedGraphSB*)G)->end(), DerefFun(getSecond));
- }
- };
-}
-
-#endif