OpenASIP 2.2
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Private Attributes | List of all members
BFMergeAndKeepUser Class Reference

#include <BFMergeAndKeepUser.hh>

Inheritance diagram for BFMergeAndKeepUser:
Inheritance graph
Collaboration diagram for BFMergeAndKeepUser:
Collaboration graph

Public Member Functions

 BFMergeAndKeepUser (BF2Scheduler &sched, MoveNode &src, MoveNode &mn, bool force=false, bool updatePrologMove=true)
 
bool operator() () override
 
 ~BFMergeAndKeepUser ()
 
- Public Member Functions inherited from BFOptimization
 BFOptimization (BF2Scheduler &sched)
 
virtual bool isFinishFront ()
 
virtual void mightBeReady (MoveNode &mn)
 
- Public Member Functions inherited from Reversible
virtual void undo ()
 
virtual ~Reversible ()
 
void deleteChildren (std::stack< Reversible * > &children)
 
int id ()
 
 Reversible ()
 

Protected Member Functions

void undoOnlyMe () override
 
bool updateEdges (MoveNode *src, MoveNode *dst, bool loopBypass, bool pre)
 
- Protected Member Functions inherited from BFOptimization
DataDependenceGraphddg ()
 
DataDependenceGraphrootDDG ()
 
const DataDependenceGraphddg () const
 
DataDependenceGraphprologDDG ()
 
SimpleResourceManagerrm () const
 
SimpleResourceManagerprologRM () const
 
BUMoveNodeSelectorselector ()
 
const TTAMachine::MachinetargetMachine () const
 
unsigned int ii () const
 
MoveNodeDuplicatorduplicator () const
 
virtual bool assign (int cycle, MoveNode &, const TTAMachine::Bus *bus=nullptr, const TTAMachine::FunctionUnit *srcFU_=nullptr, const TTAMachine::FunctionUnit *dstFU=nullptr, const TTAMachine::Bus *prologBus=nullptr, int immWriteCycle=-1, int prologImmWriteCycle=-1, const TTAMachine::ImmediateUnit *immu=nullptr, int immRegIndex=-1, bool ignoreGuardWriteCycle=false)
 
virtual void unassign (MoveNode &mn, bool disposePrologCopy=true)
 
virtual int rmEC (int cycle, MoveNode &mn, const TTAMachine::Bus *bus=nullptr, const TTAMachine::FunctionUnit *srcFU=nullptr, const TTAMachine::FunctionUnit *dstFU=nullptr, const TTAMachine::Bus *prologBus=nullptr, int immWriteCycle=-1, int prologImmWriteCycle=-1, const TTAMachine::ImmediateUnit *immu=nullptr, int immRegIndex=-1)
 
virtual int rmLC (int cycle, MoveNode &mn, const TTAMachine::Bus *bus=nullptr, const TTAMachine::FunctionUnit *srcFU=nullptr, const TTAMachine::FunctionUnit *dstFU=nullptr, const TTAMachine::Bus *prologBus=nullptr, int immWriteCycle=-1, int prologImmWriteCycle=-1, const TTAMachine::ImmediateUnit *immu=nullptr, int immRegIndex=-1)
 
virtual bool canAssign (int cycle, MoveNode &mn, const TTAMachine::Bus *bus=nullptr, const TTAMachine::FunctionUnit *srcFU=nullptr, const TTAMachine::FunctionUnit *dstFU=nullptr, const TTAMachine::Bus *prologBus=nullptr, int immWriteCycle=-1, int prologImmWriteCycle=-1, const TTAMachine::ImmediateUnit *immu=nullptr, int immRegIndex=-1, bool ignoreGWN=false)
 
bool putAlsoToPrologEpilog (int cycle, MoveNode &mn)
 
void setPrologSrcFUAnno (MoveNode &prologMN, MoveNode &loopMN)
 
void setPrologDstFUAnno (MoveNode &prologMN, MoveNode &loopMN)
 
void setJumpGuard (MoveNode &mn)
 
void unsetJumpGuard (MoveNode &mn)
 
bool needJumpGuard (const MoveNode &mn, int cycle)
 
int jumpGuardAvailableCycle (const MoveNode &mn)
 
bool canBeSpeculated (const Operation &op)
 
bool canBeSpeculated (const MoveNode &mn)
 
bool usePrologMove (const MoveNode &mn)
 
bool canBeScheduled (const MoveNode &mn)
 
const TTAMachine::RegisterFileRFReadPortCountPreventsScheduling (const MoveNode &mn)
 
bool immCountPreventsScheduling (const MoveNode &mn)
 
- Protected Member Functions inherited from Reversible
bool runPreChild (Reversible *preChild)
 
bool runPostChild (Reversible *preChild)
 
bool runChild (std::stack< Reversible * > &children, Reversible *child)
 
bool runChild (Reversible *child, bool pre)
 
void undoAndRemovePreChildren ()
 
void undoAndRemovePostChildren ()
 
void undoAndRemoveChildren (std::stack< Reversible * > &children)
 

Private Attributes

MoveNodesrc_
 
MoveNodedst_
 
bool force_
 
TCEString reg_
 
bool updatePrologMove_
 
bool duplicatedSrc_
 

Additional Inherited Members

- Static Public Member Functions inherited from BFOptimization
static void clearPrologMoves ()
 
static MoveNodegetSisterTrigger (const MoveNode &mn, const TTAMachine::Machine &mach)
 
- Protected Attributes inherited from BFOptimization
BF2Schedulersched_
 
- Protected Attributes inherited from Reversible
std::stack< Reversible * > preChildren_
 
std::stack< Reversible * > postChildren_
 
- Static Protected Attributes inherited from BFOptimization
static std::map< MoveNode *, MoveNode *, MoveNode::ComparatorprologMoves_
 

Detailed Description

Definition at line 41 of file BFMergeAndKeepUser.hh.

Constructor & Destructor Documentation

◆ BFMergeAndKeepUser()

BFMergeAndKeepUser::BFMergeAndKeepUser ( BF2Scheduler sched,
MoveNode src,
MoveNode mn,
bool  force = false,
bool  updatePrologMove = true 
)
inline

Definition at line 43 of file BFMergeAndKeepUser.hh.

◆ ~BFMergeAndKeepUser()

BFMergeAndKeepUser::~BFMergeAndKeepUser ( )
inline

Definition at line 53 of file BFMergeAndKeepUser.hh.

53{}

Member Function Documentation

◆ operator()()

bool BFMergeAndKeepUser::operator() ( )
overridevirtual

This performs the operation. Returns true if success, false if fail.

Implements Reversible.

Definition at line 150 of file BFMergeAndKeepUser.cc.

150 {
151
152
153 if (!ddg().mergeAndKeepAllowed(src_, dst_)) {
154 if (!force_) {
155 return false;
156 }
157 }
158
159 bool loopBypass = ddg().isLoopBypass(src_, dst_);
160
161 // Cannot bypass over multiple loop iterations. even with force flag.
162 if (loopBypass) {
163 for (int i = 0; i < ddg().inDegree(src_); i++) {
164 DataDependenceEdge& edge = ddg().inEdge(src_,i);
165 if (!edge.isFalseDep() && edge.isBackEdge()) {
166 return false;
167 }
168 }
169 }
171
172 if (!updateEdges(&src_, &dst_, loopBypass, true)) {
173 return false;
174 }
175
176
177 if (ii() && updatePrologMove_) {
178 MoveNode* prologMove = duplicator().getMoveNode(dst_);
179 if (prologMove != nullptr) {
180 auto prologSrcMove =
181 duplicator().duplicateMoveNode(src_,true, false);
182 duplicatedSrc_ = prologSrcMove.second;
183
186 sched_, *prologSrcMove.first, *prologMove));
187
189 prologSrcMove.first, prologMove, loopBypass, false);
190
191 }
192 }
193 return true;
194
195}
bool updateEdges(MoveNode *src, MoveNode *dst, bool loopBypass, bool pre)
unsigned int ii() const
BF2Scheduler & sched_
DataDependenceGraph & ddg()
MoveNodeDuplicator & duplicator() const
virtual Edge & inEdge(const Node &node, const int index) const
virtual int inDegree(const Node &node) const
bool isLoopBypass(MoveNode &sourceNode, MoveNode &userNode)
MoveNode * getMoveNode(MoveNode &mn)
std::pair< MoveNode *, bool > duplicateMoveNode(MoveNode &mn, bool addToDDG, bool ignoreSameBBBackEdges)
bool runPostChild(Reversible *preChild)
bool runPreChild(Reversible *preChild)

References BFOptimization::ddg(), dst_, duplicatedSrc_, MoveNodeDuplicator::duplicateMoveNode(), BFOptimization::duplicator(), force_, MoveNodeDuplicator::getMoveNode(), BFOptimization::ii(), BoostGraph< GraphNode, GraphEdge >::inDegree(), BoostGraph< GraphNode, GraphEdge >::inEdge(), DataDependenceEdge::isBackEdge(), DataDependenceEdge::isFalseDep(), DataDependenceGraph::isLoopBypass(), Reversible::runPostChild(), Reversible::runPreChild(), BFOptimization::sched_, src_, updateEdges(), and updatePrologMove_.

Here is the call graph for this function:

◆ undoOnlyMe()

void BFMergeAndKeepUser::undoOnlyMe ( )
overrideprotectedvirtual

Undoes the operations done by this class but not children. This method should be overloaded by most derived classes.

Reimplemented from Reversible.

Definition at line 197 of file BFMergeAndKeepUser.cc.

197 {
198 if (duplicatedSrc_) {
199 duplicator().disposeMoveNode(duplicator().getMoveNode(src_));
200 }
201}
void disposeMoveNode(MoveNode *newMN)

References MoveNodeDuplicator::disposeMoveNode(), duplicatedSrc_, BFOptimization::duplicator(), and src_.

Here is the call graph for this function:

◆ updateEdges()

bool BFMergeAndKeepUser::updateEdges ( MoveNode src,
MoveNode dst,
bool  loopBypass,
bool  pre 
)
protected

Definition at line 47 of file BFMergeAndKeepUser.cc.

48 {
49
50 bool sourceIsRegToItselfCopy = false;
51
52 if (src != nullptr && dst != nullptr &&
53 ddg().rootGraph()->hasNode(*dst) &
54 ddg().rootGraph()->hasNode(*src)) {
55 bool removedRawEdge = false;
56 auto edges = ddg().rootGraph()->connectingEdges(*src, *dst);
57 for (auto e: edges) {
58 if (e->isRAW()) {
59 removedRawEdge = true;
60 runChild(new BFRemoveEdge(sched_, *src, *dst, *e), pre);
61 reg_ = e->data();
62 }
63 }
64 if (!removedRawEdge) {
65 undo();
66 return false;
67 }
68
69 TTAProgram::Move& sm = src->move();
70 sourceIsRegToItselfCopy = sm.source().equals(sm.destination());
71
72 // if we are bypassing from a register-to-register copy, we'll have to
73 // copy incoming raw edges also in rootgraph level to preserve inter-bb
74 // -dependencies.
75 for (int i = 0; i < ddg().rootGraphInDegree(*src); i++) {
76 DataDependenceEdge& edge = ddg().rootGraphInEdge(*src,i);
77
78 // skip antidependencies due bypassed register.. these are no more
80 edge.data() == reg_) {
83 continue;
84 }
85 }
86
87 // do not copy guard use edges - the user already ahs them.
88 // copying them leads to exponential increase in guard ege counts.
89 if (edge.guardUse()) {
90 continue;
91 }
92
93 // copy other edges.
94 MoveNode& source = ddg().rootGraph()->tailNode(edge);
95 DataDependenceEdge* newEdge =
96 new DataDependenceEdge(edge, loopBypass);
97 runChild(new BFConnectNodes(sched_, source, *dst, newEdge), pre);
98 }
99
100 if (src->isSourceVariable() || src->isSourceRA()) {
101 // if bypassing reg-to-reg this copy anti edges resulting from the
102 // read of the other register.
103 for (int i = 0; i < ddg().rootGraphOutDegree(*src); i++) {
104 DataDependenceEdge& edge = ddg().rootGraphOutEdge(*src,i);
108 !edge.tailPseudo()) {
109
110 MoveNode& target = ddg().rootGraph()->headNode(edge);
111
112 if (!(static_cast<DataDependenceGraph*>(ddg().rootGraph()))
113 ->exclusingGuards(*dst, target) &&
114 dst != &target) {
115
116 DataDependenceEdge* newEdge =
117 new DataDependenceEdge(edge, loopBypass);
118 // TODO: loop here!
120 sched_, *dst, target, newEdge), pre);
121 }
122 }
123 }
124 }
125 }
126
127
128 if (dst != nullptr && ddg().rootGraph()->hasNode(*dst)) {
129 // fix WAR antidependencies to WaW
130 for (int i = 0; i < ddg().rootGraphOutDegree(*dst); i++) {
131 DataDependenceEdge& edge = ddg().rootGraphOutEdge(*dst,i);
134 edge.data() == reg_) {
135 // if stupid reg to itself copy, keep to in edges..
136 if (!sourceIsRegToItselfCopy) {
137 runChild(
138 new BFRemoveEdge(
139 sched_, *dst,
140 ddg().rootGraph()->headNode(edge), edge), pre);
141 i--; // don't skip one edge here!
142 }
143 }
144 }
145 }
146 return true;
147}
BoostGraph * rootGraph()
virtual Node & headNode(const Edge &edge) const
virtual int rootGraphInDegree(const Node &node) const
virtual int rootGraphOutDegree(const Node &node) const
virtual Edge & rootGraphInEdge(const Node &node, const int index) const
virtual Edge & rootGraphOutEdge(const Node &node, const int index) const
EdgeSet connectingEdges(const Node &nTail, const Node &nHead) const
virtual Node & tailNode(const Edge &edge) const
DependenceType dependenceType() const
EdgeReason edgeReason() const
const TCEString data() const
bool isSourceVariable() const
Definition MoveNode.cc:196
TTAProgram::Move & move()
bool isSourceRA() const
Definition MoveNode.cc:210
virtual void undo()
Definition Reversible.cc:69
bool runChild(std::stack< Reversible * > &children, Reversible *child)
Terminal & source() const
Definition Move.cc:302
Terminal & destination() const
Definition Move.cc:323
virtual bool equals(const Terminal &other) const =0

References BoostGraph< GraphNode, GraphEdge >::connectingEdges(), DataDependenceEdge::data(), BFOptimization::ddg(), DataDependenceEdge::DEP_WAR, DataDependenceEdge::DEP_WAW, DataDependenceEdge::dependenceType(), TTAProgram::Move::destination(), DataDependenceEdge::EDGE_RA, DataDependenceEdge::EDGE_REGISTER, DataDependenceEdge::edgeReason(), TTAProgram::Terminal::equals(), DataDependenceEdge::guardUse(), BoostGraph< GraphNode, GraphEdge >::headNode(), MoveNode::isSourceRA(), MoveNode::isSourceVariable(), MoveNode::move(), reg_, BoostGraph< GraphNode, GraphEdge >::rootGraph(), BoostGraph< GraphNode, GraphEdge >::rootGraphInDegree(), BoostGraph< GraphNode, GraphEdge >::rootGraphInEdge(), BoostGraph< GraphNode, GraphEdge >::rootGraphOutDegree(), BoostGraph< GraphNode, GraphEdge >::rootGraphOutEdge(), Reversible::runChild(), BFOptimization::sched_, TTAProgram::Move::source(), BoostGraph< GraphNode, GraphEdge >::tailNode(), DataDependenceEdge::tailPseudo(), and Reversible::undo().

Referenced by operator()().

Here is the call graph for this function:

Member Data Documentation

◆ dst_

MoveNode& BFMergeAndKeepUser::dst_
private

Definition at line 61 of file BFMergeAndKeepUser.hh.

Referenced by operator()().

◆ duplicatedSrc_

bool BFMergeAndKeepUser::duplicatedSrc_
private

Definition at line 65 of file BFMergeAndKeepUser.hh.

Referenced by operator()(), and undoOnlyMe().

◆ force_

bool BFMergeAndKeepUser::force_
private

Definition at line 62 of file BFMergeAndKeepUser.hh.

Referenced by operator()().

◆ reg_

TCEString BFMergeAndKeepUser::reg_
private

Definition at line 63 of file BFMergeAndKeepUser.hh.

Referenced by updateEdges().

◆ src_

MoveNode& BFMergeAndKeepUser::src_
private

Definition at line 60 of file BFMergeAndKeepUser.hh.

Referenced by operator()(), and undoOnlyMe().

◆ updatePrologMove_

bool BFMergeAndKeepUser::updatePrologMove_
private

Definition at line 64 of file BFMergeAndKeepUser.hh.

Referenced by operator()().


The documentation for this class was generated from the following files: