LLVM 22.0.0git
ScheduleDAGSDNodes.cpp
Go to the documentation of this file.
1//===--- ScheduleDAGSDNodes.cpp - Implement the ScheduleDAGSDNodes class --===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the ScheduleDAG class, which is a base class used by
10// scheduling implementation classes.
11//
12//===----------------------------------------------------------------------===//
13
14#include "ScheduleDAGSDNodes.h"
15#include "InstrEmitter.h"
16#include "SDNodeDbgValue.h"
17#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/SmallSet.h"
21#include "llvm/ADT/Statistic.h"
29#include "llvm/Config/llvm-config.h"
33#include "llvm/Support/Debug.h"
36using namespace llvm;
37
38#define DEBUG_TYPE "pre-RA-sched"
39
40STATISTIC(LoadsClustered, "Number of loads clustered together");
41
42// This allows the latency-based scheduler to notice high latency instructions
43// without a target itinerary. The choice of number here has more to do with
44// balancing scheduler heuristics than with the actual machine latency.
46 "sched-high-latency-cycles", cl::Hidden, cl::init(10),
47 cl::desc("Roughly estimate the number of cycles that 'long latency' "
48 "instructions take for targets with no itinerary"));
49
51 : ScheduleDAG(mf), InstrItins(mf.getSubtarget().getInstrItineraryData()) {}
52
53/// Run - perform scheduling.
54///
56 BB = bb;
57 DAG = dag;
58
59 // Clear the scheduler's SUnit DAG.
61 Sequence.clear();
62
63 // Invoke the target's selection of scheduler.
64 Schedule();
65}
66
67/// NewSUnit - Creates a new SUnit and return a ptr to it.
68///
70#ifndef NDEBUG
71 const SUnit *Addr = nullptr;
72 if (!SUnits.empty())
73 Addr = &SUnits[0];
74#endif
75 SUnits.emplace_back(N, (unsigned)SUnits.size());
76 assert((Addr == nullptr || Addr == &SUnits[0]) &&
77 "SUnits std::vector reallocated on the fly!");
78 SUnits.back().OrigNode = &SUnits.back();
79 SUnit *SU = &SUnits.back();
81 if (!N ||
82 (N->isMachineOpcode() &&
83 N->getMachineOpcode() == TargetOpcode::IMPLICIT_DEF))
85 else
87 return SU;
88}
89
91 SUnit *SU = newSUnit(Old->getNode());
92 SU->OrigNode = Old->OrigNode;
93 SU->Latency = Old->Latency;
94 SU->isVRegCycle = Old->isVRegCycle;
95 SU->isCall = Old->isCall;
96 SU->isCallOp = Old->isCallOp;
97 SU->isTwoAddress = Old->isTwoAddress;
98 SU->isCommutable = Old->isCommutable;
102 SU->isScheduleLow = Old->isScheduleLow;
104 Old->isCloned = true;
105 return SU;
106}
107
108/// CheckForPhysRegDependency - Check if the dependency between def and use of
109/// a specified operand is a physical register dependency. If so, returns the
110/// register and the cost of copying the register.
111static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op,
112 const TargetRegisterInfo *TRI,
113 const TargetInstrInfo *TII,
114 const TargetLowering &TLI,
115 MCRegister &PhysReg, int &Cost) {
116 if (Op != 2 || User->getOpcode() != ISD::CopyToReg)
117 return;
118
119 Register Reg = cast<RegisterSDNode>(User->getOperand(1))->getReg();
120 if (TLI.checkForPhysRegDependency(Def, User, Op, TRI, TII, PhysReg, Cost))
121 return;
122
123 if (Reg.isVirtual())
124 return;
125
126 unsigned ResNo = User->getOperand(2).getResNo();
127 if (Def->getOpcode() == ISD::CopyFromReg &&
128 cast<RegisterSDNode>(Def->getOperand(1))->getReg() == Reg) {
129 PhysReg = Reg;
130 } else if (Def->isMachineOpcode()) {
131 const MCInstrDesc &II = TII->get(Def->getMachineOpcode());
132 if (ResNo >= II.getNumDefs() && II.hasImplicitDefOfPhysReg(Reg))
133 PhysReg = Reg;
134 }
135
136 if (PhysReg) {
137 const TargetRegisterClass *RC =
138 TRI->getMinimalPhysRegClass(Reg, Def->getSimpleValueType(ResNo));
139 Cost = RC->getCopyCost();
140 }
141}
142
143// Helper for AddGlue to clone node operands.
145 SDValue ExtraOper = SDValue()) {
146 SmallVector<SDValue, 8> Ops(N->ops());
147 if (ExtraOper.getNode())
148 Ops.push_back(ExtraOper);
149
150 SDVTList VTList = DAG->getVTList(VTs);
151 MachineSDNode *MN = dyn_cast<MachineSDNode>(N);
152
153 // Store memory references.
155 if (MN)
156 MMOs.assign(MN->memoperands_begin(), MN->memoperands_end());
157
158 DAG->MorphNodeTo(N, N->getOpcode(), VTList, Ops);
159
160 // Reset the memory references
161 if (MN)
162 DAG->setNodeMemRefs(MN, MMOs);
163}
164
165static bool AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) {
166 SDNode *GlueDestNode = Glue.getNode();
167
168 // Don't add glue from a node to itself.
169 if (GlueDestNode == N) return false;
170
171 // Don't add a glue operand to something that already uses glue.
172 if (GlueDestNode &&
173 N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue) {
174 return false;
175 }
176 // Don't add glue to something that already has a glue value.
177 if (N->getValueType(N->getNumValues() - 1) == MVT::Glue) return false;
178
179 SmallVector<EVT, 4> VTs(N->values());
180 if (AddGlue)
181 VTs.push_back(MVT::Glue);
182
183 CloneNodeWithValues(N, DAG, VTs, Glue);
184
185 return true;
186}
187
188// Cleanup after unsuccessful AddGlue. Use the standard method of morphing the
189// node even though simply shrinking the value list is sufficient.
191 assert((N->getValueType(N->getNumValues() - 1) == MVT::Glue &&
192 !N->hasAnyUseOfValue(N->getNumValues() - 1)) &&
193 "expected an unused glue value");
194
196 ArrayRef(N->value_begin(), N->getNumValues() - 1));
197}
198
199/// ClusterNeighboringLoads - Force nearby loads together by "gluing" them.
200/// This function finds loads of the same base and different offsets. If the
201/// offsets are not far apart (target specific), it add MVT::Glue inputs and
202/// outputs to ensure they are scheduled together and in order. This
203/// optimization may benefit some targets by improving cache locality.
204void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {
205 SDValue Chain;
206 unsigned NumOps = Node->getNumOperands();
207 if (Node->getOperand(NumOps-1).getValueType() == MVT::Other)
208 Chain = Node->getOperand(NumOps-1);
209 if (!Chain)
210 return;
211
212 // Skip any load instruction that has a tied input. There may be an additional
213 // dependency requiring a different order than by increasing offsets, and the
214 // added glue may introduce a cycle.
215 auto hasTiedInput = [this](const SDNode *N) {
216 const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
217 for (unsigned I = 0; I != MCID.getNumOperands(); ++I) {
218 if (MCID.getOperandConstraint(I, MCOI::TIED_TO) != -1)
219 return true;
220 }
221
222 return false;
223 };
224
225 // Look for other loads of the same chain. Find loads that are loading from
226 // the same base pointer and different offsets.
229 DenseMap<long long, SDNode*> O2SMap; // Map from offset to SDNode.
230 bool Cluster = false;
231 SDNode *Base = Node;
232
233 if (hasTiedInput(Base))
234 return;
235
236 // This algorithm requires a reasonably low use count before finding a match
237 // to avoid uselessly blowing up compile time in large blocks.
238 unsigned UseCount = 0;
239 for (SDNode::user_iterator I = Chain->user_begin(), E = Chain->user_end();
240 I != E && UseCount < 100; ++I, ++UseCount) {
241 if (I.getUse().getResNo() != Chain.getResNo())
242 continue;
243
244 SDNode *User = *I;
245 if (User == Node || !Visited.insert(User).second)
246 continue;
247 int64_t Offset1, Offset2;
248 if (!TII->areLoadsFromSameBasePtr(Base, User, Offset1, Offset2) ||
249 Offset1 == Offset2 ||
250 hasTiedInput(User)) {
251 // FIXME: Should be ok if they addresses are identical. But earlier
252 // optimizations really should have eliminated one of the loads.
253 continue;
254 }
255 if (O2SMap.insert(std::make_pair(Offset1, Base)).second)
256 Offsets.push_back(Offset1);
257 O2SMap.insert(std::make_pair(Offset2, User));
258 Offsets.push_back(Offset2);
259 if (Offset2 < Offset1)
260 Base = User;
261 Cluster = true;
262 // Reset UseCount to allow more matches.
263 UseCount = 0;
264 }
265
266 if (!Cluster)
267 return;
268
269 // Sort them in increasing order.
270 llvm::sort(Offsets);
271
272 // Check if the loads are close enough.
274 unsigned NumLoads = 0;
275 int64_t BaseOff = Offsets[0];
276 SDNode *BaseLoad = O2SMap[BaseOff];
277 Loads.push_back(BaseLoad);
278 for (unsigned i = 1, e = Offsets.size(); i != e; ++i) {
279 int64_t Offset = Offsets[i];
280 SDNode *Load = O2SMap[Offset];
281 if (!TII->shouldScheduleLoadsNear(BaseLoad, Load, BaseOff, Offset,NumLoads))
282 break; // Stop right here. Ignore loads that are further away.
283 Loads.push_back(Load);
284 ++NumLoads;
285 }
286
287 if (NumLoads == 0)
288 return;
289
290 // Cluster loads by adding MVT::Glue outputs and inputs. This also
291 // ensure they are scheduled in order of increasing addresses.
292 SDNode *Lead = Loads[0];
293 SDValue InGlue;
294 if (AddGlue(Lead, InGlue, true, DAG))
295 InGlue = SDValue(Lead, Lead->getNumValues() - 1);
296 for (unsigned I = 1, E = Loads.size(); I != E; ++I) {
297 bool OutGlue = I < E - 1;
298 SDNode *Load = Loads[I];
299
300 // If AddGlue fails, we could leave an unsused glue value. This should not
301 // cause any
302 if (AddGlue(Load, InGlue, OutGlue, DAG)) {
303 if (OutGlue)
304 InGlue = SDValue(Load, Load->getNumValues() - 1);
305
306 ++LoadsClustered;
307 }
308 else if (!OutGlue && InGlue.getNode())
309 RemoveUnusedGlue(InGlue.getNode(), DAG);
310 }
311}
312
313/// ClusterNodes - Cluster certain nodes which should be scheduled together.
314///
315void ScheduleDAGSDNodes::ClusterNodes() {
316 for (SDNode &NI : DAG->allnodes()) {
317 SDNode *Node = &NI;
318 if (!Node || !Node->isMachineOpcode())
319 continue;
320
321 unsigned Opc = Node->getMachineOpcode();
322 const MCInstrDesc &MCID = TII->get(Opc);
323 if (MCID.mayLoad())
324 // Cluster loads from "near" addresses into combined SUnits.
325 ClusterNeighboringLoads(Node);
326 }
327}
328
329void ScheduleDAGSDNodes::BuildSchedUnits() {
330 // During scheduling, the NodeId field of SDNode is used to map SDNodes
331 // to their associated SUnits by holding SUnits table indices. A value
332 // of -1 means the SDNode does not yet have an associated SUnit.
333 unsigned NumNodes = 0;
334 for (SDNode &NI : DAG->allnodes()) {
335 NI.setNodeId(-1);
336 ++NumNodes;
337 }
338
339 // Reserve entries in the vector for each of the SUnits we are creating. This
340 // ensure that reallocation of the vector won't happen, so SUnit*'s won't get
341 // invalidated.
342 // FIXME: Multiply by 2 because we may clone nodes during scheduling.
343 // This is a temporary workaround.
344 SUnits.reserve(NumNodes * 2);
345
346 // Add all nodes in depth first order.
349 Worklist.push_back(DAG->getRoot().getNode());
350 Visited.insert(DAG->getRoot().getNode());
351
352 SmallVector<SUnit*, 8> CallSUnits;
353 while (!Worklist.empty()) {
354 SDNode *NI = Worklist.pop_back_val();
355
356 // Add all operands to the worklist unless they've already been added.
357 for (const SDValue &Op : NI->op_values())
358 if (Visited.insert(Op.getNode()).second)
359 Worklist.push_back(Op.getNode());
360
361 if (isPassiveNode(NI)) // Leaf node, e.g. a TargetImmediate.
362 continue;
363
364 // If this node has already been processed, stop now.
365 if (NI->getNodeId() != -1) continue;
366
367 SUnit *NodeSUnit = newSUnit(NI);
368
369 // See if anything is glued to this node, if so, add them to glued
370 // nodes. Nodes can have at most one glue input and one glue output. Glue
371 // is required to be the last operand and result of a node.
372
373 // Scan up to find glued preds.
374 SDNode *N = NI;
375 while (N->getNumOperands() &&
376 N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue) {
377 N = N->getOperand(N->getNumOperands()-1).getNode();
378 assert(N->getNodeId() == -1 && "Node already inserted!");
379 N->setNodeId(NodeSUnit->NodeNum);
380 if (N->isMachineOpcode() && TII->get(N->getMachineOpcode()).isCall())
381 NodeSUnit->isCall = true;
382 }
383
384 // Scan down to find any glued succs.
385 N = NI;
386 while (N->getValueType(N->getNumValues()-1) == MVT::Glue) {
387 SDValue GlueVal(N, N->getNumValues()-1);
388
389 // There are either zero or one users of the Glue result.
390 bool HasGlueUse = false;
391 for (SDNode *U : N->users())
392 if (GlueVal.isOperandOf(U)) {
393 HasGlueUse = true;
394 assert(N->getNodeId() == -1 && "Node already inserted!");
395 N->setNodeId(NodeSUnit->NodeNum);
396 N = U;
397 if (N->isMachineOpcode() && TII->get(N->getMachineOpcode()).isCall())
398 NodeSUnit->isCall = true;
399 break;
400 }
401 if (!HasGlueUse) break;
402 }
403
404 if (NodeSUnit->isCall)
405 CallSUnits.push_back(NodeSUnit);
406
407 // Schedule zero-latency TokenFactor below any nodes that may increase the
408 // schedule height. Otherwise, ancestors of the TokenFactor may appear to
409 // have false stalls.
410 if (NI->getOpcode() == ISD::TokenFactor)
411 NodeSUnit->isScheduleLow = true;
412
413 // If there are glue operands involved, N is now the bottom-most node
414 // of the sequence of nodes that are glued together.
415 // Update the SUnit.
416 NodeSUnit->setNode(N);
417 assert(N->getNodeId() == -1 && "Node already inserted!");
418 N->setNodeId(NodeSUnit->NodeNum);
419
420 // Compute NumRegDefsLeft. This must be done before AddSchedEdges.
421 InitNumRegDefsLeft(NodeSUnit);
422
423 // Assign the Latency field of NodeSUnit using target-provided information.
424 computeLatency(NodeSUnit);
425 }
426
427 // Find all call operands.
428 while (!CallSUnits.empty()) {
429 SUnit *SU = CallSUnits.pop_back_val();
430 for (const SDNode *SUNode = SU->getNode(); SUNode;
431 SUNode = SUNode->getGluedNode()) {
432 if (SUNode->getOpcode() != ISD::CopyToReg)
433 continue;
434 SDNode *SrcN = SUNode->getOperand(2).getNode();
435 if (isPassiveNode(SrcN)) continue; // Not scheduled.
436 SUnit *SrcSU = &SUnits[SrcN->getNodeId()];
437 SrcSU->isCallOp = true;
438 }
439 }
440}
441
442void ScheduleDAGSDNodes::AddSchedEdges() {
444
445 // Check to see if the scheduler cares about latencies.
446 bool UnitLatencies = forceUnitLatencies();
447
448 // Pass 2: add the preds, succs, etc.
449 for (SUnit &SU : SUnits) {
450 SDNode *MainNode = SU.getNode();
451
452 if (MainNode->isMachineOpcode()) {
453 unsigned Opc = MainNode->getMachineOpcode();
454 const MCInstrDesc &MCID = TII->get(Opc);
455 for (unsigned i = 0; i != MCID.getNumOperands(); ++i) {
456 if (MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1) {
457 SU.isTwoAddress = true;
458 break;
459 }
460 }
461 if (MCID.isCommutable())
462 SU.isCommutable = true;
463 }
464
465 // Find all predecessors and successors of the group.
466 for (SDNode *N = SU.getNode(); N; N = N->getGluedNode()) {
467 if (N->isMachineOpcode() &&
468 !TII->get(N->getMachineOpcode()).implicit_defs().empty()) {
469 SU.hasPhysRegClobbers = true;
470 unsigned NumUsed = InstrEmitter::CountResults(N);
471 while (NumUsed != 0 && !N->hasAnyUseOfValue(NumUsed - 1))
472 --NumUsed; // Skip over unused values at the end.
473 if (NumUsed > TII->get(N->getMachineOpcode()).getNumDefs())
474 SU.hasPhysRegDefs = true;
475 }
476
477 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
478 SDNode *OpN = N->getOperand(i).getNode();
479 unsigned DefIdx = N->getOperand(i).getResNo();
480 if (isPassiveNode(OpN)) continue; // Not scheduled.
481 SUnit *OpSU = &SUnits[OpN->getNodeId()];
482 assert(OpSU && "Node has no SUnit!");
483 if (OpSU == &SU)
484 continue; // In the same group.
485
486 EVT OpVT = N->getOperand(i).getValueType();
487 assert(OpVT != MVT::Glue && "Glued nodes should be in same sunit!");
488 bool isChain = OpVT == MVT::Other;
489
490 MCRegister PhysReg;
491 int Cost = 1;
492 // Determine if this is a physical register dependency.
494 CheckForPhysRegDependency(OpN, N, i, TRI, TII, TLI, PhysReg, Cost);
495 assert((!PhysReg || !isChain) && "Chain dependence via physreg data?");
496 // FIXME: See ScheduleDAGSDNodes::EmitCopyFromReg. For now, scheduler
497 // emits a copy from the physical register to a virtual register unless
498 // it requires a cross class copy (cost < 0). That means we are only
499 // treating "expensive to copy" register dependency as physical register
500 // dependency. This may change in the future though.
501 if (Cost >= 0 && !StressSched)
502 PhysReg = MCRegister();
503
504 // If this is a ctrl dep, latency is 1.
505 unsigned OpLatency = isChain ? 1 : OpSU->Latency;
506 // Special-case TokenFactor chains as zero-latency.
507 if(isChain && OpN->getOpcode() == ISD::TokenFactor)
508 OpLatency = 0;
509
510 SDep Dep = isChain ? SDep(OpSU, SDep::Barrier)
511 : SDep(OpSU, SDep::Data, PhysReg);
512 Dep.setLatency(OpLatency);
513 if (!isChain && !UnitLatencies) {
514 computeOperandLatency(OpN, N, i, Dep);
515 ST.adjustSchedDependency(OpSU, DefIdx, &SU, i, Dep, nullptr);
516 }
517
518 if (!SU.addPred(Dep) && !Dep.isCtrl() && OpSU->NumRegDefsLeft > 1) {
519 // Multiple register uses are combined in the same SUnit. For example,
520 // we could have a set of glued nodes with all their defs consumed by
521 // another set of glued nodes. Register pressure tracking sees this as
522 // a single use, so to keep pressure balanced we reduce the defs.
523 //
524 // We can't tell (without more book-keeping) if this results from
525 // glued nodes or duplicate operands. As long as we don't reduce
526 // NumRegDefsLeft to zero, we handle the common cases well.
527 --OpSU->NumRegDefsLeft;
528 }
529 }
530 }
531 }
532}
533
534/// BuildSchedGraph - Build the SUnit graph from the selection dag that we
535/// are input. This SUnit graph is similar to the SelectionDAG, but
536/// excludes nodes that aren't interesting to scheduling, and represents
537/// glued together nodes with a single SUnit.
539 // Cluster certain nodes which should be scheduled together.
540 ClusterNodes();
541 // Populate the SUnits array.
542 BuildSchedUnits();
543 // Compute all the scheduling dependencies between nodes.
544 AddSchedEdges();
545}
546
547// Initialize NumNodeDefs for the current Node's opcode.
548void ScheduleDAGSDNodes::RegDefIter::InitNodeNumDefs() {
549 // Check for phys reg copy.
550 if (!Node)
551 return;
552
553 if (!Node->isMachineOpcode()) {
554 if (Node->getOpcode() == ISD::CopyFromReg)
555 NodeNumDefs = 1;
556 else
557 NodeNumDefs = 0;
558 return;
559 }
560 unsigned POpc = Node->getMachineOpcode();
561 if (POpc == TargetOpcode::IMPLICIT_DEF) {
562 // No register need be allocated for this.
563 NodeNumDefs = 0;
564 return;
565 }
566 if (POpc == TargetOpcode::PATCHPOINT &&
567 Node->getValueType(0) == MVT::Other) {
568 // PATCHPOINT is defined to have one result, but it might really have none
569 // if we're not using CallingConv::AnyReg. Don't mistake the chain for a
570 // real definition.
571 NodeNumDefs = 0;
572 return;
573 }
574 unsigned NRegDefs = SchedDAG->TII->get(Node->getMachineOpcode()).getNumDefs();
575 // Some instructions define regs that are not represented in the selection DAG
576 // (e.g. unused flags). See tMOVi8. Make sure we don't access past NumValues.
577 NodeNumDefs = std::min(Node->getNumValues(), NRegDefs);
578 DefIdx = 0;
579}
580
581// Construct a RegDefIter for this SUnit and find the first valid value.
583 const ScheduleDAGSDNodes *SD)
584 : SchedDAG(SD), Node(SU->getNode()) {
585 InitNodeNumDefs();
586 Advance();
587}
588
589// Advance to the next valid value defined by the SUnit.
591 for (;Node;) { // Visit all glued nodes.
592 for (;DefIdx < NodeNumDefs; ++DefIdx) {
593 if (!Node->hasAnyUseOfValue(DefIdx))
594 continue;
595 ValueType = Node->getSimpleValueType(DefIdx);
596 ++DefIdx;
597 return; // Found a normal regdef.
598 }
599 Node = Node->getGluedNode();
600 if (!Node) {
601 return; // No values left to visit.
602 }
603 InitNodeNumDefs();
604 }
605}
606
608 assert(SU->NumRegDefsLeft == 0 && "expect a new node");
609 for (RegDefIter I(SU, this); I.IsValid(); I.Advance()) {
610 assert(SU->NumRegDefsLeft < USHRT_MAX && "overflow is ok but unexpected");
611 ++SU->NumRegDefsLeft;
612 }
613}
614
616 SDNode *N = SU->getNode();
617
618 // TokenFactor operands are considered zero latency, and some schedulers
619 // (e.g. Top-Down list) may rely on the fact that operand latency is nonzero
620 // whenever node latency is nonzero.
621 if (N && N->getOpcode() == ISD::TokenFactor) {
622 SU->Latency = 0;
623 return;
624 }
625
626 // Check to see if the scheduler cares about latencies.
627 if (forceUnitLatencies()) {
628 SU->Latency = 1;
629 return;
630 }
631
632 if (!InstrItins || InstrItins->isEmpty()) {
633 if (N && N->isMachineOpcode() &&
634 TII->isHighLatencyDef(N->getMachineOpcode()))
636 else
637 SU->Latency = 1;
638 return;
639 }
640
641 // Compute the latency for the node. We use the sum of the latencies for
642 // all nodes glued together into this SUnit.
643 SU->Latency = 0;
644 for (SDNode *N = SU->getNode(); N; N = N->getGluedNode())
645 if (N->isMachineOpcode())
647}
648
650 unsigned OpIdx, SDep& dep) const{
651 // Check to see if the scheduler cares about latencies.
652 if (forceUnitLatencies())
653 return;
654
655 if (dep.getKind() != SDep::Data)
656 return;
657
658 unsigned DefIdx = Use->getOperand(OpIdx).getResNo();
659 if (Use->isMachineOpcode())
660 // Adjust the use operand index by num of defs.
661 OpIdx += TII->get(Use->getMachineOpcode()).getNumDefs();
662 std::optional<unsigned> Latency =
663 TII->getOperandLatency(InstrItins, Def, DefIdx, Use, OpIdx);
664 if (Latency > 1U && Use->getOpcode() == ISD::CopyToReg &&
665 !BB->succ_empty()) {
666 Register Reg = cast<RegisterSDNode>(Use->getOperand(1))->getReg();
667 if (Reg.isVirtual())
668 // This copy is a liveout value. It is likely coalesced, so reduce the
669 // latency so not to penalize the def.
670 // FIXME: need target specific adjustment here?
671 Latency = *Latency - 1;
672 }
673 if (Latency)
674 dep.setLatency(*Latency);
675}
676
677void ScheduleDAGSDNodes::dumpNode(const SUnit &SU) const {
678#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
679 dumpNodeName(SU);
680 dbgs() << ": ";
681
682 if (!SU.getNode()) {
683 dbgs() << "PHYS REG COPY\n";
684 return;
685 }
686
687 SU.getNode()->dump(DAG);
688 dbgs() << "\n";
689 SmallVector<SDNode *, 4> GluedNodes;
690 for (SDNode *N = SU.getNode()->getGluedNode(); N; N = N->getGluedNode())
691 GluedNodes.push_back(N);
692 while (!GluedNodes.empty()) {
693 dbgs() << " ";
694 GluedNodes.back()->dump(DAG);
695 dbgs() << "\n";
696 GluedNodes.pop_back();
697 }
698#endif
699}
700
702#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
703 if (EntrySU.getNode() != nullptr)
705 for (const SUnit &SU : SUnits)
706 dumpNodeAll(SU);
707 if (ExitSU.getNode() != nullptr)
709#endif
710}
711
712#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
714 for (const SUnit *SU : Sequence) {
715 if (SU)
716 dumpNode(*SU);
717 else
718 dbgs() << "**** NOOP ****\n";
719 }
720}
721#endif
722
723#ifndef NDEBUG
724/// VerifyScheduledSequence - Verify that all SUnits were scheduled and that
725/// their state is consistent with the nodes listed in Sequence.
726///
728 unsigned ScheduledNodes = ScheduleDAG::VerifyScheduledDAG(isBottomUp);
729 unsigned Noops = llvm::count(Sequence, nullptr);
730 assert(Sequence.size() - Noops == ScheduledNodes &&
731 "The number of nodes scheduled doesn't match the expected number!");
732}
733#endif // NDEBUG
734
735/// ProcessSDDbgValues - Process SDDbgValues associated with this node.
736static void
738 SmallVectorImpl<std::pair<unsigned, MachineInstr*> > &Orders,
739 InstrEmitter::VRBaseMapType &VRBaseMap, unsigned Order) {
740 if (!N->getHasDebugValue())
741 return;
742
743 /// Returns true if \p DV has any VReg operand locations which don't exist in
744 /// VRBaseMap.
745 auto HasUnknownVReg = [&VRBaseMap](SDDbgValue *DV) {
746 for (const SDDbgOperand &L : DV->getLocationOps()) {
747 if (L.getKind() == SDDbgOperand::SDNODE &&
748 VRBaseMap.count({L.getSDNode(), L.getResNo()}) == 0)
749 return true;
750 }
751 return false;
752 };
753
754 // Opportunistically insert immediate dbg_value uses, i.e. those with the same
755 // source order number as N.
756 MachineBasicBlock *BB = Emitter.getBlock();
757 MachineBasicBlock::iterator InsertPos = Emitter.getInsertPos();
758 for (auto *DV : DAG->GetDbgValues(N)) {
759 if (DV->isEmitted())
760 continue;
761 unsigned DVOrder = DV->getOrder();
762 if (Order != 0 && DVOrder != Order)
763 continue;
764 // If DV has any VReg location operands which haven't been mapped then
765 // either that node is no longer available or we just haven't visited the
766 // node yet. In the former case we should emit an undef dbg_value, but we
767 // can do it later. And for the latter we'll want to wait until all
768 // dependent nodes have been visited.
769 if (!DV->isInvalidated() && HasUnknownVReg(DV))
770 continue;
771 MachineInstr *DbgMI = Emitter.EmitDbgValue(DV, VRBaseMap);
772 if (!DbgMI)
773 continue;
774 Orders.push_back({DVOrder, DbgMI});
775 BB->insert(InsertPos, DbgMI);
776 }
777}
778
779// ProcessSourceNode - Process nodes with source order numbers. These are added
780// to a vector which EmitSchedule uses to determine how to insert dbg_value
781// instructions in the right order.
782static void
785 SmallVectorImpl<std::pair<unsigned, MachineInstr *>> &Orders,
786 SmallSet<Register, 8> &Seen, MachineInstr *NewInsn) {
787 unsigned Order = N->getIROrder();
788 if (!Order || Seen.count(Order)) {
789 // Process any valid SDDbgValues even if node does not have any order
790 // assigned.
791 ProcessSDDbgValues(N, DAG, Emitter, Orders, VRBaseMap, 0);
792 return;
793 }
794
795 // If a new instruction was generated for this Order number, record it.
796 // Otherwise, leave this order number unseen: we will either find later
797 // instructions for it, or leave it unseen if there were no instructions at
798 // all.
799 if (NewInsn) {
800 Seen.insert(Order);
801 Orders.push_back({Order, NewInsn});
802 }
803
804 // Even if no instruction was generated, a Value may have become defined via
805 // earlier nodes. Try to process them now.
806 ProcessSDDbgValues(N, DAG, Emitter, Orders, VRBaseMap, Order);
807}
808
809void ScheduleDAGSDNodes::
810EmitPhysRegCopy(SUnit *SU, SmallDenseMap<SUnit *, Register, 16> &VRBaseMap,
811 MachineBasicBlock::iterator InsertPos) {
812 for (const SDep &Pred : SU->Preds) {
813 if (Pred.isCtrl())
814 continue; // ignore chain preds
815 if (Pred.getSUnit()->CopyDstRC) {
816 // Copy to physical register.
818 VRBaseMap.find(Pred.getSUnit());
819 assert(VRI != VRBaseMap.end() && "Node emitted out of order - late");
820 // Find the destination physical register.
822 for (const SDep &Succ : SU->Succs) {
823 if (Succ.isCtrl())
824 continue; // ignore chain preds
825 if (Succ.getReg()) {
826 Reg = Succ.getReg();
827 break;
828 }
829 }
830 BuildMI(*BB, InsertPos, DebugLoc(), TII->get(TargetOpcode::COPY), Reg)
831 .addReg(VRI->second);
832 } else {
833 // Copy from physical register.
834 assert(Pred.getReg() && "Unknown physical register!");
836 bool isNew = VRBaseMap.insert(std::make_pair(SU, VRBase)).second;
837 (void)isNew; // Silence compiler warning.
838 assert(isNew && "Node emitted out of order - early");
839 BuildMI(*BB, InsertPos, DebugLoc(), TII->get(TargetOpcode::COPY), VRBase)
840 .addReg(Pred.getReg());
841 }
842 break;
843 }
844}
845
846/// EmitSchedule - Emit the machine code in scheduled order. Return the new
847/// InsertPos and MachineBasicBlock that contains this insertion
848/// point. ScheduleDAGSDNodes holds a BB pointer for convenience, but this does
849/// not necessarily refer to returned BB. The emitter may split blocks.
852 InstrEmitter Emitter(DAG->getTarget(), BB, InsertPos);
857 bool HasDbg = DAG->hasDebugValues();
858
859 // Emit a node, and determine where its first instruction is for debuginfo.
860 // Zero, one, or multiple instructions can be created when emitting a node.
861 auto EmitNode =
862 [&](SDNode *Node, bool IsClone, bool IsCloned,
864 // Fetch instruction prior to this, or end() if nonexistant.
865 auto GetPrevInsn = [&](MachineBasicBlock::iterator I) {
866 if (I == BB->begin())
867 return BB->end();
868 else
869 return std::prev(Emitter.getInsertPos());
870 };
871
872 MachineBasicBlock::iterator Before = GetPrevInsn(Emitter.getInsertPos());
873 Emitter.EmitNode(Node, IsClone, IsCloned, VRBaseMap);
874 MachineBasicBlock::iterator After = GetPrevInsn(Emitter.getInsertPos());
875
876 // If the iterator did not change, no instructions were inserted.
877 if (Before == After)
878 return nullptr;
879
881 if (Before == BB->end()) {
882 // There were no prior instructions; the new ones must start at the
883 // beginning of the block.
884 MI = &Emitter.getBlock()->instr_front();
885 } else {
886 // Return first instruction after the pre-existing instructions.
887 MI = &*std::next(Before);
888 }
889
890 if (MI->isCandidateForAdditionalCallInfo()) {
894
895 if (auto CalledGlobal = DAG->getCalledGlobal(Node))
896 if (CalledGlobal->Callee)
897 MF.addCalledGlobal(MI, *CalledGlobal);
898 }
899
900 if (DAG->getNoMergeSiteInfo(Node)) {
902 }
903
904 if (MDNode *MD = DAG->getPCSections(Node))
905 MI->setPCSections(MF, MD);
906
907 // Set MMRAs on _all_ added instructions.
908 if (MDNode *MMRA = DAG->getMMRAMetadata(Node)) {
909 for (MachineBasicBlock::iterator It = MI->getIterator(),
910 End = std::next(After);
911 It != End; ++It)
912 It->setMMRAMetadata(MF, MMRA);
913 }
914
915 return MI;
916 };
917
918 // If this is the first BB, emit byval parameter dbg_value's.
919 if (HasDbg && BB->getParent()->begin() == MachineFunction::iterator(BB)) {
922 for (; PDI != PDE; ++PDI) {
923 MachineInstr *DbgMI= Emitter.EmitDbgValue(*PDI, VRBaseMap);
924 if (DbgMI) {
925 BB->insert(InsertPos, DbgMI);
926 // We re-emit the dbg_value closer to its use, too, after instructions
927 // are emitted to the BB.
928 (*PDI)->clearIsEmitted();
929 }
930 }
931 }
932
933 for (SUnit *SU : Sequence) {
934 if (!SU) {
935 // Null SUnit* is a noop.
936 TII->insertNoop(*Emitter.getBlock(), InsertPos);
937 continue;
938 }
939
940 // For pre-regalloc scheduling, create instructions corresponding to the
941 // SDNode and any glued SDNodes and append them to the block.
942 if (!SU->getNode()) {
943 // Emit a copy.
944 EmitPhysRegCopy(SU, CopyVRBaseMap, InsertPos);
945 continue;
946 }
947
948 SmallVector<SDNode *, 4> GluedNodes;
949 for (SDNode *N = SU->getNode()->getGluedNode(); N; N = N->getGluedNode())
950 GluedNodes.push_back(N);
951 while (!GluedNodes.empty()) {
952 SDNode *N = GluedNodes.back();
953 auto NewInsn = EmitNode(N, SU->OrigNode != SU, SU->isCloned, VRBaseMap);
954 // Remember the source order of the inserted instruction.
955 if (HasDbg)
956 ProcessSourceNode(N, DAG, Emitter, VRBaseMap, Orders, Seen, NewInsn);
957
958 if (MDNode *MD = DAG->getHeapAllocSite(N))
959 if (NewInsn && NewInsn->isCall())
960 NewInsn->setHeapAllocMarker(MF, MD);
961
962 GluedNodes.pop_back();
963 }
964 auto NewInsn =
965 EmitNode(SU->getNode(), SU->OrigNode != SU, SU->isCloned, VRBaseMap);
966 // Remember the source order of the inserted instruction.
967 if (HasDbg)
968 ProcessSourceNode(SU->getNode(), DAG, Emitter, VRBaseMap, Orders, Seen,
969 NewInsn);
970
971 if (MDNode *MD = DAG->getHeapAllocSite(SU->getNode())) {
972 if (NewInsn && NewInsn->isCall())
973 NewInsn->setHeapAllocMarker(MF, MD);
974 }
975 }
976
977 // Insert all the dbg_values which have not already been inserted in source
978 // order sequence.
979 if (HasDbg) {
981
982 // Sort the source order instructions and use the order to insert debug
983 // values. Use stable_sort so that DBG_VALUEs are inserted in the same order
984 // regardless of the host's implementation fo std::sort.
985 llvm::stable_sort(Orders, less_first());
986 std::stable_sort(DAG->DbgBegin(), DAG->DbgEnd(),
987 [](const SDDbgValue *LHS, const SDDbgValue *RHS) {
988 return LHS->getOrder() < RHS->getOrder();
989 });
990
993 // Now emit the rest according to source order.
994 unsigned LastOrder = 0;
995 for (unsigned i = 0, e = Orders.size(); i != e && DI != DE; ++i) {
996 unsigned Order = Orders[i].first;
997 MachineInstr *MI = Orders[i].second;
998 // Insert all SDDbgValue's whose order(s) are before "Order".
999 assert(MI);
1000 for (; DI != DE; ++DI) {
1001 if ((*DI)->getOrder() < LastOrder || (*DI)->getOrder() >= Order)
1002 break;
1003 if ((*DI)->isEmitted())
1004 continue;
1005
1006 MachineInstr *DbgMI = Emitter.EmitDbgValue(*DI, VRBaseMap);
1007 if (DbgMI) {
1008 if (!LastOrder)
1009 // Insert to start of the BB (after PHIs).
1010 BB->insert(BBBegin, DbgMI);
1011 else {
1012 // Insert at the instruction, which may be in a different
1013 // block, if the block was split by a custom inserter.
1015 MI->getParent()->insert(Pos, DbgMI);
1016 }
1017 }
1018 }
1019 LastOrder = Order;
1020 }
1021 // Add trailing DbgValue's before the terminator. FIXME: May want to add
1022 // some of them before one or more conditional branches?
1024 for (; DI != DE; ++DI) {
1025 if ((*DI)->isEmitted())
1026 continue;
1027 assert((*DI)->getOrder() >= LastOrder &&
1028 "emitting DBG_VALUE out of order");
1029 if (MachineInstr *DbgMI = Emitter.EmitDbgValue(*DI, VRBaseMap))
1030 DbgMIs.push_back(DbgMI);
1031 }
1032
1033 MachineBasicBlock *InsertBB = Emitter.getBlock();
1035 InsertBB->insert(Pos, DbgMIs.begin(), DbgMIs.end());
1036
1039 // Now emit the rest according to source order.
1040 LastOrder = 0;
1041 for (const auto &InstrOrder : Orders) {
1042 unsigned Order = InstrOrder.first;
1043 MachineInstr *MI = InstrOrder.second;
1044 if (!MI)
1045 continue;
1046
1047 // Insert all SDDbgLabel's whose order(s) are before "Order".
1048 for (; DLI != DLE &&
1049 (*DLI)->getOrder() >= LastOrder && (*DLI)->getOrder() < Order;
1050 ++DLI) {
1051 MachineInstr *DbgMI = Emitter.EmitDbgLabel(*DLI);
1052 if (DbgMI) {
1053 if (!LastOrder)
1054 // Insert to start of the BB (after PHIs).
1055 BB->insert(BBBegin, DbgMI);
1056 else {
1057 // Insert at the instruction, which may be in a different
1058 // block, if the block was split by a custom inserter.
1060 MI->getParent()->insert(Pos, DbgMI);
1061 }
1062 }
1063 }
1064 if (DLI == DLE)
1065 break;
1066
1067 LastOrder = Order;
1068 }
1069 }
1070
1071 InsertPos = Emitter.getInsertPos();
1072 // In some cases, DBG_VALUEs might be inserted after the first terminator,
1073 // which results in an invalid MBB. If that happens, move the DBG_VALUEs
1074 // before the first terminator.
1075 MachineBasicBlock *InsertBB = Emitter.getBlock();
1076 auto FirstTerm = InsertBB->getFirstTerminator();
1077 if (FirstTerm != InsertBB->end()) {
1078 assert(!FirstTerm->isDebugValue() &&
1079 "first terminator cannot be a debug value");
1081 make_range(std::next(FirstTerm), InsertBB->end()))) {
1082 // Only scan up to insertion point.
1083 if (&MI == InsertPos)
1084 break;
1085
1086 if (!MI.isDebugValue())
1087 continue;
1088
1089 // The DBG_VALUE was referencing a value produced by a terminator. By
1090 // moving the DBG_VALUE, the referenced value also needs invalidating.
1091 MI.getOperand(0).ChangeToRegister(0, false);
1092 MI.moveBefore(&*FirstTerm);
1093 }
1094 }
1095 return InsertBB;
1096}
1097
1098/// Return the basic block label.
1100 return "sunit-dag." + BB->getFullName();
1101}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
dxil DXContainer Global Emitter
This file defines the DenseMap class.
uint64_t Addr
bool End
Definition: ELF_riscv.cpp:480
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition: MD5.cpp:58
Register const TargetRegisterInfo * TRI
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
MachineInstr unsigned OpIdx
uint64_t IntrinsicInst * II
static void ProcessSourceNode(SDNode *N, SelectionDAG *DAG, InstrEmitter &Emitter, InstrEmitter::VRBaseMapType &VRBaseMap, SmallVectorImpl< std::pair< unsigned, MachineInstr * > > &Orders, SmallSet< Register, 8 > &Seen, MachineInstr *NewInsn)
static bool AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG)
static void RemoveUnusedGlue(SDNode *N, SelectionDAG *DAG)
static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op, const TargetRegisterInfo *TRI, const TargetInstrInfo *TII, const TargetLowering &TLI, MCRegister &PhysReg, int &Cost)
CheckForPhysRegDependency - Check if the dependency between def and use of a specified operand is a p...
static cl::opt< int > HighLatencyCycles("sched-high-latency-cycles", cl::Hidden, cl::init(10), cl::desc("Roughly estimate the number of cycles that 'long latency' " "instructions take for targets with no itinerary"))
static void ProcessSDDbgValues(SDNode *N, SelectionDAG *DAG, InstrEmitter &Emitter, SmallVectorImpl< std::pair< unsigned, MachineInstr * > > &Orders, InstrEmitter::VRBaseMapType &VRBaseMap, unsigned Order)
ProcessSDDbgValues - Process SDDbgValues associated with this node.
static void CloneNodeWithValues(SDNode *N, SelectionDAG *DAG, ArrayRef< EVT > VTs, SDValue ExtraOper=SDValue())
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
This file describes how to lower LLVM code to machine code.
Value * RHS
Value * LHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
This class represents an Operation in the Expression.
A debug info location.
Definition: DebugLoc.h:124
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: DenseMap.h:173
iterator end()
Definition: DenseMap.h:87
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:230
static unsigned CountResults(SDNode *Node)
CountResults - The results of target nodes have register or immediate operands first,...
bool isEmpty() const
Returns true if there are no itineraries.
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:199
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
Definition: MCInstrDesc.h:238
bool mayLoad() const
Return true if this instruction could possibly read memory.
Definition: MCInstrDesc.h:440
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
Definition: MCInstrDesc.h:249
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specified operand constraint if it is present.
Definition: MCInstrDesc.h:220
ArrayRef< MCPhysReg > implicit_defs() const
Return a list of registers that are potentially written by any instance of this machine instruction.
Definition: MCInstrDesc.h:581
bool isCommutable() const
Return true if this may be a 2- or 3-address instruction (of the form "X = op Y, Z,...
Definition: MCInstrDesc.h:483
bool isCall() const
Return true if the instruction is a call.
Definition: MCInstrDesc.h:289
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
Definition: MCInstrInfo.h:64
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
Metadata node.
Definition: Metadata.h:1077
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI std::string getFullName() const
Return a formatted string to identify this block and its parent function.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
void addCallSiteInfo(const MachineInstr *CallI, CallSiteInfo &&CallInfo)
Start tracking the arguments passed to the call CallI.
void addCalledGlobal(const MachineInstr *MI, CalledGlobalInfo Details)
Notes the global and target flags for a call site.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
Definition: MachineInstr.h:72
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
An SDNode that represents everything that will be needed to construct a MachineInstr.
mmo_iterator memoperands_begin() const
mmo_iterator memoperands_end() const
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
SmallVectorImpl< SDDbgLabel * >::iterator DbgLabelIterator
Definition: SelectionDAG.h:206
SmallVectorImpl< SDDbgValue * >::iterator DbgIterator
Definition: SelectionDAG.h:205
Holds the information for a single machine location through SDISel; either an SDNode,...
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Represents one node in the SelectionDAG.
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
int getNodeId() const
Return the unique node id.
LLVM_ABI void dump() const
Dump this node, for debugging.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
iterator_range< value_op_iterator > op_values() const
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getMachineOpcode() const
This may only be called if isMachineOpcode returns true.
const SDValue & getOperand(unsigned Num) const
static user_iterator user_end()
user_iterator user_begin() const
Provide iteration support to walk over all users of an SDNode.
SDNode * getGluedNode() const
If this node has a glue operand, return the node to which the glue operand points.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
unsigned getResNo() const
get the index which selects a specific result in the SDNode
Scheduling dependency.
Definition: ScheduleDAG.h:51
SUnit * getSUnit() const
Definition: ScheduleDAG.h:507
Kind getKind() const
Returns an enum value representing the kind of the dependence.
Definition: ScheduleDAG.h:513
@ Data
Regular data dependence (aka true-dependence).
Definition: ScheduleDAG.h:55
void setLatency(unsigned Lat)
Sets the latency for this edge.
Definition: ScheduleDAG.h:147
@ Barrier
An unknown scheduling barrier.
Definition: ScheduleDAG.h:71
bool isCtrl() const
Shorthand for getKind() != SDep::Data.
Definition: ScheduleDAG.h:161
Register getReg() const
Returns the register associated with this edge.
Definition: ScheduleDAG.h:216
Scheduling unit. This is a node in the scheduling DAG.
Definition: ScheduleDAG.h:249
bool isCloned
True if this node has been cloned.
Definition: ScheduleDAG.h:308
bool isCall
Is a function call.
Definition: ScheduleDAG.h:296
void setNode(SDNode *N)
Assigns the representative SDNode for this SUnit.
Definition: ScheduleDAG.h:371
unsigned NodeNum
Entry # of node in the node vector.
Definition: ScheduleDAG.h:277
bool hasPhysRegClobbers
Has any physreg defs, used or not.
Definition: ScheduleDAG.h:302
bool isCallOp
Is a function call operand.
Definition: ScheduleDAG.h:297
const TargetRegisterClass * CopyDstRC
Is a special copy node if != nullptr.
Definition: ScheduleDAG.h:265
unsigned short Latency
Node latency.
Definition: ScheduleDAG.h:312
unsigned short NumRegDefsLeft
Definition: ScheduleDAG.h:311
bool isScheduleHigh
True if preferable to schedule high.
Definition: ScheduleDAG.h:306
bool isScheduleLow
True if preferable to schedule low.
Definition: ScheduleDAG.h:307
bool hasPhysRegDefs
Has physreg defs that are being used.
Definition: ScheduleDAG.h:301
SmallVector< SDep, 4 > Succs
All sunit successors.
Definition: ScheduleDAG.h:270
Sched::Preference SchedulingPref
Scheduling preference.
Definition: ScheduleDAG.h:321
SDNode * getNode() const
Returns the representative SDNode for this SUnit.
Definition: ScheduleDAG.h:379
bool isTwoAddress
Is a two-address instruction.
Definition: ScheduleDAG.h:298
bool isCommutable
Is a commutable instruction.
Definition: ScheduleDAG.h:299
bool isVRegCycle
May use and def the same vreg.
Definition: ScheduleDAG.h:295
SmallVector< SDep, 4 > Preds
All sunit predecessors.
Definition: ScheduleDAG.h:269
SUnit * OrigNode
If not this, the node from which this node was cloned.
Definition: ScheduleDAG.h:259
LLVM_ABI bool addPred(const SDep &D, bool Required=true)
Adds the specified edge as a pred of the current node if not already.
RegDefIter - In place iteration over the values defined by an SUnit.
RegDefIter(const SUnit *SU, const ScheduleDAGSDNodes *SD)
ScheduleDAGSDNodes - A ScheduleDAG for scheduling SDNode-based DAGs.
SUnit * newSUnit(SDNode *N)
NewSUnit - Creates a new SUnit and return a ptr to it.
void VerifyScheduledSequence(bool isBottomUp)
VerifyScheduledSequence - Verify that all SUnits are scheduled and consistent with the Sequence of sc...
virtual void Schedule()=0
Schedule - Order nodes according to selected style, filling in the Sequence member.
virtual void computeLatency(SUnit *SU)
computeLatency - Compute node latency.
std::string getDAGName() const override
Return the basic block label.
virtual MachineBasicBlock * EmitSchedule(MachineBasicBlock::iterator &InsertPos)
EmitSchedule - Insert MachineInstrs into the MachineBasicBlock according to the order specified in Se...
virtual bool forceUnitLatencies() const
ForceUnitLatencies - Return true if all scheduling edges should be given a latency value of one.
static bool isPassiveNode(SDNode *Node)
isPassiveNode - Return true if the node is a non-scheduled leaf.
const InstrItineraryData * InstrItins
void InitNumRegDefsLeft(SUnit *SU)
InitNumRegDefsLeft - Determine the # of regs defined by this node.
std::vector< SUnit * > Sequence
The schedule. Null SUnit*'s represent noop instructions.
MachineBasicBlock * BB
void Run(SelectionDAG *dag, MachineBasicBlock *bb)
Run - perform scheduling.
void BuildSchedGraph()
BuildSchedGraph - Build the SUnit graph from the selection dag that we are input.
void dump() const override
void dumpNode(const SUnit &SU) const override
SUnit * Clone(SUnit *Old)
Clone - Creates a clone of the specified SUnit.
ScheduleDAGSDNodes(MachineFunction &mf)
virtual void computeOperandLatency(SDNode *Def, SDNode *Use, unsigned OpIdx, SDep &dep) const
MachineRegisterInfo & MRI
Virtual/real register map.
Definition: ScheduleDAG.h:587
void clearDAG()
Clears the DAG state (between regions).
Definition: ScheduleDAG.cpp:63
const TargetInstrInfo * TII
Target instruction information.
Definition: ScheduleDAG.h:584
std::vector< SUnit > SUnits
The scheduling units.
Definition: ScheduleDAG.h:588
const TargetRegisterInfo * TRI
Target processor register info.
Definition: ScheduleDAG.h:585
SUnit EntrySU
Special node for the region entry.
Definition: ScheduleDAG.h:589
MachineFunction & MF
Machine function.
Definition: ScheduleDAG.h:586
void dumpNodeAll(const SUnit &SU) const
unsigned VerifyScheduledDAG(bool isBottomUp)
Verifies that all SUnits were scheduled and that their state is consistent.
void dumpNodeName(const SUnit &SU) const
SUnit ExitSU
Special node for the region exit.
Definition: ScheduleDAG.h:590
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:229
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
Definition: SelectionDAG.h:578
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
SDDbgInfo::DbgIterator ByvalParmDbgEnd() const
SDDbgInfo::DbgIterator ByvalParmDbgBegin() const
const TargetLowering & getTargetLoweringInfo() const
Definition: SelectionDAG.h:504
std::optional< CalledGlobalInfo > getCalledGlobal(const SDNode *Node)
Return CalledGlobal associated with Node, or a nullopt if none exists.
MDNode * getHeapAllocSite(const SDNode *Node) const
Return HeapAllocSite associated with Node, or nullptr if none exists.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
MDNode * getMMRAMetadata(const SDNode *Node) const
Return the MMRA MDNode associated with Node, or nullptr if none exists.
SDDbgInfo::DbgIterator DbgEnd() const
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
CallSiteInfo getCallSiteInfo(const SDNode *Node)
Return CallSiteInfo associated with Node, or a default if none exists.
MDNode * getPCSections(const SDNode *Node) const
Return PCSections associated with Node, or nullptr if none exists.
bool hasDebugValues() const
Return true if there are any SDDbgValue nodes associated with this SelectionDAG.
SDDbgInfo::DbgLabelIterator DbgLabelEnd() const
SDDbgInfo::DbgLabelIterator DbgLabelBegin() const
const TargetMachine & getTarget() const
Definition: SelectionDAG.h:499
bool getNoMergeSiteInfo(const SDNode *Node) const
Return NoMerge info associated with Node.
SDDbgInfo::DbgIterator DbgBegin() const
iterator_range< allnodes_iterator > allnodes()
Definition: SelectionDAG.h:570
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition: SmallSet.h:134
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
Definition: SmallSet.h:176
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition: SmallSet.h:182
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
void assign(size_type NumElts, ValueParamT Elt)
Definition: SmallVector.h:705
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
TargetInstrInfo - Interface to description of machine instruction set.
virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
Insert a noop into the instruction stream at the specified point.
virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const
This is a used by the pre-regalloc scheduler to determine (in conjunction with areLoadsFromSameBasePt...
virtual std::optional< unsigned > getOperandLatency(const InstrItineraryData *ItinData, SDNode *DefNode, unsigned DefIdx, SDNode *UseNode, unsigned UseIdx) const
virtual unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const
Compute the instruction latency of a given instruction.
virtual bool isHighLatencyDef(int opc) const
Return true if this opcode has high latency to its result.
virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, int64_t &Offset2) const
This is used by the pre-regalloc scheduler to determine if two loads are loading from the same base a...
Sched::Preference getSchedulingPreference() const
Return target scheduling preference.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool checkForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op, const TargetRegisterInfo *TRI, const TargetInstrInfo *TII, MCRegister &PhysReg, int &Cost) const
Allows the target to handle physreg-carried dependency in target-specific way.
TargetOptions Options
unsigned EmitCallSiteInfo
The flag enables call site info production.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
int getCopyCost() const
Return the cost of copying a value between two registers in this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
A Use represents the edge between a Value definition and its users.
Definition: Use.h:35
Value * getOperand(unsigned i) const
Definition: User.h:232
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition: ISDOpcodes.h:225
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition: ISDOpcodes.h:219
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:53
@ Cluster
Definition: NVPTX.h:173
Offsets
Offsets in bytes from the start of the input buffer.
Definition: SIInstrInfo.h:1695
Reg
All possible values of the reg field in the ModR/M byte.
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
void stable_sort(R &&Range)
Definition: STLExtras.h:2077
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:663
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition: STLExtras.h:1973
#define N
Extended Value Type.
Definition: ValueTypes.h:35
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Function object to check whether the first component of a container supported by std::get (like std::...
Definition: STLExtras.h:1472