32
32
ScheduleDAGInstrs::ScheduleDAGInstrs(MachineFunction &mf,
33
33
const MachineLoopInfo &mli,
34
34
const MachineDominatorTree &mdt)
35
: ScheduleDAG(mf), MLI(mli), MDT(mdt), LoopRegs(MLI, MDT) {
35
: ScheduleDAG(mf), MLI(mli), MDT(mdt), Defs(TRI->getNumRegs()),
36
Uses(TRI->getNumRegs()), LoopRegs(MLI, MDT) {
36
37
MFI = mf.getFrameInfo();
39
41
/// Run - perform scheduling.
157
159
std::map<const Value *, SUnit *> AliasMemDefs, NonAliasMemDefs;
158
160
std::map<const Value *, std::vector<SUnit *> > AliasMemUses, NonAliasMemUses;
162
// Keep track of dangling debug references to registers.
163
std::vector<std::pair<MachineInstr*, unsigned> >
164
DanglingDebugValue(TRI->getNumRegs(),
165
std::make_pair(static_cast<MachineInstr*>(0), 0));
160
167
// Check to see if the scheduler cares about latencies.
161
168
bool UnitLatencies = ForceUnitLatencies();
164
171
const TargetSubtarget &ST = TM.getSubtarget<TargetSubtarget>();
165
172
unsigned SpecialAddressLatency = ST.getSpecialAddressLatency();
174
// Remove any stale debug info; sometimes BuildSchedGraph is called again
175
// without emitting the info from the previous call.
167
178
// Walk the list of instructions, from bottom moving up.
168
179
for (MachineBasicBlock::iterator MII = InsertPos, MIE = Begin;
169
180
MII != MIE; --MII) {
170
181
MachineInstr *MI = prior(MII);
182
// DBG_VALUE does not have SUnit's built, so just remember these for later
184
if (MI->isDebugValue()) {
185
if (MI->getNumOperands()==3 && MI->getOperand(0).isReg() &&
186
MI->getOperand(0).getReg())
187
DanglingDebugValue[MI->getOperand(0).getReg()] =
188
std::make_pair(MI, DbgValueVec.size());
189
DbgValueVec.push_back(MI);
171
192
const TargetInstrDesc &TID = MI->getDesc();
172
193
assert(!TID.isTerminator() && !MI->isLabel() &&
173
194
"Cannot schedule terminators or labels!");
221
249
unsigned DataLatency = SU->Latency;
222
250
for (unsigned i = 0, e = UseList.size(); i != e; ++i) {
223
251
SUnit *UseSU = UseList[i];
225
unsigned LDataLatency = DataLatency;
226
// Optionally add in a special extra latency for nodes that
228
// TODO: Do this for register aliases too.
229
// TODO: Perhaps we should get rid of
230
// SpecialAddressLatency and just move this into
231
// adjustSchedDependency for the targets that care about
233
if (SpecialAddressLatency != 0 && !UnitLatencies) {
234
MachineInstr *UseMI = UseSU->getInstr();
235
const TargetInstrDesc &UseTID = UseMI->getDesc();
236
int RegUseIndex = UseMI->findRegisterUseOperandIdx(Reg);
237
assert(RegUseIndex >= 0 && "UseMI doesn's use register!");
238
if ((UseTID.mayLoad() || UseTID.mayStore()) &&
239
(unsigned)RegUseIndex < UseTID.getNumOperands() &&
240
UseTID.OpInfo[RegUseIndex].isLookupPtrRegClass())
241
LDataLatency += SpecialAddressLatency;
243
// Adjust the dependence latency using operand def/use
244
// information (if any), and then allow the target to
245
// perform its own adjustments.
246
const SDep& dep = SDep(SU, SDep::Data, LDataLatency, Reg);
247
if (!UnitLatencies) {
248
ComputeOperandLatency(SU, UseSU, (SDep &)dep);
249
ST.adjustSchedDependency(SU, UseSU, (SDep &)dep);
254
unsigned LDataLatency = DataLatency;
255
// Optionally add in a special extra latency for nodes that
257
// TODO: Do this for register aliases too.
258
// TODO: Perhaps we should get rid of
259
// SpecialAddressLatency and just move this into
260
// adjustSchedDependency for the targets that care about it.
261
if (SpecialAddressLatency != 0 && !UnitLatencies) {
262
MachineInstr *UseMI = UseSU->getInstr();
263
const TargetInstrDesc &UseTID = UseMI->getDesc();
264
int RegUseIndex = UseMI->findRegisterUseOperandIdx(Reg);
265
assert(RegUseIndex >= 0 && "UseMI doesn's use register!");
266
if ((UseTID.mayLoad() || UseTID.mayStore()) &&
267
(unsigned)RegUseIndex < UseTID.getNumOperands() &&
268
UseTID.OpInfo[RegUseIndex].isLookupPtrRegClass())
269
LDataLatency += SpecialAddressLatency;
271
// Adjust the dependence latency using operand def/use
272
// information (if any), and then allow the target to
273
// perform its own adjustments.
274
const SDep& dep = SDep(SU, SDep::Data, LDataLatency, Reg);
275
if (!UnitLatencies) {
276
ComputeOperandLatency(SU, UseSU, const_cast<SDep &>(dep));
277
ST.adjustSchedDependency(SU, UseSU, const_cast<SDep &>(dep));
254
281
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
255
282
std::vector<SUnit *> &UseList = Uses[*Alias];
256
283
for (unsigned i = 0, e = UseList.size(); i != e; ++i) {
257
284
SUnit *UseSU = UseList[i];
259
const SDep& dep = SDep(SU, SDep::Data, DataLatency, *Alias);
260
if (!UnitLatencies) {
261
ComputeOperandLatency(SU, UseSU, (SDep &)dep);
262
ST.adjustSchedDependency(SU, UseSU, (SDep &)dep);
287
const SDep& dep = SDep(SU, SDep::Data, DataLatency, *Alias);
288
if (!UnitLatencies) {
289
ComputeOperandLatency(SU, UseSU, const_cast<SDep &>(dep));
290
ST.adjustSchedDependency(SU, UseSU, const_cast<SDep &>(dep));
567
602
BB->insert(InsertPos, SU->getInstr());
603
for (unsigned i = 0, e = SU->DbgInstrList.size() ; i < e ; ++i)
604
BB->insert(InsertPos, SU->DbgInstrList[i]);
570
607
// Update the Begin iterator, as the first instruction in the block
571
608
// may have been scheduled later.
572
if (!Sequence.empty())
609
if (!DbgValueVec.empty()) {
610
for (int i = DbgValueVec.size()-1; i>=0; --i)
611
if (DbgValueVec[i]!=0) {
612
Begin = DbgValueVec[DbgValueVec.size()-1];
615
} else if (!Sequence.empty())
573
616
Begin = Sequence[0]->getInstr();