OpenASIP 2.2
Loading...
Searching...
No Matches
CopyingDelaySlotFiller.hh
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2009 Tampere University.
3
4 This file is part of TTA-Based Codesign Environment (TCE).
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23 */
24/**
25 * @file CopyingDelaySlotFiller.hh
26 *
27 * Definition of CopyingDelaySlotFiller class.
28 *
29 * @author Heikki Kultala 2007-2009 (hkultala-no.spam-cs.tut.fi)
30 * @note rating: red
31 */
32
33#ifndef COPYING_DELAY_SLOT_FILLER_HH
34#define COPYING_DELAY_SLOT_FILLER_HH
35
36#include <map>
37#include <vector>
38#include <list>
39#include "Exception.hh"
40#include "ProgramOperation.hh"
41#include "ControlFlowGraph.hh"
43#include "ControlFlowEdge.hh"
44
45class BasicBlockNode;
47class ControlFlowEdge;
49class ResourceManager;
51class InterPassData;
52class MoveNode;
53
54namespace TTAMachine {
55 class Machine;
56 class RegisterFile;
57}
58
59namespace TTAProgram {
60 class InstructionReferenceManager;
61 class Move;
62 class Immediate;
63 class MoveGuard;
64 class TerminalInstructionAddress;
65 class CodeGenerator;
66 class BasicBlock;
67 class TerminalImmediate;
68}
69
70
72public:
75
76 void initialize(
79
80 void fillDelaySlots(
84
86 void finalizeProcedure();
87
88 static std::pair<int, TTAProgram::Move*> findJump(
90 ControlFlowEdge::CFGEdgePredicate* pred = nullptr);
91
92 static std::pair<TTAProgram::Move*, std::shared_ptr<TTAProgram::Immediate> >
94 int jumpIndex, TTAProgram::Move& jumpMove,
96
97 typedef std::map<TCEString,TTAProgram::TerminalImmediate*>
99
100protected:
101 bool fillDelaySlots(
102 BasicBlockNode& jumpingBB, int delaySlots, bool fillFallThru);
103
104private:
105 typedef std::vector <std::list<MoveNode*> > MoveNodeListVector;
106
107
109
110 bool areAllJumpPredsFilled(BasicBlockNode& bbn) const;
111
112 void bbFilled(BasicBlockNode& bbn);
113
115
116 bool writesRegister(
118 unsigned int registerIndex);
119
120 bool tryToFillSlots(
121 BasicBlockNode& blockToFillNode, BasicBlockNode& nextBBNode,
122 bool fallThru, TTAProgram::Move* jumpMove, int slotsToFill,
123 int removeGuards, int grIndex, const TTAMachine::RegisterFile* grFile,
124 TTAProgram::Move*& skippedJump, int delaySlots);
125
127 BasicBlockNode& jumpBBN,
128 BasicBlockNode& fillingBBN,
129 ControlFlowEdge& fillEdge,
130 TTAProgram::Move* jumpAddressMove,
131 std::shared_ptr<TTAProgram::Immediate> jumpAddressImmediate,
132 TTAProgram::Move* jumpMove,
133 int slotsFilled,
134 TTAProgram::Move* skippedJump);
135
136 bool updateFTBBAndCfg(
137 BasicBlockNode& jumpingBB, BasicBlockNode& nextBBN,
138 ControlFlowEdge& edge, int slotsFilled);
139
140 void loseCopies(DataDependenceGraph::NodeSet* keptTempNodes);
141
142 bool collectMoves(
143 BasicBlockNode& blockToFillNode, BasicBlockNode& nextBBN,
144 MoveNodeListVector& moves, int slotsToFill, bool fallThru,
145 int removeGuards, TTAProgram::Move* jumpMove, int grIndex,
146 const TTAMachine::RegisterFile* grFile, TTAProgram::Move*& skippedJump,
147 int delaySlots);
148
149 bool checkImmediatesAfter(TTAProgram::BasicBlock& nextBB, int slotsToFill);
150
152 MoveNode& mnOld, BasicBlockNode& blockToFillNode, int cycleDiff);
153
154 bool tryToAssignNodes(
155 MoveNodeListVector& moves, int slotsToFill, int firstCycleToFill,
156 ResourceManager& rm, int nextBBStart,
157 DataDependenceGraph::NodeSet& tempAssigns);
158
160 MoveNode& mn, int firstCycleToFill, ResourceManager& rm,
161 int lastCycle, int nextBBStart, DataDependenceGraph::NodeSet& tempAssigns);
162
164 ProgramOperation& po, int firstCycleToFill, ResourceManager& rm,
165 int lastCycle, int nextBBStart, DataDependenceGraph::NodeSet& tempAssigns);
166
169
171 MoveNode& old, BasicBlockNode& bbn, bool fillOverBackEdge);
173 ProgramOperationPtr old, BasicBlockNode& bbn, bool fillOverBackEdge);
174 std::shared_ptr<TTAProgram::Move> getMove(TTAProgram::Move& old);
175
176 bool poMoved(
177 ProgramOperationPtr po, MoveNodeListVector& movesToCopy,
178 DataDependenceGraph::NodeSet& tempAssigns);
179
180
181 bool allowedToSpeculate(MoveNode& mn) const;
182
183 void finishBB(BasicBlockNode& bbn, bool force = false);
184
187
188 std::map<TTAProgram::BasicBlock*,SimpleResourceManager*> resourceManagers_;
190
191 // indexed by the original PO's
192 std::map<ProgramOperation*, ProgramOperationPtr, ProgramOperation::Comparator>
194 std::map<ProgramOperation*, ProgramOperationPtr, ProgramOperation::Comparator>
196 std::map<MoveNode*,MoveNode*,MoveNode::Comparator> moveNodes_;
197 std::map<MoveNode*,MoveNode*,MoveNode::Comparator> oldMoveNodes_;
198 std::map<TTAProgram::Move*, std::shared_ptr<TTAProgram::Move> > moves_;
199 std::map<MoveNode*, const TTAMachine::Bus*, MoveNode::Comparator> moveNodeBuses_;
200
201 std::map<BasicBlockNode*, DataDependenceGraph::NodeSet> tempResultNodes_;
202 std::map<BasicBlockNode*, std::set<
204
205 // garbage collection would be SOOOO nice!
206 std::map<MoveNode*,bool,MoveNode::Comparator> mnOwned_;
207
208
213
214 // can go from uninitialized to UNKNOWN
215 mutable std::map <BasicBlockNode*, BBNStates> bbnStatus_;
216// mutable std::map <BasicBlockNode*, BBNStates> bbnIncomingStatus_;
218
220};
221
222#endif
TTAMachine::Machine * machine
the architecture definition of the estimated processor
std::shared_ptr< ProgramOperation > ProgramOperationPtr
Definition MoveNode.hh:53
bool updateFTBBAndCfg(BasicBlockNode &jumpingBB, BasicBlockNode &nextBBN, ControlFlowEdge &edge, int slotsFilled)
bool writesRegister(TTAProgram::Move &move, const TTAMachine::RegisterFile *rf, unsigned int registerIndex)
std::map< BasicBlockNode *, DataDependenceGraph::NodeSet > tempResultNodes_
std::map< BasicBlockNode *, BBNStates > bbnStatus_
std::map< ProgramOperation *, ProgramOperationPtr, ProgramOperation::Comparator > oldProgramOperations_
bool areAllJumpPredsFilled(BasicBlockNode &bbn) const
void initialize(ControlFlowGraph &cfg, DataDependenceGraph &ddg, const TTAMachine::Machine &machine)
static std::pair< TTAProgram::Move *, std::shared_ptr< TTAProgram::Immediate > > findJumpImmediate(int jumpIndex, TTAProgram::Move &jumpMove, TTAProgram::InstructionReferenceManager &irm)
static std::pair< int, TTAProgram::Move * > findJump(TTAProgram::BasicBlock &bb, ControlFlowEdge::CFGEdgePredicate *pred=nullptr)
std::vector< std::list< MoveNode * > > MoveNodeListVector
std::map< TTAProgram::BasicBlock *, SimpleResourceManager * > resourceManagers_
void loseCopies(DataDependenceGraph::NodeSet *keptTempNodes)
bool checkIncomingDeps(MoveNode &mnOld, BasicBlockNode &blockToFillNode, int cycleDiff)
bool tryToFillSlots(BasicBlockNode &blockToFillNode, BasicBlockNode &nextBBNode, bool fallThru, TTAProgram::Move *jumpMove, int slotsToFill, int removeGuards, int grIndex, const TTAMachine::RegisterFile *grFile, TTAProgram::Move *&skippedJump, int delaySlots)
bool updateJumpsAndCfg(BasicBlockNode &jumpBBN, BasicBlockNode &fillingBBN, ControlFlowEdge &fillEdge, TTAProgram::Move *jumpAddressMove, std::shared_ptr< TTAProgram::Immediate > jumpAddressImmediate, TTAProgram::Move *jumpMove, int slotsFilled, TTAProgram::Move *skippedJump)
std::map< ProgramOperation *, ProgramOperationPtr, ProgramOperation::Comparator > programOperations_
bool poMoved(ProgramOperationPtr po, MoveNodeListVector &movesToCopy, DataDependenceGraph::NodeSet &tempAssigns)
void fillDelaySlots(ControlFlowGraph &cfg, DataDependenceGraph &ddg, const TTAMachine::Machine &machine)
ProgramOperationPtr getProgramOperationPtr(ProgramOperationPtr old, BasicBlockNode &bbn, bool fillOverBackEdge)
bool allowedToSpeculate(MoveNode &mn) const
std::map< MoveNode *, MoveNode *, MoveNode::Comparator > oldMoveNodes_
bool tryToAssignNodes(MoveNodeListVector &moves, int slotsToFill, int firstCycleToFill, ResourceManager &rm, int nextBBStart, DataDependenceGraph::NodeSet &tempAssigns)
ControlFlowGraph::NodeSet killedBBs_
std::shared_ptr< TTAProgram::Move > getMove(TTAProgram::Move &old)
void addResourceManager(TTAProgram::BasicBlock &bbn, SimpleResourceManager &rm)
std::map< TCEString, TTAProgram::TerminalImmediate * > PendingImmediateMap
bool tryToAssignOtherMovesOfOp(ProgramOperation &po, int firstCycleToFill, ResourceManager &rm, int lastCycle, int nextBBStart, DataDependenceGraph::NodeSet &tempAssigns)
std::map< TTAProgram::Move *, std::shared_ptr< TTAProgram::Move > > moves_
std::map< MoveNode *, const TTAMachine::Bus *, MoveNode::Comparator > moveNodeBuses_
bool collectMoves(BasicBlockNode &blockToFillNode, BasicBlockNode &nextBBN, MoveNodeListVector &moves, int slotsToFill, bool fallThru, int removeGuards, TTAProgram::Move *jumpMove, int grIndex, const TTAMachine::RegisterFile *grFile, TTAProgram::Move *&skippedJump, int delaySlots)
MoveNode & getMoveNode(MoveNode &old, BasicBlockNode &bbn, bool fillOverBackEdge)
void unassignTempAssigns(DataDependenceGraph::NodeSet &tempAssigns, SimpleResourceManager &rm)
std::map< MoveNode *, bool, MoveNode::Comparator > mnOwned_
bool checkImmediatesAfter(TTAProgram::BasicBlock &nextBB, int slotsToFill)
void bbnScheduled(BasicBlockNode &bbn)
std::map< MoveNode *, MoveNode *, MoveNode::Comparator > moveNodes_
bool mightFillIncomingTo(BasicBlockNode &bbn)
bool tryToAssignOtherMovesOfDestOps(MoveNode &mn, int firstCycleToFill, ResourceManager &rm, int lastCycle, int nextBBStart, DataDependenceGraph::NodeSet &tempAssigns)
void finishBB(BasicBlockNode &bbn, bool force=false)
bool areAllJumpPredsScheduled(BasicBlockNode &bbn) const
std::map< BasicBlockNode *, std::set< ProgramOperationPtr, ProgramOperation::Comparator > > tempPOs_
void bbFilled(BasicBlockNode &bbn)
std::set< GraphNode *, typename GraphNode::Comparator > NodeSet
Definition Graph.hh:53