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