xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===--- ScheduleDAGSDNodes.cpp - Implement the ScheduleDAGSDNodes class --===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric //
9*0b57cec5SDimitry Andric // This implements the ScheduleDAG class, which is a base class used by
10*0b57cec5SDimitry Andric // scheduling implementation classes.
11*0b57cec5SDimitry Andric //
12*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13*0b57cec5SDimitry Andric 
14*0b57cec5SDimitry Andric #include "ScheduleDAGSDNodes.h"
15*0b57cec5SDimitry Andric #include "InstrEmitter.h"
16*0b57cec5SDimitry Andric #include "SDNodeDbgValue.h"
17*0b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
18*0b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
19*0b57cec5SDimitry Andric #include "llvm/ADT/SmallSet.h"
20*0b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
21*0b57cec5SDimitry Andric #include "llvm/ADT/Statistic.h"
22*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstrBuilder.h"
23*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
24*0b57cec5SDimitry Andric #include "llvm/CodeGen/SelectionDAG.h"
25*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h"
26*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
27*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h"
28*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
29*0b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h"
30*0b57cec5SDimitry Andric #include "llvm/MC/MCInstrItineraries.h"
31*0b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
32*0b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
33*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
34*0b57cec5SDimitry Andric using namespace llvm;
35*0b57cec5SDimitry Andric 
36*0b57cec5SDimitry Andric #define DEBUG_TYPE "pre-RA-sched"
37*0b57cec5SDimitry Andric 
38*0b57cec5SDimitry Andric STATISTIC(LoadsClustered, "Number of loads clustered together");
39*0b57cec5SDimitry Andric 
40*0b57cec5SDimitry Andric // This allows the latency-based scheduler to notice high latency instructions
41*0b57cec5SDimitry Andric // without a target itinerary. The choice of number here has more to do with
42*0b57cec5SDimitry Andric // balancing scheduler heuristics than with the actual machine latency.
43*0b57cec5SDimitry Andric static cl::opt<int> HighLatencyCycles(
44*0b57cec5SDimitry Andric   "sched-high-latency-cycles", cl::Hidden, cl::init(10),
45*0b57cec5SDimitry Andric   cl::desc("Roughly estimate the number of cycles that 'long latency'"
46*0b57cec5SDimitry Andric            "instructions take for targets with no itinerary"));
47*0b57cec5SDimitry Andric 
48*0b57cec5SDimitry Andric ScheduleDAGSDNodes::ScheduleDAGSDNodes(MachineFunction &mf)
49*0b57cec5SDimitry Andric     : ScheduleDAG(mf), BB(nullptr), DAG(nullptr),
50*0b57cec5SDimitry Andric       InstrItins(mf.getSubtarget().getInstrItineraryData()) {}
51*0b57cec5SDimitry Andric 
52*0b57cec5SDimitry Andric /// Run - perform scheduling.
53*0b57cec5SDimitry Andric ///
54*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::Run(SelectionDAG *dag, MachineBasicBlock *bb) {
55*0b57cec5SDimitry Andric   BB = bb;
56*0b57cec5SDimitry Andric   DAG = dag;
57*0b57cec5SDimitry Andric 
58*0b57cec5SDimitry Andric   // Clear the scheduler's SUnit DAG.
59*0b57cec5SDimitry Andric   ScheduleDAG::clearDAG();
60*0b57cec5SDimitry Andric   Sequence.clear();
61*0b57cec5SDimitry Andric 
62*0b57cec5SDimitry Andric   // Invoke the target's selection of scheduler.
63*0b57cec5SDimitry Andric   Schedule();
64*0b57cec5SDimitry Andric }
65*0b57cec5SDimitry Andric 
66*0b57cec5SDimitry Andric /// NewSUnit - Creates a new SUnit and return a ptr to it.
67*0b57cec5SDimitry Andric ///
68*0b57cec5SDimitry Andric SUnit *ScheduleDAGSDNodes::newSUnit(SDNode *N) {
69*0b57cec5SDimitry Andric #ifndef NDEBUG
70*0b57cec5SDimitry Andric   const SUnit *Addr = nullptr;
71*0b57cec5SDimitry Andric   if (!SUnits.empty())
72*0b57cec5SDimitry Andric     Addr = &SUnits[0];
73*0b57cec5SDimitry Andric #endif
74*0b57cec5SDimitry Andric   SUnits.emplace_back(N, (unsigned)SUnits.size());
75*0b57cec5SDimitry Andric   assert((Addr == nullptr || Addr == &SUnits[0]) &&
76*0b57cec5SDimitry Andric          "SUnits std::vector reallocated on the fly!");
77*0b57cec5SDimitry Andric   SUnits.back().OrigNode = &SUnits.back();
78*0b57cec5SDimitry Andric   SUnit *SU = &SUnits.back();
79*0b57cec5SDimitry Andric   const TargetLowering &TLI = DAG->getTargetLoweringInfo();
80*0b57cec5SDimitry Andric   if (!N ||
81*0b57cec5SDimitry Andric       (N->isMachineOpcode() &&
82*0b57cec5SDimitry Andric        N->getMachineOpcode() == TargetOpcode::IMPLICIT_DEF))
83*0b57cec5SDimitry Andric     SU->SchedulingPref = Sched::None;
84*0b57cec5SDimitry Andric   else
85*0b57cec5SDimitry Andric     SU->SchedulingPref = TLI.getSchedulingPreference(N);
86*0b57cec5SDimitry Andric   return SU;
87*0b57cec5SDimitry Andric }
88*0b57cec5SDimitry Andric 
89*0b57cec5SDimitry Andric SUnit *ScheduleDAGSDNodes::Clone(SUnit *Old) {
90*0b57cec5SDimitry Andric   SUnit *SU = newSUnit(Old->getNode());
91*0b57cec5SDimitry Andric   SU->OrigNode = Old->OrigNode;
92*0b57cec5SDimitry Andric   SU->Latency = Old->Latency;
93*0b57cec5SDimitry Andric   SU->isVRegCycle = Old->isVRegCycle;
94*0b57cec5SDimitry Andric   SU->isCall = Old->isCall;
95*0b57cec5SDimitry Andric   SU->isCallOp = Old->isCallOp;
96*0b57cec5SDimitry Andric   SU->isTwoAddress = Old->isTwoAddress;
97*0b57cec5SDimitry Andric   SU->isCommutable = Old->isCommutable;
98*0b57cec5SDimitry Andric   SU->hasPhysRegDefs = Old->hasPhysRegDefs;
99*0b57cec5SDimitry Andric   SU->hasPhysRegClobbers = Old->hasPhysRegClobbers;
100*0b57cec5SDimitry Andric   SU->isScheduleHigh = Old->isScheduleHigh;
101*0b57cec5SDimitry Andric   SU->isScheduleLow = Old->isScheduleLow;
102*0b57cec5SDimitry Andric   SU->SchedulingPref = Old->SchedulingPref;
103*0b57cec5SDimitry Andric   Old->isCloned = true;
104*0b57cec5SDimitry Andric   return SU;
105*0b57cec5SDimitry Andric }
106*0b57cec5SDimitry Andric 
107*0b57cec5SDimitry Andric /// CheckForPhysRegDependency - Check if the dependency between def and use of
108*0b57cec5SDimitry Andric /// a specified operand is a physical register dependency. If so, returns the
109*0b57cec5SDimitry Andric /// register and the cost of copying the register.
110*0b57cec5SDimitry Andric static void CheckForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op,
111*0b57cec5SDimitry Andric                                       const TargetRegisterInfo *TRI,
112*0b57cec5SDimitry Andric                                       const TargetInstrInfo *TII,
113*0b57cec5SDimitry Andric                                       unsigned &PhysReg, int &Cost) {
114*0b57cec5SDimitry Andric   if (Op != 2 || User->getOpcode() != ISD::CopyToReg)
115*0b57cec5SDimitry Andric     return;
116*0b57cec5SDimitry Andric 
117*0b57cec5SDimitry Andric   unsigned Reg = cast<RegisterSDNode>(User->getOperand(1))->getReg();
118*0b57cec5SDimitry Andric   if (TargetRegisterInfo::isVirtualRegister(Reg))
119*0b57cec5SDimitry Andric     return;
120*0b57cec5SDimitry Andric 
121*0b57cec5SDimitry Andric   unsigned ResNo = User->getOperand(2).getResNo();
122*0b57cec5SDimitry Andric   if (Def->getOpcode() == ISD::CopyFromReg &&
123*0b57cec5SDimitry Andric       cast<RegisterSDNode>(Def->getOperand(1))->getReg() == Reg) {
124*0b57cec5SDimitry Andric     PhysReg = Reg;
125*0b57cec5SDimitry Andric   } else if (Def->isMachineOpcode()) {
126*0b57cec5SDimitry Andric     const MCInstrDesc &II = TII->get(Def->getMachineOpcode());
127*0b57cec5SDimitry Andric     if (ResNo >= II.getNumDefs() &&
128*0b57cec5SDimitry Andric         II.ImplicitDefs[ResNo - II.getNumDefs()] == Reg)
129*0b57cec5SDimitry Andric       PhysReg = Reg;
130*0b57cec5SDimitry Andric   }
131*0b57cec5SDimitry Andric 
132*0b57cec5SDimitry Andric   if (PhysReg != 0) {
133*0b57cec5SDimitry Andric     const TargetRegisterClass *RC =
134*0b57cec5SDimitry Andric         TRI->getMinimalPhysRegClass(Reg, Def->getSimpleValueType(ResNo));
135*0b57cec5SDimitry Andric     Cost = RC->getCopyCost();
136*0b57cec5SDimitry Andric   }
137*0b57cec5SDimitry Andric }
138*0b57cec5SDimitry Andric 
139*0b57cec5SDimitry Andric // Helper for AddGlue to clone node operands.
140*0b57cec5SDimitry Andric static void CloneNodeWithValues(SDNode *N, SelectionDAG *DAG, ArrayRef<EVT> VTs,
141*0b57cec5SDimitry Andric                                 SDValue ExtraOper = SDValue()) {
142*0b57cec5SDimitry Andric   SmallVector<SDValue, 8> Ops(N->op_begin(), N->op_end());
143*0b57cec5SDimitry Andric   if (ExtraOper.getNode())
144*0b57cec5SDimitry Andric     Ops.push_back(ExtraOper);
145*0b57cec5SDimitry Andric 
146*0b57cec5SDimitry Andric   SDVTList VTList = DAG->getVTList(VTs);
147*0b57cec5SDimitry Andric   MachineSDNode *MN = dyn_cast<MachineSDNode>(N);
148*0b57cec5SDimitry Andric 
149*0b57cec5SDimitry Andric   // Store memory references.
150*0b57cec5SDimitry Andric   SmallVector<MachineMemOperand *, 2> MMOs;
151*0b57cec5SDimitry Andric   if (MN)
152*0b57cec5SDimitry Andric     MMOs.assign(MN->memoperands_begin(), MN->memoperands_end());
153*0b57cec5SDimitry Andric 
154*0b57cec5SDimitry Andric   DAG->MorphNodeTo(N, N->getOpcode(), VTList, Ops);
155*0b57cec5SDimitry Andric 
156*0b57cec5SDimitry Andric   // Reset the memory references
157*0b57cec5SDimitry Andric   if (MN)
158*0b57cec5SDimitry Andric     DAG->setNodeMemRefs(MN, MMOs);
159*0b57cec5SDimitry Andric }
160*0b57cec5SDimitry Andric 
161*0b57cec5SDimitry Andric static bool AddGlue(SDNode *N, SDValue Glue, bool AddGlue, SelectionDAG *DAG) {
162*0b57cec5SDimitry Andric   SDNode *GlueDestNode = Glue.getNode();
163*0b57cec5SDimitry Andric 
164*0b57cec5SDimitry Andric   // Don't add glue from a node to itself.
165*0b57cec5SDimitry Andric   if (GlueDestNode == N) return false;
166*0b57cec5SDimitry Andric 
167*0b57cec5SDimitry Andric   // Don't add a glue operand to something that already uses glue.
168*0b57cec5SDimitry Andric   if (GlueDestNode &&
169*0b57cec5SDimitry Andric       N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue) {
170*0b57cec5SDimitry Andric     return false;
171*0b57cec5SDimitry Andric   }
172*0b57cec5SDimitry Andric   // Don't add glue to something that already has a glue value.
173*0b57cec5SDimitry Andric   if (N->getValueType(N->getNumValues() - 1) == MVT::Glue) return false;
174*0b57cec5SDimitry Andric 
175*0b57cec5SDimitry Andric   SmallVector<EVT, 4> VTs(N->value_begin(), N->value_end());
176*0b57cec5SDimitry Andric   if (AddGlue)
177*0b57cec5SDimitry Andric     VTs.push_back(MVT::Glue);
178*0b57cec5SDimitry Andric 
179*0b57cec5SDimitry Andric   CloneNodeWithValues(N, DAG, VTs, Glue);
180*0b57cec5SDimitry Andric 
181*0b57cec5SDimitry Andric   return true;
182*0b57cec5SDimitry Andric }
183*0b57cec5SDimitry Andric 
184*0b57cec5SDimitry Andric // Cleanup after unsuccessful AddGlue. Use the standard method of morphing the
185*0b57cec5SDimitry Andric // node even though simply shrinking the value list is sufficient.
186*0b57cec5SDimitry Andric static void RemoveUnusedGlue(SDNode *N, SelectionDAG *DAG) {
187*0b57cec5SDimitry Andric   assert((N->getValueType(N->getNumValues() - 1) == MVT::Glue &&
188*0b57cec5SDimitry Andric           !N->hasAnyUseOfValue(N->getNumValues() - 1)) &&
189*0b57cec5SDimitry Andric          "expected an unused glue value");
190*0b57cec5SDimitry Andric 
191*0b57cec5SDimitry Andric   CloneNodeWithValues(N, DAG,
192*0b57cec5SDimitry Andric                       makeArrayRef(N->value_begin(), N->getNumValues() - 1));
193*0b57cec5SDimitry Andric }
194*0b57cec5SDimitry Andric 
195*0b57cec5SDimitry Andric /// ClusterNeighboringLoads - Force nearby loads together by "gluing" them.
196*0b57cec5SDimitry Andric /// This function finds loads of the same base and different offsets. If the
197*0b57cec5SDimitry Andric /// offsets are not far apart (target specific), it add MVT::Glue inputs and
198*0b57cec5SDimitry Andric /// outputs to ensure they are scheduled together and in order. This
199*0b57cec5SDimitry Andric /// optimization may benefit some targets by improving cache locality.
200*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {
201*0b57cec5SDimitry Andric   SDNode *Chain = nullptr;
202*0b57cec5SDimitry Andric   unsigned NumOps = Node->getNumOperands();
203*0b57cec5SDimitry Andric   if (Node->getOperand(NumOps-1).getValueType() == MVT::Other)
204*0b57cec5SDimitry Andric     Chain = Node->getOperand(NumOps-1).getNode();
205*0b57cec5SDimitry Andric   if (!Chain)
206*0b57cec5SDimitry Andric     return;
207*0b57cec5SDimitry Andric 
208*0b57cec5SDimitry Andric   // Skip any load instruction that has a tied input. There may be an additional
209*0b57cec5SDimitry Andric   // dependency requiring a different order than by increasing offsets, and the
210*0b57cec5SDimitry Andric   // added glue may introduce a cycle.
211*0b57cec5SDimitry Andric   auto hasTiedInput = [this](const SDNode *N) {
212*0b57cec5SDimitry Andric     const MCInstrDesc &MCID = TII->get(N->getMachineOpcode());
213*0b57cec5SDimitry Andric     for (unsigned I = 0; I != MCID.getNumOperands(); ++I) {
214*0b57cec5SDimitry Andric       if (MCID.getOperandConstraint(I, MCOI::TIED_TO) != -1)
215*0b57cec5SDimitry Andric         return true;
216*0b57cec5SDimitry Andric     }
217*0b57cec5SDimitry Andric 
218*0b57cec5SDimitry Andric     return false;
219*0b57cec5SDimitry Andric   };
220*0b57cec5SDimitry Andric 
221*0b57cec5SDimitry Andric   // Look for other loads of the same chain. Find loads that are loading from
222*0b57cec5SDimitry Andric   // the same base pointer and different offsets.
223*0b57cec5SDimitry Andric   SmallPtrSet<SDNode*, 16> Visited;
224*0b57cec5SDimitry Andric   SmallVector<int64_t, 4> Offsets;
225*0b57cec5SDimitry Andric   DenseMap<long long, SDNode*> O2SMap;  // Map from offset to SDNode.
226*0b57cec5SDimitry Andric   bool Cluster = false;
227*0b57cec5SDimitry Andric   SDNode *Base = Node;
228*0b57cec5SDimitry Andric 
229*0b57cec5SDimitry Andric   if (hasTiedInput(Base))
230*0b57cec5SDimitry Andric     return;
231*0b57cec5SDimitry Andric 
232*0b57cec5SDimitry Andric   // This algorithm requires a reasonably low use count before finding a match
233*0b57cec5SDimitry Andric   // to avoid uselessly blowing up compile time in large blocks.
234*0b57cec5SDimitry Andric   unsigned UseCount = 0;
235*0b57cec5SDimitry Andric   for (SDNode::use_iterator I = Chain->use_begin(), E = Chain->use_end();
236*0b57cec5SDimitry Andric        I != E && UseCount < 100; ++I, ++UseCount) {
237*0b57cec5SDimitry Andric     SDNode *User = *I;
238*0b57cec5SDimitry Andric     if (User == Node || !Visited.insert(User).second)
239*0b57cec5SDimitry Andric       continue;
240*0b57cec5SDimitry Andric     int64_t Offset1, Offset2;
241*0b57cec5SDimitry Andric     if (!TII->areLoadsFromSameBasePtr(Base, User, Offset1, Offset2) ||
242*0b57cec5SDimitry Andric         Offset1 == Offset2 ||
243*0b57cec5SDimitry Andric         hasTiedInput(User)) {
244*0b57cec5SDimitry Andric       // FIXME: Should be ok if they addresses are identical. But earlier
245*0b57cec5SDimitry Andric       // optimizations really should have eliminated one of the loads.
246*0b57cec5SDimitry Andric       continue;
247*0b57cec5SDimitry Andric     }
248*0b57cec5SDimitry Andric     if (O2SMap.insert(std::make_pair(Offset1, Base)).second)
249*0b57cec5SDimitry Andric       Offsets.push_back(Offset1);
250*0b57cec5SDimitry Andric     O2SMap.insert(std::make_pair(Offset2, User));
251*0b57cec5SDimitry Andric     Offsets.push_back(Offset2);
252*0b57cec5SDimitry Andric     if (Offset2 < Offset1)
253*0b57cec5SDimitry Andric       Base = User;
254*0b57cec5SDimitry Andric     Cluster = true;
255*0b57cec5SDimitry Andric     // Reset UseCount to allow more matches.
256*0b57cec5SDimitry Andric     UseCount = 0;
257*0b57cec5SDimitry Andric   }
258*0b57cec5SDimitry Andric 
259*0b57cec5SDimitry Andric   if (!Cluster)
260*0b57cec5SDimitry Andric     return;
261*0b57cec5SDimitry Andric 
262*0b57cec5SDimitry Andric   // Sort them in increasing order.
263*0b57cec5SDimitry Andric   llvm::sort(Offsets);
264*0b57cec5SDimitry Andric 
265*0b57cec5SDimitry Andric   // Check if the loads are close enough.
266*0b57cec5SDimitry Andric   SmallVector<SDNode*, 4> Loads;
267*0b57cec5SDimitry Andric   unsigned NumLoads = 0;
268*0b57cec5SDimitry Andric   int64_t BaseOff = Offsets[0];
269*0b57cec5SDimitry Andric   SDNode *BaseLoad = O2SMap[BaseOff];
270*0b57cec5SDimitry Andric   Loads.push_back(BaseLoad);
271*0b57cec5SDimitry Andric   for (unsigned i = 1, e = Offsets.size(); i != e; ++i) {
272*0b57cec5SDimitry Andric     int64_t Offset = Offsets[i];
273*0b57cec5SDimitry Andric     SDNode *Load = O2SMap[Offset];
274*0b57cec5SDimitry Andric     if (!TII->shouldScheduleLoadsNear(BaseLoad, Load, BaseOff, Offset,NumLoads))
275*0b57cec5SDimitry Andric       break; // Stop right here. Ignore loads that are further away.
276*0b57cec5SDimitry Andric     Loads.push_back(Load);
277*0b57cec5SDimitry Andric     ++NumLoads;
278*0b57cec5SDimitry Andric   }
279*0b57cec5SDimitry Andric 
280*0b57cec5SDimitry Andric   if (NumLoads == 0)
281*0b57cec5SDimitry Andric     return;
282*0b57cec5SDimitry Andric 
283*0b57cec5SDimitry Andric   // Cluster loads by adding MVT::Glue outputs and inputs. This also
284*0b57cec5SDimitry Andric   // ensure they are scheduled in order of increasing addresses.
285*0b57cec5SDimitry Andric   SDNode *Lead = Loads[0];
286*0b57cec5SDimitry Andric   SDValue InGlue = SDValue(nullptr, 0);
287*0b57cec5SDimitry Andric   if (AddGlue(Lead, InGlue, true, DAG))
288*0b57cec5SDimitry Andric     InGlue = SDValue(Lead, Lead->getNumValues() - 1);
289*0b57cec5SDimitry Andric   for (unsigned I = 1, E = Loads.size(); I != E; ++I) {
290*0b57cec5SDimitry Andric     bool OutGlue = I < E - 1;
291*0b57cec5SDimitry Andric     SDNode *Load = Loads[I];
292*0b57cec5SDimitry Andric 
293*0b57cec5SDimitry Andric     // If AddGlue fails, we could leave an unsused glue value. This should not
294*0b57cec5SDimitry Andric     // cause any
295*0b57cec5SDimitry Andric     if (AddGlue(Load, InGlue, OutGlue, DAG)) {
296*0b57cec5SDimitry Andric       if (OutGlue)
297*0b57cec5SDimitry Andric         InGlue = SDValue(Load, Load->getNumValues() - 1);
298*0b57cec5SDimitry Andric 
299*0b57cec5SDimitry Andric       ++LoadsClustered;
300*0b57cec5SDimitry Andric     }
301*0b57cec5SDimitry Andric     else if (!OutGlue && InGlue.getNode())
302*0b57cec5SDimitry Andric       RemoveUnusedGlue(InGlue.getNode(), DAG);
303*0b57cec5SDimitry Andric   }
304*0b57cec5SDimitry Andric }
305*0b57cec5SDimitry Andric 
306*0b57cec5SDimitry Andric /// ClusterNodes - Cluster certain nodes which should be scheduled together.
307*0b57cec5SDimitry Andric ///
308*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::ClusterNodes() {
309*0b57cec5SDimitry Andric   for (SDNode &NI : DAG->allnodes()) {
310*0b57cec5SDimitry Andric     SDNode *Node = &NI;
311*0b57cec5SDimitry Andric     if (!Node || !Node->isMachineOpcode())
312*0b57cec5SDimitry Andric       continue;
313*0b57cec5SDimitry Andric 
314*0b57cec5SDimitry Andric     unsigned Opc = Node->getMachineOpcode();
315*0b57cec5SDimitry Andric     const MCInstrDesc &MCID = TII->get(Opc);
316*0b57cec5SDimitry Andric     if (MCID.mayLoad())
317*0b57cec5SDimitry Andric       // Cluster loads from "near" addresses into combined SUnits.
318*0b57cec5SDimitry Andric       ClusterNeighboringLoads(Node);
319*0b57cec5SDimitry Andric   }
320*0b57cec5SDimitry Andric }
321*0b57cec5SDimitry Andric 
322*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::BuildSchedUnits() {
323*0b57cec5SDimitry Andric   // During scheduling, the NodeId field of SDNode is used to map SDNodes
324*0b57cec5SDimitry Andric   // to their associated SUnits by holding SUnits table indices. A value
325*0b57cec5SDimitry Andric   // of -1 means the SDNode does not yet have an associated SUnit.
326*0b57cec5SDimitry Andric   unsigned NumNodes = 0;
327*0b57cec5SDimitry Andric   for (SDNode &NI : DAG->allnodes()) {
328*0b57cec5SDimitry Andric     NI.setNodeId(-1);
329*0b57cec5SDimitry Andric     ++NumNodes;
330*0b57cec5SDimitry Andric   }
331*0b57cec5SDimitry Andric 
332*0b57cec5SDimitry Andric   // Reserve entries in the vector for each of the SUnits we are creating.  This
333*0b57cec5SDimitry Andric   // ensure that reallocation of the vector won't happen, so SUnit*'s won't get
334*0b57cec5SDimitry Andric   // invalidated.
335*0b57cec5SDimitry Andric   // FIXME: Multiply by 2 because we may clone nodes during scheduling.
336*0b57cec5SDimitry Andric   // This is a temporary workaround.
337*0b57cec5SDimitry Andric   SUnits.reserve(NumNodes * 2);
338*0b57cec5SDimitry Andric 
339*0b57cec5SDimitry Andric   // Add all nodes in depth first order.
340*0b57cec5SDimitry Andric   SmallVector<SDNode*, 64> Worklist;
341*0b57cec5SDimitry Andric   SmallPtrSet<SDNode*, 32> Visited;
342*0b57cec5SDimitry Andric   Worklist.push_back(DAG->getRoot().getNode());
343*0b57cec5SDimitry Andric   Visited.insert(DAG->getRoot().getNode());
344*0b57cec5SDimitry Andric 
345*0b57cec5SDimitry Andric   SmallVector<SUnit*, 8> CallSUnits;
346*0b57cec5SDimitry Andric   while (!Worklist.empty()) {
347*0b57cec5SDimitry Andric     SDNode *NI = Worklist.pop_back_val();
348*0b57cec5SDimitry Andric 
349*0b57cec5SDimitry Andric     // Add all operands to the worklist unless they've already been added.
350*0b57cec5SDimitry Andric     for (const SDValue &Op : NI->op_values())
351*0b57cec5SDimitry Andric       if (Visited.insert(Op.getNode()).second)
352*0b57cec5SDimitry Andric         Worklist.push_back(Op.getNode());
353*0b57cec5SDimitry Andric 
354*0b57cec5SDimitry Andric     if (isPassiveNode(NI))  // Leaf node, e.g. a TargetImmediate.
355*0b57cec5SDimitry Andric       continue;
356*0b57cec5SDimitry Andric 
357*0b57cec5SDimitry Andric     // If this node has already been processed, stop now.
358*0b57cec5SDimitry Andric     if (NI->getNodeId() != -1) continue;
359*0b57cec5SDimitry Andric 
360*0b57cec5SDimitry Andric     SUnit *NodeSUnit = newSUnit(NI);
361*0b57cec5SDimitry Andric 
362*0b57cec5SDimitry Andric     // See if anything is glued to this node, if so, add them to glued
363*0b57cec5SDimitry Andric     // nodes.  Nodes can have at most one glue input and one glue output.  Glue
364*0b57cec5SDimitry Andric     // is required to be the last operand and result of a node.
365*0b57cec5SDimitry Andric 
366*0b57cec5SDimitry Andric     // Scan up to find glued preds.
367*0b57cec5SDimitry Andric     SDNode *N = NI;
368*0b57cec5SDimitry Andric     while (N->getNumOperands() &&
369*0b57cec5SDimitry Andric            N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Glue) {
370*0b57cec5SDimitry Andric       N = N->getOperand(N->getNumOperands()-1).getNode();
371*0b57cec5SDimitry Andric       assert(N->getNodeId() == -1 && "Node already inserted!");
372*0b57cec5SDimitry Andric       N->setNodeId(NodeSUnit->NodeNum);
373*0b57cec5SDimitry Andric       if (N->isMachineOpcode() && TII->get(N->getMachineOpcode()).isCall())
374*0b57cec5SDimitry Andric         NodeSUnit->isCall = true;
375*0b57cec5SDimitry Andric     }
376*0b57cec5SDimitry Andric 
377*0b57cec5SDimitry Andric     // Scan down to find any glued succs.
378*0b57cec5SDimitry Andric     N = NI;
379*0b57cec5SDimitry Andric     while (N->getValueType(N->getNumValues()-1) == MVT::Glue) {
380*0b57cec5SDimitry Andric       SDValue GlueVal(N, N->getNumValues()-1);
381*0b57cec5SDimitry Andric 
382*0b57cec5SDimitry Andric       // There are either zero or one users of the Glue result.
383*0b57cec5SDimitry Andric       bool HasGlueUse = false;
384*0b57cec5SDimitry Andric       for (SDNode::use_iterator UI = N->use_begin(), E = N->use_end();
385*0b57cec5SDimitry Andric            UI != E; ++UI)
386*0b57cec5SDimitry Andric         if (GlueVal.isOperandOf(*UI)) {
387*0b57cec5SDimitry Andric           HasGlueUse = true;
388*0b57cec5SDimitry Andric           assert(N->getNodeId() == -1 && "Node already inserted!");
389*0b57cec5SDimitry Andric           N->setNodeId(NodeSUnit->NodeNum);
390*0b57cec5SDimitry Andric           N = *UI;
391*0b57cec5SDimitry Andric           if (N->isMachineOpcode() && TII->get(N->getMachineOpcode()).isCall())
392*0b57cec5SDimitry Andric             NodeSUnit->isCall = true;
393*0b57cec5SDimitry Andric           break;
394*0b57cec5SDimitry Andric         }
395*0b57cec5SDimitry Andric       if (!HasGlueUse) break;
396*0b57cec5SDimitry Andric     }
397*0b57cec5SDimitry Andric 
398*0b57cec5SDimitry Andric     if (NodeSUnit->isCall)
399*0b57cec5SDimitry Andric       CallSUnits.push_back(NodeSUnit);
400*0b57cec5SDimitry Andric 
401*0b57cec5SDimitry Andric     // Schedule zero-latency TokenFactor below any nodes that may increase the
402*0b57cec5SDimitry Andric     // schedule height. Otherwise, ancestors of the TokenFactor may appear to
403*0b57cec5SDimitry Andric     // have false stalls.
404*0b57cec5SDimitry Andric     if (NI->getOpcode() == ISD::TokenFactor)
405*0b57cec5SDimitry Andric       NodeSUnit->isScheduleLow = true;
406*0b57cec5SDimitry Andric 
407*0b57cec5SDimitry Andric     // If there are glue operands involved, N is now the bottom-most node
408*0b57cec5SDimitry Andric     // of the sequence of nodes that are glued together.
409*0b57cec5SDimitry Andric     // Update the SUnit.
410*0b57cec5SDimitry Andric     NodeSUnit->setNode(N);
411*0b57cec5SDimitry Andric     assert(N->getNodeId() == -1 && "Node already inserted!");
412*0b57cec5SDimitry Andric     N->setNodeId(NodeSUnit->NodeNum);
413*0b57cec5SDimitry Andric 
414*0b57cec5SDimitry Andric     // Compute NumRegDefsLeft. This must be done before AddSchedEdges.
415*0b57cec5SDimitry Andric     InitNumRegDefsLeft(NodeSUnit);
416*0b57cec5SDimitry Andric 
417*0b57cec5SDimitry Andric     // Assign the Latency field of NodeSUnit using target-provided information.
418*0b57cec5SDimitry Andric     computeLatency(NodeSUnit);
419*0b57cec5SDimitry Andric   }
420*0b57cec5SDimitry Andric 
421*0b57cec5SDimitry Andric   // Find all call operands.
422*0b57cec5SDimitry Andric   while (!CallSUnits.empty()) {
423*0b57cec5SDimitry Andric     SUnit *SU = CallSUnits.pop_back_val();
424*0b57cec5SDimitry Andric     for (const SDNode *SUNode = SU->getNode(); SUNode;
425*0b57cec5SDimitry Andric          SUNode = SUNode->getGluedNode()) {
426*0b57cec5SDimitry Andric       if (SUNode->getOpcode() != ISD::CopyToReg)
427*0b57cec5SDimitry Andric         continue;
428*0b57cec5SDimitry Andric       SDNode *SrcN = SUNode->getOperand(2).getNode();
429*0b57cec5SDimitry Andric       if (isPassiveNode(SrcN)) continue;   // Not scheduled.
430*0b57cec5SDimitry Andric       SUnit *SrcSU = &SUnits[SrcN->getNodeId()];
431*0b57cec5SDimitry Andric       SrcSU->isCallOp = true;
432*0b57cec5SDimitry Andric     }
433*0b57cec5SDimitry Andric   }
434*0b57cec5SDimitry Andric }
435*0b57cec5SDimitry Andric 
436*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::AddSchedEdges() {
437*0b57cec5SDimitry Andric   const TargetSubtargetInfo &ST = MF.getSubtarget();
438*0b57cec5SDimitry Andric 
439*0b57cec5SDimitry Andric   // Check to see if the scheduler cares about latencies.
440*0b57cec5SDimitry Andric   bool UnitLatencies = forceUnitLatencies();
441*0b57cec5SDimitry Andric 
442*0b57cec5SDimitry Andric   // Pass 2: add the preds, succs, etc.
443*0b57cec5SDimitry Andric   for (unsigned su = 0, e = SUnits.size(); su != e; ++su) {
444*0b57cec5SDimitry Andric     SUnit *SU = &SUnits[su];
445*0b57cec5SDimitry Andric     SDNode *MainNode = SU->getNode();
446*0b57cec5SDimitry Andric 
447*0b57cec5SDimitry Andric     if (MainNode->isMachineOpcode()) {
448*0b57cec5SDimitry Andric       unsigned Opc = MainNode->getMachineOpcode();
449*0b57cec5SDimitry Andric       const MCInstrDesc &MCID = TII->get(Opc);
450*0b57cec5SDimitry Andric       for (unsigned i = 0; i != MCID.getNumOperands(); ++i) {
451*0b57cec5SDimitry Andric         if (MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1) {
452*0b57cec5SDimitry Andric           SU->isTwoAddress = true;
453*0b57cec5SDimitry Andric           break;
454*0b57cec5SDimitry Andric         }
455*0b57cec5SDimitry Andric       }
456*0b57cec5SDimitry Andric       if (MCID.isCommutable())
457*0b57cec5SDimitry Andric         SU->isCommutable = true;
458*0b57cec5SDimitry Andric     }
459*0b57cec5SDimitry Andric 
460*0b57cec5SDimitry Andric     // Find all predecessors and successors of the group.
461*0b57cec5SDimitry Andric     for (SDNode *N = SU->getNode(); N; N = N->getGluedNode()) {
462*0b57cec5SDimitry Andric       if (N->isMachineOpcode() &&
463*0b57cec5SDimitry Andric           TII->get(N->getMachineOpcode()).getImplicitDefs()) {
464*0b57cec5SDimitry Andric         SU->hasPhysRegClobbers = true;
465*0b57cec5SDimitry Andric         unsigned NumUsed = InstrEmitter::CountResults(N);
466*0b57cec5SDimitry Andric         while (NumUsed != 0 && !N->hasAnyUseOfValue(NumUsed - 1))
467*0b57cec5SDimitry Andric           --NumUsed;    // Skip over unused values at the end.
468*0b57cec5SDimitry Andric         if (NumUsed > TII->get(N->getMachineOpcode()).getNumDefs())
469*0b57cec5SDimitry Andric           SU->hasPhysRegDefs = true;
470*0b57cec5SDimitry Andric       }
471*0b57cec5SDimitry Andric 
472*0b57cec5SDimitry Andric       for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
473*0b57cec5SDimitry Andric         SDNode *OpN = N->getOperand(i).getNode();
474*0b57cec5SDimitry Andric         if (isPassiveNode(OpN)) continue;   // Not scheduled.
475*0b57cec5SDimitry Andric         SUnit *OpSU = &SUnits[OpN->getNodeId()];
476*0b57cec5SDimitry Andric         assert(OpSU && "Node has no SUnit!");
477*0b57cec5SDimitry Andric         if (OpSU == SU) continue;           // In the same group.
478*0b57cec5SDimitry Andric 
479*0b57cec5SDimitry Andric         EVT OpVT = N->getOperand(i).getValueType();
480*0b57cec5SDimitry Andric         assert(OpVT != MVT::Glue && "Glued nodes should be in same sunit!");
481*0b57cec5SDimitry Andric         bool isChain = OpVT == MVT::Other;
482*0b57cec5SDimitry Andric 
483*0b57cec5SDimitry Andric         unsigned PhysReg = 0;
484*0b57cec5SDimitry Andric         int Cost = 1;
485*0b57cec5SDimitry Andric         // Determine if this is a physical register dependency.
486*0b57cec5SDimitry Andric         CheckForPhysRegDependency(OpN, N, i, TRI, TII, PhysReg, Cost);
487*0b57cec5SDimitry Andric         assert((PhysReg == 0 || !isChain) &&
488*0b57cec5SDimitry Andric                "Chain dependence via physreg data?");
489*0b57cec5SDimitry Andric         // FIXME: See ScheduleDAGSDNodes::EmitCopyFromReg. For now, scheduler
490*0b57cec5SDimitry Andric         // emits a copy from the physical register to a virtual register unless
491*0b57cec5SDimitry Andric         // it requires a cross class copy (cost < 0). That means we are only
492*0b57cec5SDimitry Andric         // treating "expensive to copy" register dependency as physical register
493*0b57cec5SDimitry Andric         // dependency. This may change in the future though.
494*0b57cec5SDimitry Andric         if (Cost >= 0 && !StressSched)
495*0b57cec5SDimitry Andric           PhysReg = 0;
496*0b57cec5SDimitry Andric 
497*0b57cec5SDimitry Andric         // If this is a ctrl dep, latency is 1.
498*0b57cec5SDimitry Andric         unsigned OpLatency = isChain ? 1 : OpSU->Latency;
499*0b57cec5SDimitry Andric         // Special-case TokenFactor chains as zero-latency.
500*0b57cec5SDimitry Andric         if(isChain && OpN->getOpcode() == ISD::TokenFactor)
501*0b57cec5SDimitry Andric           OpLatency = 0;
502*0b57cec5SDimitry Andric 
503*0b57cec5SDimitry Andric         SDep Dep = isChain ? SDep(OpSU, SDep::Barrier)
504*0b57cec5SDimitry Andric           : SDep(OpSU, SDep::Data, PhysReg);
505*0b57cec5SDimitry Andric         Dep.setLatency(OpLatency);
506*0b57cec5SDimitry Andric         if (!isChain && !UnitLatencies) {
507*0b57cec5SDimitry Andric           computeOperandLatency(OpN, N, i, Dep);
508*0b57cec5SDimitry Andric           ST.adjustSchedDependency(OpSU, SU, Dep);
509*0b57cec5SDimitry Andric         }
510*0b57cec5SDimitry Andric 
511*0b57cec5SDimitry Andric         if (!SU->addPred(Dep) && !Dep.isCtrl() && OpSU->NumRegDefsLeft > 1) {
512*0b57cec5SDimitry Andric           // Multiple register uses are combined in the same SUnit. For example,
513*0b57cec5SDimitry Andric           // we could have a set of glued nodes with all their defs consumed by
514*0b57cec5SDimitry Andric           // another set of glued nodes. Register pressure tracking sees this as
515*0b57cec5SDimitry Andric           // a single use, so to keep pressure balanced we reduce the defs.
516*0b57cec5SDimitry Andric           //
517*0b57cec5SDimitry Andric           // We can't tell (without more book-keeping) if this results from
518*0b57cec5SDimitry Andric           // glued nodes or duplicate operands. As long as we don't reduce
519*0b57cec5SDimitry Andric           // NumRegDefsLeft to zero, we handle the common cases well.
520*0b57cec5SDimitry Andric           --OpSU->NumRegDefsLeft;
521*0b57cec5SDimitry Andric         }
522*0b57cec5SDimitry Andric       }
523*0b57cec5SDimitry Andric     }
524*0b57cec5SDimitry Andric   }
525*0b57cec5SDimitry Andric }
526*0b57cec5SDimitry Andric 
527*0b57cec5SDimitry Andric /// BuildSchedGraph - Build the SUnit graph from the selection dag that we
528*0b57cec5SDimitry Andric /// are input.  This SUnit graph is similar to the SelectionDAG, but
529*0b57cec5SDimitry Andric /// excludes nodes that aren't interesting to scheduling, and represents
530*0b57cec5SDimitry Andric /// glued together nodes with a single SUnit.
531*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::BuildSchedGraph(AliasAnalysis *AA) {
532*0b57cec5SDimitry Andric   // Cluster certain nodes which should be scheduled together.
533*0b57cec5SDimitry Andric   ClusterNodes();
534*0b57cec5SDimitry Andric   // Populate the SUnits array.
535*0b57cec5SDimitry Andric   BuildSchedUnits();
536*0b57cec5SDimitry Andric   // Compute all the scheduling dependencies between nodes.
537*0b57cec5SDimitry Andric   AddSchedEdges();
538*0b57cec5SDimitry Andric }
539*0b57cec5SDimitry Andric 
540*0b57cec5SDimitry Andric // Initialize NumNodeDefs for the current Node's opcode.
541*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::RegDefIter::InitNodeNumDefs() {
542*0b57cec5SDimitry Andric   // Check for phys reg copy.
543*0b57cec5SDimitry Andric   if (!Node)
544*0b57cec5SDimitry Andric     return;
545*0b57cec5SDimitry Andric 
546*0b57cec5SDimitry Andric   if (!Node->isMachineOpcode()) {
547*0b57cec5SDimitry Andric     if (Node->getOpcode() == ISD::CopyFromReg)
548*0b57cec5SDimitry Andric       NodeNumDefs = 1;
549*0b57cec5SDimitry Andric     else
550*0b57cec5SDimitry Andric       NodeNumDefs = 0;
551*0b57cec5SDimitry Andric     return;
552*0b57cec5SDimitry Andric   }
553*0b57cec5SDimitry Andric   unsigned POpc = Node->getMachineOpcode();
554*0b57cec5SDimitry Andric   if (POpc == TargetOpcode::IMPLICIT_DEF) {
555*0b57cec5SDimitry Andric     // No register need be allocated for this.
556*0b57cec5SDimitry Andric     NodeNumDefs = 0;
557*0b57cec5SDimitry Andric     return;
558*0b57cec5SDimitry Andric   }
559*0b57cec5SDimitry Andric   if (POpc == TargetOpcode::PATCHPOINT &&
560*0b57cec5SDimitry Andric       Node->getValueType(0) == MVT::Other) {
561*0b57cec5SDimitry Andric     // PATCHPOINT is defined to have one result, but it might really have none
562*0b57cec5SDimitry Andric     // if we're not using CallingConv::AnyReg. Don't mistake the chain for a
563*0b57cec5SDimitry Andric     // real definition.
564*0b57cec5SDimitry Andric     NodeNumDefs = 0;
565*0b57cec5SDimitry Andric     return;
566*0b57cec5SDimitry Andric   }
567*0b57cec5SDimitry Andric   unsigned NRegDefs = SchedDAG->TII->get(Node->getMachineOpcode()).getNumDefs();
568*0b57cec5SDimitry Andric   // Some instructions define regs that are not represented in the selection DAG
569*0b57cec5SDimitry Andric   // (e.g. unused flags). See tMOVi8. Make sure we don't access past NumValues.
570*0b57cec5SDimitry Andric   NodeNumDefs = std::min(Node->getNumValues(), NRegDefs);
571*0b57cec5SDimitry Andric   DefIdx = 0;
572*0b57cec5SDimitry Andric }
573*0b57cec5SDimitry Andric 
574*0b57cec5SDimitry Andric // Construct a RegDefIter for this SUnit and find the first valid value.
575*0b57cec5SDimitry Andric ScheduleDAGSDNodes::RegDefIter::RegDefIter(const SUnit *SU,
576*0b57cec5SDimitry Andric                                            const ScheduleDAGSDNodes *SD)
577*0b57cec5SDimitry Andric   : SchedDAG(SD), Node(SU->getNode()), DefIdx(0), NodeNumDefs(0) {
578*0b57cec5SDimitry Andric   InitNodeNumDefs();
579*0b57cec5SDimitry Andric   Advance();
580*0b57cec5SDimitry Andric }
581*0b57cec5SDimitry Andric 
582*0b57cec5SDimitry Andric // Advance to the next valid value defined by the SUnit.
583*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::RegDefIter::Advance() {
584*0b57cec5SDimitry Andric   for (;Node;) { // Visit all glued nodes.
585*0b57cec5SDimitry Andric     for (;DefIdx < NodeNumDefs; ++DefIdx) {
586*0b57cec5SDimitry Andric       if (!Node->hasAnyUseOfValue(DefIdx))
587*0b57cec5SDimitry Andric         continue;
588*0b57cec5SDimitry Andric       ValueType = Node->getSimpleValueType(DefIdx);
589*0b57cec5SDimitry Andric       ++DefIdx;
590*0b57cec5SDimitry Andric       return; // Found a normal regdef.
591*0b57cec5SDimitry Andric     }
592*0b57cec5SDimitry Andric     Node = Node->getGluedNode();
593*0b57cec5SDimitry Andric     if (!Node) {
594*0b57cec5SDimitry Andric       return; // No values left to visit.
595*0b57cec5SDimitry Andric     }
596*0b57cec5SDimitry Andric     InitNodeNumDefs();
597*0b57cec5SDimitry Andric   }
598*0b57cec5SDimitry Andric }
599*0b57cec5SDimitry Andric 
600*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::InitNumRegDefsLeft(SUnit *SU) {
601*0b57cec5SDimitry Andric   assert(SU->NumRegDefsLeft == 0 && "expect a new node");
602*0b57cec5SDimitry Andric   for (RegDefIter I(SU, this); I.IsValid(); I.Advance()) {
603*0b57cec5SDimitry Andric     assert(SU->NumRegDefsLeft < USHRT_MAX && "overflow is ok but unexpected");
604*0b57cec5SDimitry Andric     ++SU->NumRegDefsLeft;
605*0b57cec5SDimitry Andric   }
606*0b57cec5SDimitry Andric }
607*0b57cec5SDimitry Andric 
608*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::computeLatency(SUnit *SU) {
609*0b57cec5SDimitry Andric   SDNode *N = SU->getNode();
610*0b57cec5SDimitry Andric 
611*0b57cec5SDimitry Andric   // TokenFactor operands are considered zero latency, and some schedulers
612*0b57cec5SDimitry Andric   // (e.g. Top-Down list) may rely on the fact that operand latency is nonzero
613*0b57cec5SDimitry Andric   // whenever node latency is nonzero.
614*0b57cec5SDimitry Andric   if (N && N->getOpcode() == ISD::TokenFactor) {
615*0b57cec5SDimitry Andric     SU->Latency = 0;
616*0b57cec5SDimitry Andric     return;
617*0b57cec5SDimitry Andric   }
618*0b57cec5SDimitry Andric 
619*0b57cec5SDimitry Andric   // Check to see if the scheduler cares about latencies.
620*0b57cec5SDimitry Andric   if (forceUnitLatencies()) {
621*0b57cec5SDimitry Andric     SU->Latency = 1;
622*0b57cec5SDimitry Andric     return;
623*0b57cec5SDimitry Andric   }
624*0b57cec5SDimitry Andric 
625*0b57cec5SDimitry Andric   if (!InstrItins || InstrItins->isEmpty()) {
626*0b57cec5SDimitry Andric     if (N && N->isMachineOpcode() &&
627*0b57cec5SDimitry Andric         TII->isHighLatencyDef(N->getMachineOpcode()))
628*0b57cec5SDimitry Andric       SU->Latency = HighLatencyCycles;
629*0b57cec5SDimitry Andric     else
630*0b57cec5SDimitry Andric       SU->Latency = 1;
631*0b57cec5SDimitry Andric     return;
632*0b57cec5SDimitry Andric   }
633*0b57cec5SDimitry Andric 
634*0b57cec5SDimitry Andric   // Compute the latency for the node.  We use the sum of the latencies for
635*0b57cec5SDimitry Andric   // all nodes glued together into this SUnit.
636*0b57cec5SDimitry Andric   SU->Latency = 0;
637*0b57cec5SDimitry Andric   for (SDNode *N = SU->getNode(); N; N = N->getGluedNode())
638*0b57cec5SDimitry Andric     if (N->isMachineOpcode())
639*0b57cec5SDimitry Andric       SU->Latency += TII->getInstrLatency(InstrItins, N);
640*0b57cec5SDimitry Andric }
641*0b57cec5SDimitry Andric 
642*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::computeOperandLatency(SDNode *Def, SDNode *Use,
643*0b57cec5SDimitry Andric                                                unsigned OpIdx, SDep& dep) const{
644*0b57cec5SDimitry Andric   // Check to see if the scheduler cares about latencies.
645*0b57cec5SDimitry Andric   if (forceUnitLatencies())
646*0b57cec5SDimitry Andric     return;
647*0b57cec5SDimitry Andric 
648*0b57cec5SDimitry Andric   if (dep.getKind() != SDep::Data)
649*0b57cec5SDimitry Andric     return;
650*0b57cec5SDimitry Andric 
651*0b57cec5SDimitry Andric   unsigned DefIdx = Use->getOperand(OpIdx).getResNo();
652*0b57cec5SDimitry Andric   if (Use->isMachineOpcode())
653*0b57cec5SDimitry Andric     // Adjust the use operand index by num of defs.
654*0b57cec5SDimitry Andric     OpIdx += TII->get(Use->getMachineOpcode()).getNumDefs();
655*0b57cec5SDimitry Andric   int Latency = TII->getOperandLatency(InstrItins, Def, DefIdx, Use, OpIdx);
656*0b57cec5SDimitry Andric   if (Latency > 1 && Use->getOpcode() == ISD::CopyToReg &&
657*0b57cec5SDimitry Andric       !BB->succ_empty()) {
658*0b57cec5SDimitry Andric     unsigned Reg = cast<RegisterSDNode>(Use->getOperand(1))->getReg();
659*0b57cec5SDimitry Andric     if (TargetRegisterInfo::isVirtualRegister(Reg))
660*0b57cec5SDimitry Andric       // This copy is a liveout value. It is likely coalesced, so reduce the
661*0b57cec5SDimitry Andric       // latency so not to penalize the def.
662*0b57cec5SDimitry Andric       // FIXME: need target specific adjustment here?
663*0b57cec5SDimitry Andric       Latency = (Latency > 1) ? Latency - 1 : 1;
664*0b57cec5SDimitry Andric   }
665*0b57cec5SDimitry Andric   if (Latency >= 0)
666*0b57cec5SDimitry Andric     dep.setLatency(Latency);
667*0b57cec5SDimitry Andric }
668*0b57cec5SDimitry Andric 
669*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::dumpNode(const SUnit &SU) const {
670*0b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
671*0b57cec5SDimitry Andric   dumpNodeName(SU);
672*0b57cec5SDimitry Andric   dbgs() << ": ";
673*0b57cec5SDimitry Andric 
674*0b57cec5SDimitry Andric   if (!SU.getNode()) {
675*0b57cec5SDimitry Andric     dbgs() << "PHYS REG COPY\n";
676*0b57cec5SDimitry Andric     return;
677*0b57cec5SDimitry Andric   }
678*0b57cec5SDimitry Andric 
679*0b57cec5SDimitry Andric   SU.getNode()->dump(DAG);
680*0b57cec5SDimitry Andric   dbgs() << "\n";
681*0b57cec5SDimitry Andric   SmallVector<SDNode *, 4> GluedNodes;
682*0b57cec5SDimitry Andric   for (SDNode *N = SU.getNode()->getGluedNode(); N; N = N->getGluedNode())
683*0b57cec5SDimitry Andric     GluedNodes.push_back(N);
684*0b57cec5SDimitry Andric   while (!GluedNodes.empty()) {
685*0b57cec5SDimitry Andric     dbgs() << "    ";
686*0b57cec5SDimitry Andric     GluedNodes.back()->dump(DAG);
687*0b57cec5SDimitry Andric     dbgs() << "\n";
688*0b57cec5SDimitry Andric     GluedNodes.pop_back();
689*0b57cec5SDimitry Andric   }
690*0b57cec5SDimitry Andric #endif
691*0b57cec5SDimitry Andric }
692*0b57cec5SDimitry Andric 
693*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::dump() const {
694*0b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
695*0b57cec5SDimitry Andric   if (EntrySU.getNode() != nullptr)
696*0b57cec5SDimitry Andric     dumpNodeAll(EntrySU);
697*0b57cec5SDimitry Andric   for (const SUnit &SU : SUnits)
698*0b57cec5SDimitry Andric     dumpNodeAll(SU);
699*0b57cec5SDimitry Andric   if (ExitSU.getNode() != nullptr)
700*0b57cec5SDimitry Andric     dumpNodeAll(ExitSU);
701*0b57cec5SDimitry Andric #endif
702*0b57cec5SDimitry Andric }
703*0b57cec5SDimitry Andric 
704*0b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
705*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::dumpSchedule() const {
706*0b57cec5SDimitry Andric   for (unsigned i = 0, e = Sequence.size(); i != e; i++) {
707*0b57cec5SDimitry Andric     if (SUnit *SU = Sequence[i])
708*0b57cec5SDimitry Andric       dumpNode(*SU);
709*0b57cec5SDimitry Andric     else
710*0b57cec5SDimitry Andric       dbgs() << "**** NOOP ****\n";
711*0b57cec5SDimitry Andric   }
712*0b57cec5SDimitry Andric }
713*0b57cec5SDimitry Andric #endif
714*0b57cec5SDimitry Andric 
715*0b57cec5SDimitry Andric #ifndef NDEBUG
716*0b57cec5SDimitry Andric /// VerifyScheduledSequence - Verify that all SUnits were scheduled and that
717*0b57cec5SDimitry Andric /// their state is consistent with the nodes listed in Sequence.
718*0b57cec5SDimitry Andric ///
719*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::VerifyScheduledSequence(bool isBottomUp) {
720*0b57cec5SDimitry Andric   unsigned ScheduledNodes = ScheduleDAG::VerifyScheduledDAG(isBottomUp);
721*0b57cec5SDimitry Andric   unsigned Noops = 0;
722*0b57cec5SDimitry Andric   for (unsigned i = 0, e = Sequence.size(); i != e; ++i)
723*0b57cec5SDimitry Andric     if (!Sequence[i])
724*0b57cec5SDimitry Andric       ++Noops;
725*0b57cec5SDimitry Andric   assert(Sequence.size() - Noops == ScheduledNodes &&
726*0b57cec5SDimitry Andric          "The number of nodes scheduled doesn't match the expected number!");
727*0b57cec5SDimitry Andric }
728*0b57cec5SDimitry Andric #endif // NDEBUG
729*0b57cec5SDimitry Andric 
730*0b57cec5SDimitry Andric /// ProcessSDDbgValues - Process SDDbgValues associated with this node.
731*0b57cec5SDimitry Andric static void
732*0b57cec5SDimitry Andric ProcessSDDbgValues(SDNode *N, SelectionDAG *DAG, InstrEmitter &Emitter,
733*0b57cec5SDimitry Andric                    SmallVectorImpl<std::pair<unsigned, MachineInstr*> > &Orders,
734*0b57cec5SDimitry Andric                    DenseMap<SDValue, unsigned> &VRBaseMap, unsigned Order) {
735*0b57cec5SDimitry Andric   if (!N->getHasDebugValue())
736*0b57cec5SDimitry Andric     return;
737*0b57cec5SDimitry Andric 
738*0b57cec5SDimitry Andric   // Opportunistically insert immediate dbg_value uses, i.e. those with the same
739*0b57cec5SDimitry Andric   // source order number as N.
740*0b57cec5SDimitry Andric   MachineBasicBlock *BB = Emitter.getBlock();
741*0b57cec5SDimitry Andric   MachineBasicBlock::iterator InsertPos = Emitter.getInsertPos();
742*0b57cec5SDimitry Andric   for (auto DV : DAG->GetDbgValues(N)) {
743*0b57cec5SDimitry Andric     if (DV->isEmitted())
744*0b57cec5SDimitry Andric       continue;
745*0b57cec5SDimitry Andric     unsigned DVOrder = DV->getOrder();
746*0b57cec5SDimitry Andric     if (!Order || DVOrder == Order) {
747*0b57cec5SDimitry Andric       MachineInstr *DbgMI = Emitter.EmitDbgValue(DV, VRBaseMap);
748*0b57cec5SDimitry Andric       if (DbgMI) {
749*0b57cec5SDimitry Andric         Orders.push_back({DVOrder, DbgMI});
750*0b57cec5SDimitry Andric         BB->insert(InsertPos, DbgMI);
751*0b57cec5SDimitry Andric       }
752*0b57cec5SDimitry Andric     }
753*0b57cec5SDimitry Andric   }
754*0b57cec5SDimitry Andric }
755*0b57cec5SDimitry Andric 
756*0b57cec5SDimitry Andric // ProcessSourceNode - Process nodes with source order numbers. These are added
757*0b57cec5SDimitry Andric // to a vector which EmitSchedule uses to determine how to insert dbg_value
758*0b57cec5SDimitry Andric // instructions in the right order.
759*0b57cec5SDimitry Andric static void
760*0b57cec5SDimitry Andric ProcessSourceNode(SDNode *N, SelectionDAG *DAG, InstrEmitter &Emitter,
761*0b57cec5SDimitry Andric                   DenseMap<SDValue, unsigned> &VRBaseMap,
762*0b57cec5SDimitry Andric                   SmallVectorImpl<std::pair<unsigned, MachineInstr *>> &Orders,
763*0b57cec5SDimitry Andric                   SmallSet<unsigned, 8> &Seen, MachineInstr *NewInsn) {
764*0b57cec5SDimitry Andric   unsigned Order = N->getIROrder();
765*0b57cec5SDimitry Andric   if (!Order || Seen.count(Order)) {
766*0b57cec5SDimitry Andric     // Process any valid SDDbgValues even if node does not have any order
767*0b57cec5SDimitry Andric     // assigned.
768*0b57cec5SDimitry Andric     ProcessSDDbgValues(N, DAG, Emitter, Orders, VRBaseMap, 0);
769*0b57cec5SDimitry Andric     return;
770*0b57cec5SDimitry Andric   }
771*0b57cec5SDimitry Andric 
772*0b57cec5SDimitry Andric   // If a new instruction was generated for this Order number, record it.
773*0b57cec5SDimitry Andric   // Otherwise, leave this order number unseen: we will either find later
774*0b57cec5SDimitry Andric   // instructions for it, or leave it unseen if there were no instructions at
775*0b57cec5SDimitry Andric   // all.
776*0b57cec5SDimitry Andric   if (NewInsn) {
777*0b57cec5SDimitry Andric     Seen.insert(Order);
778*0b57cec5SDimitry Andric     Orders.push_back({Order, NewInsn});
779*0b57cec5SDimitry Andric   }
780*0b57cec5SDimitry Andric 
781*0b57cec5SDimitry Andric   // Even if no instruction was generated, a Value may have become defined via
782*0b57cec5SDimitry Andric   // earlier nodes. Try to process them now.
783*0b57cec5SDimitry Andric   ProcessSDDbgValues(N, DAG, Emitter, Orders, VRBaseMap, Order);
784*0b57cec5SDimitry Andric }
785*0b57cec5SDimitry Andric 
786*0b57cec5SDimitry Andric void ScheduleDAGSDNodes::
787*0b57cec5SDimitry Andric EmitPhysRegCopy(SUnit *SU, DenseMap<SUnit*, unsigned> &VRBaseMap,
788*0b57cec5SDimitry Andric                 MachineBasicBlock::iterator InsertPos) {
789*0b57cec5SDimitry Andric   for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
790*0b57cec5SDimitry Andric        I != E; ++I) {
791*0b57cec5SDimitry Andric     if (I->isCtrl()) continue;  // ignore chain preds
792*0b57cec5SDimitry Andric     if (I->getSUnit()->CopyDstRC) {
793*0b57cec5SDimitry Andric       // Copy to physical register.
794*0b57cec5SDimitry Andric       DenseMap<SUnit*, unsigned>::iterator VRI = VRBaseMap.find(I->getSUnit());
795*0b57cec5SDimitry Andric       assert(VRI != VRBaseMap.end() && "Node emitted out of order - late");
796*0b57cec5SDimitry Andric       // Find the destination physical register.
797*0b57cec5SDimitry Andric       unsigned Reg = 0;
798*0b57cec5SDimitry Andric       for (SUnit::const_succ_iterator II = SU->Succs.begin(),
799*0b57cec5SDimitry Andric              EE = SU->Succs.end(); II != EE; ++II) {
800*0b57cec5SDimitry Andric         if (II->isCtrl()) continue;  // ignore chain preds
801*0b57cec5SDimitry Andric         if (II->getReg()) {
802*0b57cec5SDimitry Andric           Reg = II->getReg();
803*0b57cec5SDimitry Andric           break;
804*0b57cec5SDimitry Andric         }
805*0b57cec5SDimitry Andric       }
806*0b57cec5SDimitry Andric       BuildMI(*BB, InsertPos, DebugLoc(), TII->get(TargetOpcode::COPY), Reg)
807*0b57cec5SDimitry Andric         .addReg(VRI->second);
808*0b57cec5SDimitry Andric     } else {
809*0b57cec5SDimitry Andric       // Copy from physical register.
810*0b57cec5SDimitry Andric       assert(I->getReg() && "Unknown physical register!");
811*0b57cec5SDimitry Andric       unsigned VRBase = MRI.createVirtualRegister(SU->CopyDstRC);
812*0b57cec5SDimitry Andric       bool isNew = VRBaseMap.insert(std::make_pair(SU, VRBase)).second;
813*0b57cec5SDimitry Andric       (void)isNew; // Silence compiler warning.
814*0b57cec5SDimitry Andric       assert(isNew && "Node emitted out of order - early");
815*0b57cec5SDimitry Andric       BuildMI(*BB, InsertPos, DebugLoc(), TII->get(TargetOpcode::COPY), VRBase)
816*0b57cec5SDimitry Andric         .addReg(I->getReg());
817*0b57cec5SDimitry Andric     }
818*0b57cec5SDimitry Andric     break;
819*0b57cec5SDimitry Andric   }
820*0b57cec5SDimitry Andric }
821*0b57cec5SDimitry Andric 
822*0b57cec5SDimitry Andric /// EmitSchedule - Emit the machine code in scheduled order. Return the new
823*0b57cec5SDimitry Andric /// InsertPos and MachineBasicBlock that contains this insertion
824*0b57cec5SDimitry Andric /// point. ScheduleDAGSDNodes holds a BB pointer for convenience, but this does
825*0b57cec5SDimitry Andric /// not necessarily refer to returned BB. The emitter may split blocks.
826*0b57cec5SDimitry Andric MachineBasicBlock *ScheduleDAGSDNodes::
827*0b57cec5SDimitry Andric EmitSchedule(MachineBasicBlock::iterator &InsertPos) {
828*0b57cec5SDimitry Andric   InstrEmitter Emitter(BB, InsertPos);
829*0b57cec5SDimitry Andric   DenseMap<SDValue, unsigned> VRBaseMap;
830*0b57cec5SDimitry Andric   DenseMap<SUnit*, unsigned> CopyVRBaseMap;
831*0b57cec5SDimitry Andric   SmallVector<std::pair<unsigned, MachineInstr*>, 32> Orders;
832*0b57cec5SDimitry Andric   SmallSet<unsigned, 8> Seen;
833*0b57cec5SDimitry Andric   bool HasDbg = DAG->hasDebugValues();
834*0b57cec5SDimitry Andric 
835*0b57cec5SDimitry Andric   // Emit a node, and determine where its first instruction is for debuginfo.
836*0b57cec5SDimitry Andric   // Zero, one, or multiple instructions can be created when emitting a node.
837*0b57cec5SDimitry Andric   auto EmitNode =
838*0b57cec5SDimitry Andric       [&](SDNode *Node, bool IsClone, bool IsCloned,
839*0b57cec5SDimitry Andric           DenseMap<SDValue, unsigned> &VRBaseMap) -> MachineInstr * {
840*0b57cec5SDimitry Andric     // Fetch instruction prior to this, or end() if nonexistant.
841*0b57cec5SDimitry Andric     auto GetPrevInsn = [&](MachineBasicBlock::iterator I) {
842*0b57cec5SDimitry Andric       if (I == BB->begin())
843*0b57cec5SDimitry Andric         return BB->end();
844*0b57cec5SDimitry Andric       else
845*0b57cec5SDimitry Andric         return std::prev(Emitter.getInsertPos());
846*0b57cec5SDimitry Andric     };
847*0b57cec5SDimitry Andric 
848*0b57cec5SDimitry Andric     MachineBasicBlock::iterator Before = GetPrevInsn(Emitter.getInsertPos());
849*0b57cec5SDimitry Andric     Emitter.EmitNode(Node, IsClone, IsCloned, VRBaseMap);
850*0b57cec5SDimitry Andric     MachineBasicBlock::iterator After = GetPrevInsn(Emitter.getInsertPos());
851*0b57cec5SDimitry Andric 
852*0b57cec5SDimitry Andric     // If the iterator did not change, no instructions were inserted.
853*0b57cec5SDimitry Andric     if (Before == After)
854*0b57cec5SDimitry Andric       return nullptr;
855*0b57cec5SDimitry Andric 
856*0b57cec5SDimitry Andric     MachineInstr *MI;
857*0b57cec5SDimitry Andric     if (Before == BB->end()) {
858*0b57cec5SDimitry Andric       // There were no prior instructions; the new ones must start at the
859*0b57cec5SDimitry Andric       // beginning of the block.
860*0b57cec5SDimitry Andric       MI = &Emitter.getBlock()->instr_front();
861*0b57cec5SDimitry Andric     } else {
862*0b57cec5SDimitry Andric       // Return first instruction after the pre-existing instructions.
863*0b57cec5SDimitry Andric       MI = &*std::next(Before);
864*0b57cec5SDimitry Andric     }
865*0b57cec5SDimitry Andric 
866*0b57cec5SDimitry Andric     if (MI->isCall() && DAG->getTarget().Options.EnableDebugEntryValues)
867*0b57cec5SDimitry Andric       MF.addCallArgsForwardingRegs(MI, DAG->getSDCallSiteInfo(Node));
868*0b57cec5SDimitry Andric 
869*0b57cec5SDimitry Andric     return MI;
870*0b57cec5SDimitry Andric   };
871*0b57cec5SDimitry Andric 
872*0b57cec5SDimitry Andric   // If this is the first BB, emit byval parameter dbg_value's.
873*0b57cec5SDimitry Andric   if (HasDbg && BB->getParent()->begin() == MachineFunction::iterator(BB)) {
874*0b57cec5SDimitry Andric     SDDbgInfo::DbgIterator PDI = DAG->ByvalParmDbgBegin();
875*0b57cec5SDimitry Andric     SDDbgInfo::DbgIterator PDE = DAG->ByvalParmDbgEnd();
876*0b57cec5SDimitry Andric     for (; PDI != PDE; ++PDI) {
877*0b57cec5SDimitry Andric       MachineInstr *DbgMI= Emitter.EmitDbgValue(*PDI, VRBaseMap);
878*0b57cec5SDimitry Andric       if (DbgMI) {
879*0b57cec5SDimitry Andric         BB->insert(InsertPos, DbgMI);
880*0b57cec5SDimitry Andric         // We re-emit the dbg_value closer to its use, too, after instructions
881*0b57cec5SDimitry Andric         // are emitted to the BB.
882*0b57cec5SDimitry Andric         (*PDI)->clearIsEmitted();
883*0b57cec5SDimitry Andric       }
884*0b57cec5SDimitry Andric     }
885*0b57cec5SDimitry Andric   }
886*0b57cec5SDimitry Andric 
887*0b57cec5SDimitry Andric   for (unsigned i = 0, e = Sequence.size(); i != e; i++) {
888*0b57cec5SDimitry Andric     SUnit *SU = Sequence[i];
889*0b57cec5SDimitry Andric     if (!SU) {
890*0b57cec5SDimitry Andric       // Null SUnit* is a noop.
891*0b57cec5SDimitry Andric       TII->insertNoop(*Emitter.getBlock(), InsertPos);
892*0b57cec5SDimitry Andric       continue;
893*0b57cec5SDimitry Andric     }
894*0b57cec5SDimitry Andric 
895*0b57cec5SDimitry Andric     // For pre-regalloc scheduling, create instructions corresponding to the
896*0b57cec5SDimitry Andric     // SDNode and any glued SDNodes and append them to the block.
897*0b57cec5SDimitry Andric     if (!SU->getNode()) {
898*0b57cec5SDimitry Andric       // Emit a copy.
899*0b57cec5SDimitry Andric       EmitPhysRegCopy(SU, CopyVRBaseMap, InsertPos);
900*0b57cec5SDimitry Andric       continue;
901*0b57cec5SDimitry Andric     }
902*0b57cec5SDimitry Andric 
903*0b57cec5SDimitry Andric     SmallVector<SDNode *, 4> GluedNodes;
904*0b57cec5SDimitry Andric     for (SDNode *N = SU->getNode()->getGluedNode(); N; N = N->getGluedNode())
905*0b57cec5SDimitry Andric       GluedNodes.push_back(N);
906*0b57cec5SDimitry Andric     while (!GluedNodes.empty()) {
907*0b57cec5SDimitry Andric       SDNode *N = GluedNodes.back();
908*0b57cec5SDimitry Andric       auto NewInsn = EmitNode(N, SU->OrigNode != SU, SU->isCloned, VRBaseMap);
909*0b57cec5SDimitry Andric       // Remember the source order of the inserted instruction.
910*0b57cec5SDimitry Andric       if (HasDbg)
911*0b57cec5SDimitry Andric         ProcessSourceNode(N, DAG, Emitter, VRBaseMap, Orders, Seen, NewInsn);
912*0b57cec5SDimitry Andric 
913*0b57cec5SDimitry Andric       if (MDNode *MD = DAG->getHeapAllocSite(N)) {
914*0b57cec5SDimitry Andric         if (NewInsn && NewInsn->isCall())
915*0b57cec5SDimitry Andric           MF.addCodeViewHeapAllocSite(NewInsn, MD);
916*0b57cec5SDimitry Andric       }
917*0b57cec5SDimitry Andric 
918*0b57cec5SDimitry Andric       GluedNodes.pop_back();
919*0b57cec5SDimitry Andric     }
920*0b57cec5SDimitry Andric     auto NewInsn =
921*0b57cec5SDimitry Andric         EmitNode(SU->getNode(), SU->OrigNode != SU, SU->isCloned, VRBaseMap);
922*0b57cec5SDimitry Andric     // Remember the source order of the inserted instruction.
923*0b57cec5SDimitry Andric     if (HasDbg)
924*0b57cec5SDimitry Andric       ProcessSourceNode(SU->getNode(), DAG, Emitter, VRBaseMap, Orders, Seen,
925*0b57cec5SDimitry Andric                         NewInsn);
926*0b57cec5SDimitry Andric     if (MDNode *MD = DAG->getHeapAllocSite(SU->getNode())) {
927*0b57cec5SDimitry Andric       if (NewInsn && NewInsn->isCall())
928*0b57cec5SDimitry Andric         MF.addCodeViewHeapAllocSite(NewInsn, MD);
929*0b57cec5SDimitry Andric     }
930*0b57cec5SDimitry Andric   }
931*0b57cec5SDimitry Andric 
932*0b57cec5SDimitry Andric   // Insert all the dbg_values which have not already been inserted in source
933*0b57cec5SDimitry Andric   // order sequence.
934*0b57cec5SDimitry Andric   if (HasDbg) {
935*0b57cec5SDimitry Andric     MachineBasicBlock::iterator BBBegin = BB->getFirstNonPHI();
936*0b57cec5SDimitry Andric 
937*0b57cec5SDimitry Andric     // Sort the source order instructions and use the order to insert debug
938*0b57cec5SDimitry Andric     // values. Use stable_sort so that DBG_VALUEs are inserted in the same order
939*0b57cec5SDimitry Andric     // regardless of the host's implementation fo std::sort.
940*0b57cec5SDimitry Andric     llvm::stable_sort(Orders, less_first());
941*0b57cec5SDimitry Andric     std::stable_sort(DAG->DbgBegin(), DAG->DbgEnd(),
942*0b57cec5SDimitry Andric                      [](const SDDbgValue *LHS, const SDDbgValue *RHS) {
943*0b57cec5SDimitry Andric                        return LHS->getOrder() < RHS->getOrder();
944*0b57cec5SDimitry Andric                      });
945*0b57cec5SDimitry Andric 
946*0b57cec5SDimitry Andric     SDDbgInfo::DbgIterator DI = DAG->DbgBegin();
947*0b57cec5SDimitry Andric     SDDbgInfo::DbgIterator DE = DAG->DbgEnd();
948*0b57cec5SDimitry Andric     // Now emit the rest according to source order.
949*0b57cec5SDimitry Andric     unsigned LastOrder = 0;
950*0b57cec5SDimitry Andric     for (unsigned i = 0, e = Orders.size(); i != e && DI != DE; ++i) {
951*0b57cec5SDimitry Andric       unsigned Order = Orders[i].first;
952*0b57cec5SDimitry Andric       MachineInstr *MI = Orders[i].second;
953*0b57cec5SDimitry Andric       // Insert all SDDbgValue's whose order(s) are before "Order".
954*0b57cec5SDimitry Andric       assert(MI);
955*0b57cec5SDimitry Andric       for (; DI != DE; ++DI) {
956*0b57cec5SDimitry Andric         if ((*DI)->getOrder() < LastOrder || (*DI)->getOrder() >= Order)
957*0b57cec5SDimitry Andric           break;
958*0b57cec5SDimitry Andric         if ((*DI)->isEmitted())
959*0b57cec5SDimitry Andric           continue;
960*0b57cec5SDimitry Andric 
961*0b57cec5SDimitry Andric         MachineInstr *DbgMI = Emitter.EmitDbgValue(*DI, VRBaseMap);
962*0b57cec5SDimitry Andric         if (DbgMI) {
963*0b57cec5SDimitry Andric           if (!LastOrder)
964*0b57cec5SDimitry Andric             // Insert to start of the BB (after PHIs).
965*0b57cec5SDimitry Andric             BB->insert(BBBegin, DbgMI);
966*0b57cec5SDimitry Andric           else {
967*0b57cec5SDimitry Andric             // Insert at the instruction, which may be in a different
968*0b57cec5SDimitry Andric             // block, if the block was split by a custom inserter.
969*0b57cec5SDimitry Andric             MachineBasicBlock::iterator Pos = MI;
970*0b57cec5SDimitry Andric             MI->getParent()->insert(Pos, DbgMI);
971*0b57cec5SDimitry Andric           }
972*0b57cec5SDimitry Andric         }
973*0b57cec5SDimitry Andric       }
974*0b57cec5SDimitry Andric       LastOrder = Order;
975*0b57cec5SDimitry Andric     }
976*0b57cec5SDimitry Andric     // Add trailing DbgValue's before the terminator. FIXME: May want to add
977*0b57cec5SDimitry Andric     // some of them before one or more conditional branches?
978*0b57cec5SDimitry Andric     SmallVector<MachineInstr*, 8> DbgMIs;
979*0b57cec5SDimitry Andric     for (; DI != DE; ++DI) {
980*0b57cec5SDimitry Andric       if ((*DI)->isEmitted())
981*0b57cec5SDimitry Andric         continue;
982*0b57cec5SDimitry Andric       assert((*DI)->getOrder() >= LastOrder &&
983*0b57cec5SDimitry Andric              "emitting DBG_VALUE out of order");
984*0b57cec5SDimitry Andric       if (MachineInstr *DbgMI = Emitter.EmitDbgValue(*DI, VRBaseMap))
985*0b57cec5SDimitry Andric         DbgMIs.push_back(DbgMI);
986*0b57cec5SDimitry Andric     }
987*0b57cec5SDimitry Andric 
988*0b57cec5SDimitry Andric     MachineBasicBlock *InsertBB = Emitter.getBlock();
989*0b57cec5SDimitry Andric     MachineBasicBlock::iterator Pos = InsertBB->getFirstTerminator();
990*0b57cec5SDimitry Andric     InsertBB->insert(Pos, DbgMIs.begin(), DbgMIs.end());
991*0b57cec5SDimitry Andric 
992*0b57cec5SDimitry Andric     SDDbgInfo::DbgLabelIterator DLI = DAG->DbgLabelBegin();
993*0b57cec5SDimitry Andric     SDDbgInfo::DbgLabelIterator DLE = DAG->DbgLabelEnd();
994*0b57cec5SDimitry Andric     // Now emit the rest according to source order.
995*0b57cec5SDimitry Andric     LastOrder = 0;
996*0b57cec5SDimitry Andric     for (const auto &InstrOrder : Orders) {
997*0b57cec5SDimitry Andric       unsigned Order = InstrOrder.first;
998*0b57cec5SDimitry Andric       MachineInstr *MI = InstrOrder.second;
999*0b57cec5SDimitry Andric       if (!MI)
1000*0b57cec5SDimitry Andric         continue;
1001*0b57cec5SDimitry Andric 
1002*0b57cec5SDimitry Andric       // Insert all SDDbgLabel's whose order(s) are before "Order".
1003*0b57cec5SDimitry Andric       for (; DLI != DLE &&
1004*0b57cec5SDimitry Andric              (*DLI)->getOrder() >= LastOrder && (*DLI)->getOrder() < Order;
1005*0b57cec5SDimitry Andric              ++DLI) {
1006*0b57cec5SDimitry Andric         MachineInstr *DbgMI = Emitter.EmitDbgLabel(*DLI);
1007*0b57cec5SDimitry Andric         if (DbgMI) {
1008*0b57cec5SDimitry Andric           if (!LastOrder)
1009*0b57cec5SDimitry Andric             // Insert to start of the BB (after PHIs).
1010*0b57cec5SDimitry Andric             BB->insert(BBBegin, DbgMI);
1011*0b57cec5SDimitry Andric           else {
1012*0b57cec5SDimitry Andric             // Insert at the instruction, which may be in a different
1013*0b57cec5SDimitry Andric             // block, if the block was split by a custom inserter.
1014*0b57cec5SDimitry Andric             MachineBasicBlock::iterator Pos = MI;
1015*0b57cec5SDimitry Andric             MI->getParent()->insert(Pos, DbgMI);
1016*0b57cec5SDimitry Andric           }
1017*0b57cec5SDimitry Andric         }
1018*0b57cec5SDimitry Andric       }
1019*0b57cec5SDimitry Andric       if (DLI == DLE)
1020*0b57cec5SDimitry Andric         break;
1021*0b57cec5SDimitry Andric 
1022*0b57cec5SDimitry Andric       LastOrder = Order;
1023*0b57cec5SDimitry Andric     }
1024*0b57cec5SDimitry Andric   }
1025*0b57cec5SDimitry Andric 
1026*0b57cec5SDimitry Andric   InsertPos = Emitter.getInsertPos();
1027*0b57cec5SDimitry Andric   return Emitter.getBlock();
1028*0b57cec5SDimitry Andric }
1029*0b57cec5SDimitry Andric 
1030*0b57cec5SDimitry Andric /// Return the basic block label.
1031*0b57cec5SDimitry Andric std::string ScheduleDAGSDNodes::getDAGName() const {
1032*0b57cec5SDimitry Andric   return "sunit-dag." + BB->getFullName();
1033*0b57cec5SDimitry Andric }
1034