mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8153 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			171 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===- SchedGraphCommon.cpp - Scheduling Graphs Base Class- ---------------===//
 | 
						|
//
 | 
						|
// Scheduling graph base class that contains common information for SchedGraph
 | 
						|
// and ModuloSchedGraph scheduling graphs.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "llvm/CodeGen/SchedGraphCommon.h"
 | 
						|
#include "Support/STLExtras.h"
 | 
						|
 | 
						|
class SchedGraphCommon;
 | 
						|
 | 
						|
//
 | 
						|
// class SchedGraphEdge
 | 
						|
// 
 | 
						|
SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
 | 
						|
			       SchedGraphNodeCommon* _sink,
 | 
						|
			       SchedGraphEdgeDepType _depType,
 | 
						|
			       unsigned int     _depOrderType,
 | 
						|
			       int _minDelay)
 | 
						|
  : src(_src), sink(_sink), depType(_depType), depOrderType(_depOrderType),
 | 
						|
    minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(NULL) {
 | 
						|
  
 | 
						|
  iteDiff=0;
 | 
						|
  assert(src != sink && "Self-loop in scheduling graph!");
 | 
						|
  src->addOutEdge(this);
 | 
						|
  sink->addInEdge(this);
 | 
						|
}
 | 
						|
 | 
						|
SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon*  _src,
 | 
						|
			       SchedGraphNodeCommon*  _sink,
 | 
						|
			       const Value*     _val,
 | 
						|
			       unsigned int     _depOrderType,
 | 
						|
			       int              _minDelay)
 | 
						|
  : src(_src), sink(_sink), depType(ValueDep), depOrderType(_depOrderType),
 | 
						|
    minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(_val) {
 | 
						|
  iteDiff=0;
 | 
						|
  assert(src != sink && "Self-loop in scheduling graph!");
 | 
						|
  src->addOutEdge(this);
 | 
						|
  sink->addInEdge(this);
 | 
						|
}
 | 
						|
 | 
						|
SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon*  _src,
 | 
						|
			       SchedGraphNodeCommon*  _sink,
 | 
						|
			       unsigned int     _regNum,
 | 
						|
			       unsigned int     _depOrderType,
 | 
						|
			       int             _minDelay)
 | 
						|
  : src(_src), sink(_sink), depType(MachineRegister),
 | 
						|
    depOrderType(_depOrderType),
 | 
						|
    minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
 | 
						|
    machineRegNum(_regNum) {
 | 
						|
  iteDiff=0;
 | 
						|
  assert(src != sink && "Self-loop in scheduling graph!");
 | 
						|
  src->addOutEdge(this);
 | 
						|
  sink->addInEdge(this);
 | 
						|
}
 | 
						|
 | 
						|
SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
 | 
						|
			       SchedGraphNodeCommon* _sink,
 | 
						|
			       ResourceId      _resourceId,
 | 
						|
			       int             _minDelay)
 | 
						|
  : src(_src), sink(_sink), depType(MachineResource), depOrderType(NonDataDep),
 | 
						|
    minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
 | 
						|
    resourceId(_resourceId) {
 | 
						|
  iteDiff=0;
 | 
						|
  assert(src != sink && "Self-loop in scheduling graph!");
 | 
						|
  src->addOutEdge(this);
 | 
						|
  sink->addInEdge(this);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void SchedGraphEdge::dump(int indent) const {
 | 
						|
  std::cerr << std::string(indent*2, ' ') << *this; 
 | 
						|
}
 | 
						|
 | 
						|
/*dtor*/
 | 
						|
SchedGraphNodeCommon::~SchedGraphNodeCommon()
 | 
						|
{
 | 
						|
  // for each node, delete its out-edges
 | 
						|
  std::for_each(beginOutEdges(), endOutEdges(),
 | 
						|
                deleter<SchedGraphEdge>);
 | 
						|
}
 | 
						|
 | 
						|
void SchedGraphNodeCommon::removeInEdge(const SchedGraphEdge* edge) {
 | 
						|
  assert(edge->getSink() == this);
 | 
						|
  
 | 
						|
  for (iterator I = beginInEdges(); I != endInEdges(); ++I)
 | 
						|
    if ((*I) == edge) {
 | 
						|
      inEdges.erase(I);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void SchedGraphNodeCommon::removeOutEdge(const SchedGraphEdge* edge) {
 | 
						|
  assert(edge->getSrc() == this);
 | 
						|
  
 | 
						|
  for (iterator I = beginOutEdges(); I != endOutEdges(); ++I)
 | 
						|
    if ((*I) == edge) {
 | 
						|
      outEdges.erase(I);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void SchedGraphNodeCommon::dump(int indent) const {
 | 
						|
  std::cerr << std::string(indent*2, ' ') << *this; 
 | 
						|
}
 | 
						|
 | 
						|
//class SchedGraphCommon
 | 
						|
 | 
						|
SchedGraphCommon::~SchedGraphCommon() {
 | 
						|
  delete graphRoot;
 | 
						|
  delete graphLeaf;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void SchedGraphCommon::eraseIncomingEdges(SchedGraphNodeCommon* node, 
 | 
						|
					  bool addDummyEdges) {
 | 
						|
  // Delete and disconnect all in-edges for the node
 | 
						|
  for (SchedGraphNodeCommon::iterator I = node->beginInEdges();
 | 
						|
       I != node->endInEdges(); ++I) {
 | 
						|
    SchedGraphNodeCommon* srcNode = (*I)->getSrc();
 | 
						|
    srcNode->removeOutEdge(*I);
 | 
						|
    delete *I;
 | 
						|
    
 | 
						|
    if (addDummyEdges && srcNode != getRoot() &&
 | 
						|
	srcNode->beginOutEdges() == srcNode->endOutEdges()) { 
 | 
						|
      
 | 
						|
      // srcNode has no more out edges, so add an edge to dummy EXIT node
 | 
						|
      assert(node != getLeaf() && "Adding edge that was just removed?");
 | 
						|
      (void) new SchedGraphEdge(srcNode, getLeaf(),
 | 
						|
				SchedGraphEdge::CtrlDep, 
 | 
						|
				SchedGraphEdge::NonDataDep, 0);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  node->inEdges.clear();
 | 
						|
}
 | 
						|
 | 
						|
void SchedGraphCommon::eraseOutgoingEdges(SchedGraphNodeCommon* node, 
 | 
						|
					  bool addDummyEdges) {
 | 
						|
  // Delete and disconnect all out-edges for the node
 | 
						|
  for (SchedGraphNodeCommon::iterator I = node->beginOutEdges();
 | 
						|
       I != node->endOutEdges(); ++I) {
 | 
						|
    SchedGraphNodeCommon* sinkNode = (*I)->getSink();
 | 
						|
    sinkNode->removeInEdge(*I);
 | 
						|
    delete *I;
 | 
						|
    
 | 
						|
    if (addDummyEdges &&
 | 
						|
	sinkNode != getLeaf() &&
 | 
						|
	sinkNode->beginInEdges() == sinkNode->endInEdges()) {
 | 
						|
      
 | 
						|
      //sinkNode has no more in edges, so add an edge from dummy ENTRY node
 | 
						|
      assert(node != getRoot() && "Adding edge that was just removed?");
 | 
						|
      (void) new SchedGraphEdge(getRoot(), sinkNode,
 | 
						|
				SchedGraphEdge::CtrlDep, 
 | 
						|
				SchedGraphEdge::NonDataDep, 0);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  node->outEdges.clear();
 | 
						|
}
 | 
						|
 | 
						|
void SchedGraphCommon::eraseIncidentEdges(SchedGraphNodeCommon* node, 
 | 
						|
					  bool addDummyEdges) {
 | 
						|
  this->eraseIncomingEdges(node, addDummyEdges);	
 | 
						|
  this->eraseOutgoingEdges(node, addDummyEdges);	
 | 
						|
}
 | 
						|
 |