1 //===----- ScheduleDAGFast.cpp - Fast poor list scheduler -----------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This implements a fast scheduler.
11 //===----------------------------------------------------------------------===//
13 #include "InstrEmitter.h"
14 #include "ScheduleDAGSDNodes.h"
15 #include "SDNodeDbgValue.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/SmallSet.h"
18 #include "llvm/ADT/Statistic.h"
19 #include "llvm/CodeGen/SchedulerRegistry.h"
20 #include "llvm/CodeGen/SelectionDAGISel.h"
21 #include "llvm/CodeGen/TargetInstrInfo.h"
22 #include "llvm/CodeGen/TargetRegisterInfo.h"
23 #include "llvm/IR/DataLayout.h"
24 #include "llvm/IR/InlineAsm.h"
25 #include "llvm/Support/Debug.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/raw_ostream.h"
30 #define DEBUG_TYPE "pre-RA-sched"
32 STATISTIC(NumUnfolds
, "Number of nodes unfolded");
33 STATISTIC(NumDups
, "Number of duplicated nodes");
34 STATISTIC(NumPRCopies
, "Number of physical copies");
36 static RegisterScheduler
37 fastDAGScheduler("fast", "Fast suboptimal list scheduling",
38 createFastDAGScheduler
);
39 static RegisterScheduler
40 linearizeDAGScheduler("linearize", "Linearize DAG, no scheduling",
45 /// FastPriorityQueue - A degenerate priority queue that considers
46 /// all nodes to have the same priority.
48 struct FastPriorityQueue
{
49 SmallVector
<SUnit
*, 16> Queue
;
51 bool empty() const { return Queue
.empty(); }
58 if (empty()) return nullptr;
59 SUnit
*V
= Queue
.back();
65 //===----------------------------------------------------------------------===//
66 /// ScheduleDAGFast - The actual "fast" list scheduler implementation.
68 class ScheduleDAGFast
: public ScheduleDAGSDNodes
{
70 /// AvailableQueue - The priority queue to use for the available SUnits.
71 FastPriorityQueue AvailableQueue
;
73 /// LiveRegDefs - A set of physical registers and their definition
74 /// that are "live". These nodes must be scheduled before any other nodes that
75 /// modifies the registers can be scheduled.
77 std::vector
<SUnit
*> LiveRegDefs
;
78 std::vector
<unsigned> LiveRegCycles
;
81 ScheduleDAGFast(MachineFunction
&mf
)
82 : ScheduleDAGSDNodes(mf
) {}
84 void Schedule() override
;
86 /// AddPred - adds a predecessor edge to SUnit SU.
87 /// This returns true if this is a new predecessor.
88 void AddPred(SUnit
*SU
, const SDep
&D
) {
92 /// RemovePred - removes a predecessor edge from SUnit SU.
93 /// This returns true if an edge was removed.
94 void RemovePred(SUnit
*SU
, const SDep
&D
) {
99 void ReleasePred(SUnit
*SU
, SDep
*PredEdge
);
100 void ReleasePredecessors(SUnit
*SU
, unsigned CurCycle
);
101 void ScheduleNodeBottomUp(SUnit
*, unsigned);
102 SUnit
*CopyAndMoveSuccessors(SUnit
*);
103 void InsertCopiesAndMoveSuccs(SUnit
*, unsigned,
104 const TargetRegisterClass
*,
105 const TargetRegisterClass
*,
106 SmallVectorImpl
<SUnit
*>&);
107 bool DelayForLiveRegsBottomUp(SUnit
*, SmallVectorImpl
<unsigned>&);
108 void ListScheduleBottomUp();
110 /// forceUnitLatencies - The fast scheduler doesn't care about real latencies.
111 bool forceUnitLatencies() const override
{ return true; }
113 } // end anonymous namespace
116 /// Schedule - Schedule the DAG using list scheduling.
117 void ScheduleDAGFast::Schedule() {
118 LLVM_DEBUG(dbgs() << "********** List Scheduling **********\n");
121 LiveRegDefs
.resize(TRI
->getNumRegs(), nullptr);
122 LiveRegCycles
.resize(TRI
->getNumRegs(), 0);
124 // Build the scheduling graph.
125 BuildSchedGraph(nullptr);
129 // Execute the actual scheduling loop.
130 ListScheduleBottomUp();
133 //===----------------------------------------------------------------------===//
134 // Bottom-Up Scheduling
135 //===----------------------------------------------------------------------===//
137 /// ReleasePred - Decrement the NumSuccsLeft count of a predecessor. Add it to
138 /// the AvailableQueue if the count reaches zero. Also update its cycle bound.
139 void ScheduleDAGFast::ReleasePred(SUnit
*SU
, SDep
*PredEdge
) {
140 SUnit
*PredSU
= PredEdge
->getSUnit();
143 if (PredSU
->NumSuccsLeft
== 0) {
144 dbgs() << "*** Scheduling failed! ***\n";
146 dbgs() << " has been released too many times!\n";
147 llvm_unreachable(nullptr);
150 --PredSU
->NumSuccsLeft
;
152 // If all the node's successors are scheduled, this node is ready
153 // to be scheduled. Ignore the special EntrySU node.
154 if (PredSU
->NumSuccsLeft
== 0 && PredSU
!= &EntrySU
) {
155 PredSU
->isAvailable
= true;
156 AvailableQueue
.push(PredSU
);
160 void ScheduleDAGFast::ReleasePredecessors(SUnit
*SU
, unsigned CurCycle
) {
161 // Bottom up: release predecessors
162 for (SDep
&Pred
: SU
->Preds
) {
163 ReleasePred(SU
, &Pred
);
164 if (Pred
.isAssignedRegDep()) {
165 // This is a physical register dependency and it's impossible or
166 // expensive to copy the register. Make sure nothing that can
167 // clobber the register is scheduled between the predecessor and
169 if (!LiveRegDefs
[Pred
.getReg()]) {
171 LiveRegDefs
[Pred
.getReg()] = Pred
.getSUnit();
172 LiveRegCycles
[Pred
.getReg()] = CurCycle
;
178 /// ScheduleNodeBottomUp - Add the node to the schedule. Decrement the pending
179 /// count of its predecessors. If a predecessor pending count is zero, add it to
180 /// the Available queue.
181 void ScheduleDAGFast::ScheduleNodeBottomUp(SUnit
*SU
, unsigned CurCycle
) {
182 LLVM_DEBUG(dbgs() << "*** Scheduling [" << CurCycle
<< "]: ");
183 LLVM_DEBUG(dumpNode(*SU
));
185 assert(CurCycle
>= SU
->getHeight() && "Node scheduled below its height!");
186 SU
->setHeightToAtLeast(CurCycle
);
187 Sequence
.push_back(SU
);
189 ReleasePredecessors(SU
, CurCycle
);
191 // Release all the implicit physical register defs that are live.
192 for (SDep
&Succ
: SU
->Succs
) {
193 if (Succ
.isAssignedRegDep()) {
194 if (LiveRegCycles
[Succ
.getReg()] == Succ
.getSUnit()->getHeight()) {
195 assert(NumLiveRegs
> 0 && "NumLiveRegs is already zero!");
196 assert(LiveRegDefs
[Succ
.getReg()] == SU
&&
197 "Physical register dependency violated?");
199 LiveRegDefs
[Succ
.getReg()] = nullptr;
200 LiveRegCycles
[Succ
.getReg()] = 0;
205 SU
->isScheduled
= true;
208 /// CopyAndMoveSuccessors - Clone the specified node and move its scheduled
209 /// successors to the newly created node.
210 SUnit
*ScheduleDAGFast::CopyAndMoveSuccessors(SUnit
*SU
) {
211 if (SU
->getNode()->getGluedNode())
214 SDNode
*N
= SU
->getNode();
219 bool TryUnfold
= false;
220 for (unsigned i
= 0, e
= N
->getNumValues(); i
!= e
; ++i
) {
221 MVT VT
= N
->getSimpleValueType(i
);
224 else if (VT
== MVT::Other
)
227 for (const SDValue
&Op
: N
->op_values()) {
228 MVT VT
= Op
.getNode()->getSimpleValueType(Op
.getResNo());
234 SmallVector
<SDNode
*, 2> NewNodes
;
235 if (!TII
->unfoldMemoryOperand(*DAG
, N
, NewNodes
))
238 LLVM_DEBUG(dbgs() << "Unfolding SU # " << SU
->NodeNum
<< "\n");
239 assert(NewNodes
.size() == 2 && "Expected a load folding node!");
242 SDNode
*LoadNode
= NewNodes
[0];
243 unsigned NumVals
= N
->getNumValues();
244 unsigned OldNumVals
= SU
->getNode()->getNumValues();
245 for (unsigned i
= 0; i
!= NumVals
; ++i
)
246 DAG
->ReplaceAllUsesOfValueWith(SDValue(SU
->getNode(), i
), SDValue(N
, i
));
247 DAG
->ReplaceAllUsesOfValueWith(SDValue(SU
->getNode(), OldNumVals
-1),
248 SDValue(LoadNode
, 1));
250 SUnit
*NewSU
= newSUnit(N
);
251 assert(N
->getNodeId() == -1 && "Node already inserted!");
252 N
->setNodeId(NewSU
->NodeNum
);
254 const MCInstrDesc
&MCID
= TII
->get(N
->getMachineOpcode());
255 for (unsigned i
= 0; i
!= MCID
.getNumOperands(); ++i
) {
256 if (MCID
.getOperandConstraint(i
, MCOI::TIED_TO
) != -1) {
257 NewSU
->isTwoAddress
= true;
261 if (MCID
.isCommutable())
262 NewSU
->isCommutable
= true;
264 // LoadNode may already exist. This can happen when there is another
265 // load from the same location and producing the same type of value
266 // but it has different alignment or volatileness.
267 bool isNewLoad
= true;
269 if (LoadNode
->getNodeId() != -1) {
270 LoadSU
= &SUnits
[LoadNode
->getNodeId()];
273 LoadSU
= newSUnit(LoadNode
);
274 LoadNode
->setNodeId(LoadSU
->NodeNum
);
278 SmallVector
<SDep
, 4> ChainSuccs
;
279 SmallVector
<SDep
, 4> LoadPreds
;
280 SmallVector
<SDep
, 4> NodePreds
;
281 SmallVector
<SDep
, 4> NodeSuccs
;
282 for (SDep
&Pred
: SU
->Preds
) {
285 else if (Pred
.getSUnit()->getNode() &&
286 Pred
.getSUnit()->getNode()->isOperandOf(LoadNode
))
287 LoadPreds
.push_back(Pred
);
289 NodePreds
.push_back(Pred
);
291 for (SDep
&Succ
: SU
->Succs
) {
293 ChainSuccs
.push_back(Succ
);
295 NodeSuccs
.push_back(Succ
);
298 if (ChainPred
.getSUnit()) {
299 RemovePred(SU
, ChainPred
);
301 AddPred(LoadSU
, ChainPred
);
303 for (unsigned i
= 0, e
= LoadPreds
.size(); i
!= e
; ++i
) {
304 const SDep
&Pred
= LoadPreds
[i
];
305 RemovePred(SU
, Pred
);
307 AddPred(LoadSU
, Pred
);
310 for (unsigned i
= 0, e
= NodePreds
.size(); i
!= e
; ++i
) {
311 const SDep
&Pred
= NodePreds
[i
];
312 RemovePred(SU
, Pred
);
313 AddPred(NewSU
, Pred
);
315 for (unsigned i
= 0, e
= NodeSuccs
.size(); i
!= e
; ++i
) {
316 SDep D
= NodeSuccs
[i
];
317 SUnit
*SuccDep
= D
.getSUnit();
319 RemovePred(SuccDep
, D
);
323 for (unsigned i
= 0, e
= ChainSuccs
.size(); i
!= e
; ++i
) {
324 SDep D
= ChainSuccs
[i
];
325 SUnit
*SuccDep
= D
.getSUnit();
327 RemovePred(SuccDep
, D
);
334 SDep
D(LoadSU
, SDep::Barrier
);
335 D
.setLatency(LoadSU
->Latency
);
341 if (NewSU
->NumSuccsLeft
== 0) {
342 NewSU
->isAvailable
= true;
348 LLVM_DEBUG(dbgs() << "Duplicating SU # " << SU
->NodeNum
<< "\n");
351 // New SUnit has the exact same predecessors.
352 for (SDep
&Pred
: SU
->Preds
)
353 if (!Pred
.isArtificial())
354 AddPred(NewSU
, Pred
);
356 // Only copy scheduled successors. Cut them from old node's successor
357 // list and move them over.
358 SmallVector
<std::pair
<SUnit
*, SDep
>, 4> DelDeps
;
359 for (SDep
&Succ
: SU
->Succs
) {
360 if (Succ
.isArtificial())
362 SUnit
*SuccSU
= Succ
.getSUnit();
363 if (SuccSU
->isScheduled
) {
368 DelDeps
.push_back(std::make_pair(SuccSU
, D
));
371 for (unsigned i
= 0, e
= DelDeps
.size(); i
!= e
; ++i
)
372 RemovePred(DelDeps
[i
].first
, DelDeps
[i
].second
);
378 /// InsertCopiesAndMoveSuccs - Insert register copies and move all
379 /// scheduled successors of the given SUnit to the last copy.
380 void ScheduleDAGFast::InsertCopiesAndMoveSuccs(SUnit
*SU
, unsigned Reg
,
381 const TargetRegisterClass
*DestRC
,
382 const TargetRegisterClass
*SrcRC
,
383 SmallVectorImpl
<SUnit
*> &Copies
) {
384 SUnit
*CopyFromSU
= newSUnit(static_cast<SDNode
*>(nullptr));
385 CopyFromSU
->CopySrcRC
= SrcRC
;
386 CopyFromSU
->CopyDstRC
= DestRC
;
388 SUnit
*CopyToSU
= newSUnit(static_cast<SDNode
*>(nullptr));
389 CopyToSU
->CopySrcRC
= DestRC
;
390 CopyToSU
->CopyDstRC
= SrcRC
;
392 // Only copy scheduled successors. Cut them from old node's successor
393 // list and move them over.
394 SmallVector
<std::pair
<SUnit
*, SDep
>, 4> DelDeps
;
395 for (SDep
&Succ
: SU
->Succs
) {
396 if (Succ
.isArtificial())
398 SUnit
*SuccSU
= Succ
.getSUnit();
399 if (SuccSU
->isScheduled
) {
401 D
.setSUnit(CopyToSU
);
403 DelDeps
.push_back(std::make_pair(SuccSU
, Succ
));
406 for (unsigned i
= 0, e
= DelDeps
.size(); i
!= e
; ++i
) {
407 RemovePred(DelDeps
[i
].first
, DelDeps
[i
].second
);
409 SDep
FromDep(SU
, SDep::Data
, Reg
);
410 FromDep
.setLatency(SU
->Latency
);
411 AddPred(CopyFromSU
, FromDep
);
412 SDep
ToDep(CopyFromSU
, SDep::Data
, 0);
413 ToDep
.setLatency(CopyFromSU
->Latency
);
414 AddPred(CopyToSU
, ToDep
);
416 Copies
.push_back(CopyFromSU
);
417 Copies
.push_back(CopyToSU
);
422 /// getPhysicalRegisterVT - Returns the ValueType of the physical register
423 /// definition of the specified node.
424 /// FIXME: Move to SelectionDAG?
425 static MVT
getPhysicalRegisterVT(SDNode
*N
, unsigned Reg
,
426 const TargetInstrInfo
*TII
) {
428 if (N
->getOpcode() == ISD::CopyFromReg
) {
429 // CopyFromReg has: "chain, Val, glue" so operand 1 gives the type.
432 const MCInstrDesc
&MCID
= TII
->get(N
->getMachineOpcode());
433 assert(MCID
.ImplicitDefs
&& "Physical reg def must be in implicit def list!");
434 NumRes
= MCID
.getNumDefs();
435 for (const MCPhysReg
*ImpDef
= MCID
.getImplicitDefs(); *ImpDef
; ++ImpDef
) {
441 return N
->getSimpleValueType(NumRes
);
444 /// CheckForLiveRegDef - Return true and update live register vector if the
445 /// specified register def of the specified SUnit clobbers any "live" registers.
446 static bool CheckForLiveRegDef(SUnit
*SU
, unsigned Reg
,
447 std::vector
<SUnit
*> &LiveRegDefs
,
448 SmallSet
<unsigned, 4> &RegAdded
,
449 SmallVectorImpl
<unsigned> &LRegs
,
450 const TargetRegisterInfo
*TRI
) {
452 for (MCRegAliasIterator
AI(Reg
, TRI
, true); AI
.isValid(); ++AI
) {
453 if (LiveRegDefs
[*AI
] && LiveRegDefs
[*AI
] != SU
) {
454 if (RegAdded
.insert(*AI
).second
) {
455 LRegs
.push_back(*AI
);
463 /// DelayForLiveRegsBottomUp - Returns true if it is necessary to delay
464 /// scheduling of the given node to satisfy live physical register dependencies.
465 /// If the specific node is the last one that's available to schedule, do
466 /// whatever is necessary (i.e. backtracking or cloning) to make it possible.
467 bool ScheduleDAGFast::DelayForLiveRegsBottomUp(SUnit
*SU
,
468 SmallVectorImpl
<unsigned> &LRegs
){
469 if (NumLiveRegs
== 0)
472 SmallSet
<unsigned, 4> RegAdded
;
473 // If this node would clobber any "live" register, then it's not ready.
474 for (SDep
&Pred
: SU
->Preds
) {
475 if (Pred
.isAssignedRegDep()) {
476 CheckForLiveRegDef(Pred
.getSUnit(), Pred
.getReg(), LiveRegDefs
,
477 RegAdded
, LRegs
, TRI
);
481 for (SDNode
*Node
= SU
->getNode(); Node
; Node
= Node
->getGluedNode()) {
482 if (Node
->getOpcode() == ISD::INLINEASM
||
483 Node
->getOpcode() == ISD::INLINEASM_BR
) {
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 (Register::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(DAG
->getTarget(), BB
, InsertPos
);
764 DenseMap
<SDValue
, Register
> 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
->isEmitted())
780 if (auto *DbgMI
= Emitter
.EmitDbgValue(DV
, VRBaseMap
))
781 BB
->insert(InsertPos
, DbgMI
);
786 LLVM_DEBUG(dbgs() << '\n');
788 InsertPos
= Emitter
.getInsertPos();
789 return Emitter
.getBlock();
792 //===----------------------------------------------------------------------===//
793 // Public Constructor Functions
794 //===----------------------------------------------------------------------===//
796 llvm::ScheduleDAGSDNodes
*
797 llvm::createFastDAGScheduler(SelectionDAGISel
*IS
, CodeGenOpt::Level
) {
798 return new ScheduleDAGFast(*IS
->MF
);
801 llvm::ScheduleDAGSDNodes
*
802 llvm::createDAGLinearizer(SelectionDAGISel
*IS
, CodeGenOpt::Level
) {
803 return new ScheduleDAGLinearize(*IS
->MF
);