1 //===----- ScheduleDAGFast.cpp - Fast poor list scheduler -----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This implements a fast scheduler.
12 //===----------------------------------------------------------------------===//
14 #include "InstrEmitter.h"
15 #include "ScheduleDAGSDNodes.h"
16 #include "SDNodeDbgValue.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/SmallSet.h"
19 #include "llvm/ADT/Statistic.h"
20 #include "llvm/CodeGen/SchedulerRegistry.h"
21 #include "llvm/CodeGen/SelectionDAGISel.h"
22 #include "llvm/CodeGen/TargetInstrInfo.h"
23 #include "llvm/CodeGen/TargetRegisterInfo.h"
24 #include "llvm/IR/DataLayout.h"
25 #include "llvm/IR/InlineAsm.h"
26 #include "llvm/Support/Debug.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/raw_ostream.h"
31 #define DEBUG_TYPE "pre-RA-sched"
33 STATISTIC(NumUnfolds
, "Number of nodes unfolded");
34 STATISTIC(NumDups
, "Number of duplicated nodes");
35 STATISTIC(NumPRCopies
, "Number of physical copies");
37 static RegisterScheduler
38 fastDAGScheduler("fast", "Fast suboptimal list scheduling",
39 createFastDAGScheduler
);
40 static RegisterScheduler
41 linearizeDAGScheduler("linearize", "Linearize DAG, no scheduling",
46 /// FastPriorityQueue - A degenerate priority queue that considers
47 /// all nodes to have the same priority.
49 struct FastPriorityQueue
{
50 SmallVector
<SUnit
*, 16> Queue
;
52 bool empty() const { return Queue
.empty(); }
59 if (empty()) return nullptr;
60 SUnit
*V
= Queue
.back();
66 //===----------------------------------------------------------------------===//
67 /// ScheduleDAGFast - The actual "fast" list scheduler implementation.
69 class ScheduleDAGFast
: public ScheduleDAGSDNodes
{
71 /// AvailableQueue - The priority queue to use for the available SUnits.
72 FastPriorityQueue AvailableQueue
;
74 /// LiveRegDefs - A set of physical registers and their definition
75 /// that are "live". These nodes must be scheduled before any other nodes that
76 /// modifies the registers can be scheduled.
78 std::vector
<SUnit
*> LiveRegDefs
;
79 std::vector
<unsigned> LiveRegCycles
;
82 ScheduleDAGFast(MachineFunction
&mf
)
83 : ScheduleDAGSDNodes(mf
) {}
85 void Schedule() override
;
87 /// AddPred - adds a predecessor edge to SUnit SU.
88 /// This returns true if this is a new predecessor.
89 void AddPred(SUnit
*SU
, const SDep
&D
) {
93 /// RemovePred - removes a predecessor edge from SUnit SU.
94 /// This returns true if an edge was removed.
95 void RemovePred(SUnit
*SU
, const SDep
&D
) {
100 void ReleasePred(SUnit
*SU
, SDep
*PredEdge
);
101 void ReleasePredecessors(SUnit
*SU
, unsigned CurCycle
);
102 void ScheduleNodeBottomUp(SUnit
*, unsigned);
103 SUnit
*CopyAndMoveSuccessors(SUnit
*);
104 void InsertCopiesAndMoveSuccs(SUnit
*, unsigned,
105 const TargetRegisterClass
*,
106 const TargetRegisterClass
*,
107 SmallVectorImpl
<SUnit
*>&);
108 bool DelayForLiveRegsBottomUp(SUnit
*, SmallVectorImpl
<unsigned>&);
109 void ListScheduleBottomUp();
111 /// forceUnitLatencies - The fast scheduler doesn't care about real latencies.
112 bool forceUnitLatencies() const override
{ return true; }
114 } // end anonymous namespace
117 /// Schedule - Schedule the DAG using list scheduling.
118 void ScheduleDAGFast::Schedule() {
119 LLVM_DEBUG(dbgs() << "********** List Scheduling **********\n");
122 LiveRegDefs
.resize(TRI
->getNumRegs(), nullptr);
123 LiveRegCycles
.resize(TRI
->getNumRegs(), 0);
125 // Build the scheduling graph.
126 BuildSchedGraph(nullptr);
130 // Execute the actual scheduling loop.
131 ListScheduleBottomUp();
134 //===----------------------------------------------------------------------===//
135 // Bottom-Up Scheduling
136 //===----------------------------------------------------------------------===//
138 /// ReleasePred - Decrement the NumSuccsLeft count of a predecessor. Add it to
139 /// the AvailableQueue if the count reaches zero. Also update its cycle bound.
140 void ScheduleDAGFast::ReleasePred(SUnit
*SU
, SDep
*PredEdge
) {
141 SUnit
*PredSU
= PredEdge
->getSUnit();
144 if (PredSU
->NumSuccsLeft
== 0) {
145 dbgs() << "*** Scheduling failed! ***\n";
147 dbgs() << " has been released too many times!\n";
148 llvm_unreachable(nullptr);
151 --PredSU
->NumSuccsLeft
;
153 // If all the node's successors are scheduled, this node is ready
154 // to be scheduled. Ignore the special EntrySU node.
155 if (PredSU
->NumSuccsLeft
== 0 && PredSU
!= &EntrySU
) {
156 PredSU
->isAvailable
= true;
157 AvailableQueue
.push(PredSU
);
161 void ScheduleDAGFast::ReleasePredecessors(SUnit
*SU
, unsigned CurCycle
) {
162 // Bottom up: release predecessors
163 for (SDep
&Pred
: SU
->Preds
) {
164 ReleasePred(SU
, &Pred
);
165 if (Pred
.isAssignedRegDep()) {
166 // This is a physical register dependency and it's impossible or
167 // expensive to copy the register. Make sure nothing that can
168 // clobber the register is scheduled between the predecessor and
170 if (!LiveRegDefs
[Pred
.getReg()]) {
172 LiveRegDefs
[Pred
.getReg()] = Pred
.getSUnit();
173 LiveRegCycles
[Pred
.getReg()] = CurCycle
;
179 /// ScheduleNodeBottomUp - Add the node to the schedule. Decrement the pending
180 /// count of its predecessors. If a predecessor pending count is zero, add it to
181 /// the Available queue.
182 void ScheduleDAGFast::ScheduleNodeBottomUp(SUnit
*SU
, unsigned CurCycle
) {
183 LLVM_DEBUG(dbgs() << "*** Scheduling [" << CurCycle
<< "]: ");
184 LLVM_DEBUG(dumpNode(*SU
));
186 assert(CurCycle
>= SU
->getHeight() && "Node scheduled below its height!");
187 SU
->setHeightToAtLeast(CurCycle
);
188 Sequence
.push_back(SU
);
190 ReleasePredecessors(SU
, CurCycle
);
192 // Release all the implicit physical register defs that are live.
193 for (SDep
&Succ
: SU
->Succs
) {
194 if (Succ
.isAssignedRegDep()) {
195 if (LiveRegCycles
[Succ
.getReg()] == Succ
.getSUnit()->getHeight()) {
196 assert(NumLiveRegs
> 0 && "NumLiveRegs is already zero!");
197 assert(LiveRegDefs
[Succ
.getReg()] == SU
&&
198 "Physical register dependency violated?");
200 LiveRegDefs
[Succ
.getReg()] = nullptr;
201 LiveRegCycles
[Succ
.getReg()] = 0;
206 SU
->isScheduled
= true;
209 /// CopyAndMoveSuccessors - Clone the specified node and move its scheduled
210 /// successors to the newly created node.
211 SUnit
*ScheduleDAGFast::CopyAndMoveSuccessors(SUnit
*SU
) {
212 if (SU
->getNode()->getGluedNode())
215 SDNode
*N
= SU
->getNode();
220 bool TryUnfold
= false;
221 for (unsigned i
= 0, e
= N
->getNumValues(); i
!= e
; ++i
) {
222 MVT VT
= N
->getSimpleValueType(i
);
225 else if (VT
== MVT::Other
)
228 for (const SDValue
&Op
: N
->op_values()) {
229 MVT VT
= Op
.getNode()->getSimpleValueType(Op
.getResNo());
235 SmallVector
<SDNode
*, 2> NewNodes
;
236 if (!TII
->unfoldMemoryOperand(*DAG
, N
, NewNodes
))
239 LLVM_DEBUG(dbgs() << "Unfolding SU # " << SU
->NodeNum
<< "\n");
240 assert(NewNodes
.size() == 2 && "Expected a load folding node!");
243 SDNode
*LoadNode
= NewNodes
[0];
244 unsigned NumVals
= N
->getNumValues();
245 unsigned OldNumVals
= SU
->getNode()->getNumValues();
246 for (unsigned i
= 0; i
!= NumVals
; ++i
)
247 DAG
->ReplaceAllUsesOfValueWith(SDValue(SU
->getNode(), i
), SDValue(N
, i
));
248 DAG
->ReplaceAllUsesOfValueWith(SDValue(SU
->getNode(), OldNumVals
-1),
249 SDValue(LoadNode
, 1));
251 SUnit
*NewSU
= newSUnit(N
);
252 assert(N
->getNodeId() == -1 && "Node already inserted!");
253 N
->setNodeId(NewSU
->NodeNum
);
255 const MCInstrDesc
&MCID
= TII
->get(N
->getMachineOpcode());
256 for (unsigned i
= 0; i
!= MCID
.getNumOperands(); ++i
) {
257 if (MCID
.getOperandConstraint(i
, MCOI::TIED_TO
) != -1) {
258 NewSU
->isTwoAddress
= true;
262 if (MCID
.isCommutable())
263 NewSU
->isCommutable
= true;
265 // LoadNode may already exist. This can happen when there is another
266 // load from the same location and producing the same type of value
267 // but it has different alignment or volatileness.
268 bool isNewLoad
= true;
270 if (LoadNode
->getNodeId() != -1) {
271 LoadSU
= &SUnits
[LoadNode
->getNodeId()];
274 LoadSU
= newSUnit(LoadNode
);
275 LoadNode
->setNodeId(LoadSU
->NodeNum
);
279 SmallVector
<SDep
, 4> ChainSuccs
;
280 SmallVector
<SDep
, 4> LoadPreds
;
281 SmallVector
<SDep
, 4> NodePreds
;
282 SmallVector
<SDep
, 4> NodeSuccs
;
283 for (SDep
&Pred
: SU
->Preds
) {
286 else if (Pred
.getSUnit()->getNode() &&
287 Pred
.getSUnit()->getNode()->isOperandOf(LoadNode
))
288 LoadPreds
.push_back(Pred
);
290 NodePreds
.push_back(Pred
);
292 for (SDep
&Succ
: SU
->Succs
) {
294 ChainSuccs
.push_back(Succ
);
296 NodeSuccs
.push_back(Succ
);
299 if (ChainPred
.getSUnit()) {
300 RemovePred(SU
, ChainPred
);
302 AddPred(LoadSU
, ChainPred
);
304 for (unsigned i
= 0, e
= LoadPreds
.size(); i
!= e
; ++i
) {
305 const SDep
&Pred
= LoadPreds
[i
];
306 RemovePred(SU
, Pred
);
308 AddPred(LoadSU
, Pred
);
311 for (unsigned i
= 0, e
= NodePreds
.size(); i
!= e
; ++i
) {
312 const SDep
&Pred
= NodePreds
[i
];
313 RemovePred(SU
, Pred
);
314 AddPred(NewSU
, Pred
);
316 for (unsigned i
= 0, e
= NodeSuccs
.size(); i
!= e
; ++i
) {
317 SDep D
= NodeSuccs
[i
];
318 SUnit
*SuccDep
= D
.getSUnit();
320 RemovePred(SuccDep
, D
);
324 for (unsigned i
= 0, e
= ChainSuccs
.size(); i
!= e
; ++i
) {
325 SDep D
= ChainSuccs
[i
];
326 SUnit
*SuccDep
= D
.getSUnit();
328 RemovePred(SuccDep
, D
);
335 SDep
D(LoadSU
, SDep::Barrier
);
336 D
.setLatency(LoadSU
->Latency
);
342 if (NewSU
->NumSuccsLeft
== 0) {
343 NewSU
->isAvailable
= true;
349 LLVM_DEBUG(dbgs() << "Duplicating SU # " << SU
->NodeNum
<< "\n");
352 // New SUnit has the exact same predecessors.
353 for (SDep
&Pred
: SU
->Preds
)
354 if (!Pred
.isArtificial())
355 AddPred(NewSU
, Pred
);
357 // Only copy scheduled successors. Cut them from old node's successor
358 // list and move them over.
359 SmallVector
<std::pair
<SUnit
*, SDep
>, 4> DelDeps
;
360 for (SDep
&Succ
: SU
->Succs
) {
361 if (Succ
.isArtificial())
363 SUnit
*SuccSU
= Succ
.getSUnit();
364 if (SuccSU
->isScheduled
) {
369 DelDeps
.push_back(std::make_pair(SuccSU
, D
));
372 for (unsigned i
= 0, e
= DelDeps
.size(); i
!= e
; ++i
)
373 RemovePred(DelDeps
[i
].first
, DelDeps
[i
].second
);
379 /// InsertCopiesAndMoveSuccs - Insert register copies and move all
380 /// scheduled successors of the given SUnit to the last copy.
381 void ScheduleDAGFast::InsertCopiesAndMoveSuccs(SUnit
*SU
, unsigned Reg
,
382 const TargetRegisterClass
*DestRC
,
383 const TargetRegisterClass
*SrcRC
,
384 SmallVectorImpl
<SUnit
*> &Copies
) {
385 SUnit
*CopyFromSU
= newSUnit(static_cast<SDNode
*>(nullptr));
386 CopyFromSU
->CopySrcRC
= SrcRC
;
387 CopyFromSU
->CopyDstRC
= DestRC
;
389 SUnit
*CopyToSU
= newSUnit(static_cast<SDNode
*>(nullptr));
390 CopyToSU
->CopySrcRC
= DestRC
;
391 CopyToSU
->CopyDstRC
= SrcRC
;
393 // Only copy scheduled successors. Cut them from old node's successor
394 // list and move them over.
395 SmallVector
<std::pair
<SUnit
*, SDep
>, 4> DelDeps
;
396 for (SDep
&Succ
: SU
->Succs
) {
397 if (Succ
.isArtificial())
399 SUnit
*SuccSU
= Succ
.getSUnit();
400 if (SuccSU
->isScheduled
) {
402 D
.setSUnit(CopyToSU
);
404 DelDeps
.push_back(std::make_pair(SuccSU
, Succ
));
407 for (unsigned i
= 0, e
= DelDeps
.size(); i
!= e
; ++i
) {
408 RemovePred(DelDeps
[i
].first
, DelDeps
[i
].second
);
410 SDep
FromDep(SU
, SDep::Data
, Reg
);
411 FromDep
.setLatency(SU
->Latency
);
412 AddPred(CopyFromSU
, FromDep
);
413 SDep
ToDep(CopyFromSU
, SDep::Data
, 0);
414 ToDep
.setLatency(CopyFromSU
->Latency
);
415 AddPred(CopyToSU
, ToDep
);
417 Copies
.push_back(CopyFromSU
);
418 Copies
.push_back(CopyToSU
);
423 /// getPhysicalRegisterVT - Returns the ValueType of the physical register
424 /// definition of the specified node.
425 /// FIXME: Move to SelectionDAG?
426 static MVT
getPhysicalRegisterVT(SDNode
*N
, unsigned Reg
,
427 const TargetInstrInfo
*TII
) {
429 if (N
->getOpcode() == ISD::CopyFromReg
) {
430 // CopyFromReg has: "chain, Val, glue" so operand 1 gives the type.
433 const MCInstrDesc
&MCID
= TII
->get(N
->getMachineOpcode());
434 assert(MCID
.ImplicitDefs
&& "Physical reg def must be in implicit def list!");
435 NumRes
= MCID
.getNumDefs();
436 for (const MCPhysReg
*ImpDef
= MCID
.getImplicitDefs(); *ImpDef
; ++ImpDef
) {
442 return N
->getSimpleValueType(NumRes
);
445 /// CheckForLiveRegDef - Return true and update live register vector if the
446 /// specified register def of the specified SUnit clobbers any "live" registers.
447 static bool CheckForLiveRegDef(SUnit
*SU
, unsigned Reg
,
448 std::vector
<SUnit
*> &LiveRegDefs
,
449 SmallSet
<unsigned, 4> &RegAdded
,
450 SmallVectorImpl
<unsigned> &LRegs
,
451 const TargetRegisterInfo
*TRI
) {
453 for (MCRegAliasIterator
AI(Reg
, TRI
, true); AI
.isValid(); ++AI
) {
454 if (LiveRegDefs
[*AI
] && LiveRegDefs
[*AI
] != SU
) {
455 if (RegAdded
.insert(*AI
).second
) {
456 LRegs
.push_back(*AI
);
464 /// DelayForLiveRegsBottomUp - Returns true if it is necessary to delay
465 /// scheduling of the given node to satisfy live physical register dependencies.
466 /// If the specific node is the last one that's available to schedule, do
467 /// whatever is necessary (i.e. backtracking or cloning) to make it possible.
468 bool ScheduleDAGFast::DelayForLiveRegsBottomUp(SUnit
*SU
,
469 SmallVectorImpl
<unsigned> &LRegs
){
470 if (NumLiveRegs
== 0)
473 SmallSet
<unsigned, 4> RegAdded
;
474 // If this node would clobber any "live" register, then it's not ready.
475 for (SDep
&Pred
: SU
->Preds
) {
476 if (Pred
.isAssignedRegDep()) {
477 CheckForLiveRegDef(Pred
.getSUnit(), Pred
.getReg(), LiveRegDefs
,
478 RegAdded
, LRegs
, TRI
);
482 for (SDNode
*Node
= SU
->getNode(); Node
; Node
= Node
->getGluedNode()) {
483 if (Node
->getOpcode() == ISD::INLINEASM
) {
484 // Inline asm can clobber physical defs.
485 unsigned NumOps
= Node
->getNumOperands();
486 if (Node
->getOperand(NumOps
-1).getValueType() == MVT::Glue
)
487 --NumOps
; // Ignore the glue operand.
489 for (unsigned i
= InlineAsm::Op_FirstOperand
; i
!= NumOps
;) {
491 cast
<ConstantSDNode
>(Node
->getOperand(i
))->getZExtValue();
492 unsigned NumVals
= InlineAsm::getNumOperandRegisters(Flags
);
494 ++i
; // Skip the ID value.
495 if (InlineAsm::isRegDefKind(Flags
) ||
496 InlineAsm::isRegDefEarlyClobberKind(Flags
) ||
497 InlineAsm::isClobberKind(Flags
)) {
498 // Check for def of register or earlyclobber register.
499 for (; NumVals
; --NumVals
, ++i
) {
500 unsigned Reg
= cast
<RegisterSDNode
>(Node
->getOperand(i
))->getReg();
501 if (TargetRegisterInfo::isPhysicalRegister(Reg
))
502 CheckForLiveRegDef(SU
, Reg
, LiveRegDefs
, RegAdded
, LRegs
, TRI
);
509 if (!Node
->isMachineOpcode())
511 const MCInstrDesc
&MCID
= TII
->get(Node
->getMachineOpcode());
512 if (!MCID
.ImplicitDefs
)
514 for (const MCPhysReg
*Reg
= MCID
.getImplicitDefs(); *Reg
; ++Reg
) {
515 CheckForLiveRegDef(SU
, *Reg
, LiveRegDefs
, RegAdded
, LRegs
, TRI
);
518 return !LRegs
.empty();
522 /// ListScheduleBottomUp - The main loop of list scheduling for bottom-up
524 void ScheduleDAGFast::ListScheduleBottomUp() {
525 unsigned CurCycle
= 0;
527 // Release any predecessors of the special Exit node.
528 ReleasePredecessors(&ExitSU
, CurCycle
);
530 // Add root to Available queue.
531 if (!SUnits
.empty()) {
532 SUnit
*RootSU
= &SUnits
[DAG
->getRoot().getNode()->getNodeId()];
533 assert(RootSU
->Succs
.empty() && "Graph root shouldn't have successors!");
534 RootSU
->isAvailable
= true;
535 AvailableQueue
.push(RootSU
);
538 // While Available queue is not empty, grab the node with the highest
539 // priority. If it is not ready put it back. Schedule the node.
540 SmallVector
<SUnit
*, 4> NotReady
;
541 DenseMap
<SUnit
*, SmallVector
<unsigned, 4> > LRegsMap
;
542 Sequence
.reserve(SUnits
.size());
543 while (!AvailableQueue
.empty()) {
544 bool Delayed
= false;
546 SUnit
*CurSU
= AvailableQueue
.pop();
548 SmallVector
<unsigned, 4> LRegs
;
549 if (!DelayForLiveRegsBottomUp(CurSU
, LRegs
))
552 LRegsMap
.insert(std::make_pair(CurSU
, LRegs
));
554 CurSU
->isPending
= true; // This SU is not in AvailableQueue right now.
555 NotReady
.push_back(CurSU
);
556 CurSU
= AvailableQueue
.pop();
559 // All candidates are delayed due to live physical reg dependencies.
560 // Try code duplication or inserting cross class copies
562 if (Delayed
&& !CurSU
) {
564 // Try duplicating the nodes that produces these
565 // "expensive to copy" values to break the dependency. In case even
566 // that doesn't work, insert cross class copies.
567 SUnit
*TrySU
= NotReady
[0];
568 SmallVectorImpl
<unsigned> &LRegs
= LRegsMap
[TrySU
];
569 assert(LRegs
.size() == 1 && "Can't handle this yet!");
570 unsigned Reg
= LRegs
[0];
571 SUnit
*LRDef
= LiveRegDefs
[Reg
];
572 MVT VT
= getPhysicalRegisterVT(LRDef
->getNode(), Reg
, TII
);
573 const TargetRegisterClass
*RC
=
574 TRI
->getMinimalPhysRegClass(Reg
, VT
);
575 const TargetRegisterClass
*DestRC
= TRI
->getCrossCopyRegClass(RC
);
577 // If cross copy register class is the same as RC, then it must be
578 // possible copy the value directly. Do not try duplicate the def.
579 // If cross copy register class is not the same as RC, then it's
580 // possible to copy the value but it require cross register class copies
581 // and it is expensive.
582 // If cross copy register class is null, then it's not possible to copy
584 SUnit
*NewDef
= nullptr;
586 NewDef
= CopyAndMoveSuccessors(LRDef
);
587 if (!DestRC
&& !NewDef
)
588 report_fatal_error("Can't handle live physical "
589 "register dependency!");
592 // Issue copies, these can be expensive cross register class copies.
593 SmallVector
<SUnit
*, 2> Copies
;
594 InsertCopiesAndMoveSuccs(LRDef
, Reg
, DestRC
, RC
, Copies
);
595 LLVM_DEBUG(dbgs() << "Adding an edge from SU # " << TrySU
->NodeNum
596 << " to SU #" << Copies
.front()->NodeNum
<< "\n");
597 AddPred(TrySU
, SDep(Copies
.front(), SDep::Artificial
));
598 NewDef
= Copies
.back();
601 LLVM_DEBUG(dbgs() << "Adding an edge from SU # " << NewDef
->NodeNum
602 << " to SU #" << TrySU
->NodeNum
<< "\n");
603 LiveRegDefs
[Reg
] = NewDef
;
604 AddPred(NewDef
, SDep(TrySU
, SDep::Artificial
));
605 TrySU
->isAvailable
= false;
610 llvm_unreachable("Unable to resolve live physical register dependencies!");
614 // Add the nodes that aren't ready back onto the available list.
615 for (unsigned i
= 0, e
= NotReady
.size(); i
!= e
; ++i
) {
616 NotReady
[i
]->isPending
= false;
617 // May no longer be available due to backtracking.
618 if (NotReady
[i
]->isAvailable
)
619 AvailableQueue
.push(NotReady
[i
]);
624 ScheduleNodeBottomUp(CurSU
, CurCycle
);
628 // Reverse the order since it is bottom up.
629 std::reverse(Sequence
.begin(), Sequence
.end());
632 VerifyScheduledSequence(/*isBottomUp=*/true);
638 //===----------------------------------------------------------------------===//
639 // ScheduleDAGLinearize - No scheduling scheduler, it simply linearize the
640 // DAG in topological order.
641 // IMPORTANT: this may not work for targets with phyreg dependency.
643 class ScheduleDAGLinearize
: public ScheduleDAGSDNodes
{
645 ScheduleDAGLinearize(MachineFunction
&mf
) : ScheduleDAGSDNodes(mf
) {}
647 void Schedule() override
;
650 EmitSchedule(MachineBasicBlock::iterator
&InsertPos
) override
;
653 std::vector
<SDNode
*> Sequence
;
654 DenseMap
<SDNode
*, SDNode
*> GluedMap
; // Cache glue to its user
656 void ScheduleNode(SDNode
*N
);
658 } // end anonymous namespace
660 void ScheduleDAGLinearize::ScheduleNode(SDNode
*N
) {
661 if (N
->getNodeId() != 0)
662 llvm_unreachable(nullptr);
664 if (!N
->isMachineOpcode() &&
665 (N
->getOpcode() == ISD::EntryToken
|| isPassiveNode(N
)))
666 // These nodes do not need to be translated into MIs.
669 LLVM_DEBUG(dbgs() << "\n*** Scheduling: ");
670 LLVM_DEBUG(N
->dump(DAG
));
671 Sequence
.push_back(N
);
673 unsigned NumOps
= N
->getNumOperands();
674 if (unsigned NumLeft
= NumOps
) {
675 SDNode
*GluedOpN
= nullptr;
677 const SDValue
&Op
= N
->getOperand(NumLeft
-1);
678 SDNode
*OpN
= Op
.getNode();
680 if (NumLeft
== NumOps
&& Op
.getValueType() == MVT::Glue
) {
681 // Schedule glue operand right above N.
683 assert(OpN
->getNodeId() != 0 && "Glue operand not ready?");
690 // Glue operand is already scheduled.
693 DenseMap
<SDNode
*, SDNode
*>::iterator DI
= GluedMap
.find(OpN
);
694 if (DI
!= GluedMap
.end() && DI
->second
!= N
)
695 // Users of glues are counted against the glued users.
698 unsigned Degree
= OpN
->getNodeId();
699 assert(Degree
> 0 && "Predecessor over-released!");
700 OpN
->setNodeId(--Degree
);
707 /// findGluedUser - Find the representative use of a glue value by walking
709 static SDNode
*findGluedUser(SDNode
*N
) {
710 while (SDNode
*Glued
= N
->getGluedUser())
715 void ScheduleDAGLinearize::Schedule() {
716 LLVM_DEBUG(dbgs() << "********** DAG Linearization **********\n");
718 SmallVector
<SDNode
*, 8> Glues
;
719 unsigned DAGSize
= 0;
720 for (SDNode
&Node
: DAG
->allnodes()) {
723 // Use node id to record degree.
724 unsigned Degree
= N
->use_size();
725 N
->setNodeId(Degree
);
726 unsigned NumVals
= N
->getNumValues();
727 if (NumVals
&& N
->getValueType(NumVals
-1) == MVT::Glue
&&
728 N
->hasAnyUseOfValue(NumVals
-1)) {
729 SDNode
*User
= findGluedUser(N
);
732 GluedMap
.insert(std::make_pair(N
, User
));
736 if (N
->isMachineOpcode() ||
737 (N
->getOpcode() != ISD::EntryToken
&& !isPassiveNode(N
)))
741 for (unsigned i
= 0, e
= Glues
.size(); i
!= e
; ++i
) {
742 SDNode
*Glue
= Glues
[i
];
743 SDNode
*GUser
= GluedMap
[Glue
];
744 unsigned Degree
= Glue
->getNodeId();
745 unsigned UDegree
= GUser
->getNodeId();
747 // Glue user must be scheduled together with the glue operand. So other
748 // users of the glue operand must be treated as its users.
749 SDNode
*ImmGUser
= Glue
->getGluedUser();
750 for (const SDNode
*U
: Glue
->uses())
753 GUser
->setNodeId(UDegree
+ Degree
);
757 Sequence
.reserve(DAGSize
);
758 ScheduleNode(DAG
->getRoot().getNode());
762 ScheduleDAGLinearize::EmitSchedule(MachineBasicBlock::iterator
&InsertPos
) {
763 InstrEmitter
Emitter(BB
, InsertPos
);
764 DenseMap
<SDValue
, unsigned> VRBaseMap
;
766 LLVM_DEBUG({ dbgs() << "\n*** Final schedule ***\n"; });
768 unsigned NumNodes
= Sequence
.size();
769 MachineBasicBlock
*BB
= Emitter
.getBlock();
770 for (unsigned i
= 0; i
!= NumNodes
; ++i
) {
771 SDNode
*N
= Sequence
[NumNodes
-i
-1];
772 LLVM_DEBUG(N
->dump(DAG
));
773 Emitter
.EmitNode(N
, false, false, VRBaseMap
);
775 // Emit any debug values associated with the node.
776 if (N
->getHasDebugValue()) {
777 MachineBasicBlock::iterator InsertPos
= Emitter
.getInsertPos();
778 for (auto DV
: DAG
->GetDbgValues(N
)) {
779 if (DV
->isInvalidated())
781 if (auto *DbgMI
= Emitter
.EmitDbgValue(DV
, VRBaseMap
))
782 BB
->insert(InsertPos
, DbgMI
);
783 DV
->setIsInvalidated();
788 LLVM_DEBUG(dbgs() << '\n');
790 InsertPos
= Emitter
.getInsertPos();
791 return Emitter
.getBlock();
794 //===----------------------------------------------------------------------===//
795 // Public Constructor Functions
796 //===----------------------------------------------------------------------===//
798 llvm::ScheduleDAGSDNodes
*
799 llvm::createFastDAGScheduler(SelectionDAGISel
*IS
, CodeGenOpt::Level
) {
800 return new ScheduleDAGFast(*IS
->MF
);
803 llvm::ScheduleDAGSDNodes
*
804 llvm::createDAGLinearizer(SelectionDAGISel
*IS
, CodeGenOpt::Level
) {
805 return new ScheduleDAGLinearize(*IS
->MF
);