1 //===- RDFGraph.cpp -------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Target-independent, SSA-based data flow graph for register data flow (RDF).
10 //
11 #include "llvm/CodeGen/RDFGraph.h"
12 #include "llvm/ADT/BitVector.h"
13 #include "llvm/ADT/STLExtras.h"
14 #include "llvm/ADT/SetVector.h"
15 #include "llvm/CodeGen/MachineBasicBlock.h"
16 #include "llvm/CodeGen/MachineDominanceFrontier.h"
17 #include "llvm/CodeGen/MachineDominators.h"
18 #include "llvm/CodeGen/MachineFunction.h"
19 #include "llvm/CodeGen/MachineInstr.h"
20 #include "llvm/CodeGen/MachineOperand.h"
21 #include "llvm/CodeGen/MachineRegisterInfo.h"
22 #include "llvm/CodeGen/RDFRegisters.h"
23 #include "llvm/CodeGen/TargetInstrInfo.h"
24 #include "llvm/CodeGen/TargetLowering.h"
25 #include "llvm/CodeGen/TargetRegisterInfo.h"
26 #include "llvm/CodeGen/TargetSubtargetInfo.h"
27 #include "llvm/IR/Function.h"
28 #include "llvm/MC/LaneBitmask.h"
29 #include "llvm/MC/MCInstrDesc.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/raw_ostream.h"
32 #include <algorithm>
33 #include <cassert>
34 #include <cstdint>
35 #include <cstring>
36 #include <iterator>
37 #include <set>
38 #include <utility>
39 #include <vector>
40 
41 using namespace llvm;
42 using namespace rdf;
43 
44 // Printing functions. Have them here first, so that the rest of the code
45 // can use them.
46 namespace llvm {
47 namespace rdf {
48 
49 raw_ostream &operator<< (raw_ostream &OS, const PrintLaneMaskOpt &P) {
50   if (!P.Mask.all())
51     OS << ':' << PrintLaneMask(P.Mask);
52   return OS;
53 }
54 
55 raw_ostream &operator<< (raw_ostream &OS, const Print<RegisterRef> &P) {
56   auto &TRI = P.G.getTRI();
57   if (P.Obj.Reg > 0 && P.Obj.Reg < TRI.getNumRegs())
58     OS << TRI.getName(P.Obj.Reg);
59   else
60     OS << '#' << P.Obj.Reg;
61   OS << PrintLaneMaskOpt(P.Obj.Mask);
62   return OS;
63 }
64 
65 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeId> &P) {
66   auto NA = P.G.addr<NodeBase*>(P.Obj);
67   uint16_t Attrs = NA.Addr->getAttrs();
68   uint16_t Kind = NodeAttrs::kind(Attrs);
69   uint16_t Flags = NodeAttrs::flags(Attrs);
70   switch (NodeAttrs::type(Attrs)) {
71     case NodeAttrs::Code:
72       switch (Kind) {
73         case NodeAttrs::Func:   OS << 'f'; break;
74         case NodeAttrs::Block:  OS << 'b'; break;
75         case NodeAttrs::Stmt:   OS << 's'; break;
76         case NodeAttrs::Phi:    OS << 'p'; break;
77         default:                OS << "c?"; break;
78       }
79       break;
80     case NodeAttrs::Ref:
81       if (Flags & NodeAttrs::Undef)
82         OS << '/';
83       if (Flags & NodeAttrs::Dead)
84         OS << '\\';
85       if (Flags & NodeAttrs::Preserving)
86         OS << '+';
87       if (Flags & NodeAttrs::Clobbering)
88         OS << '~';
89       switch (Kind) {
90         case NodeAttrs::Use:    OS << 'u'; break;
91         case NodeAttrs::Def:    OS << 'd'; break;
92         case NodeAttrs::Block:  OS << 'b'; break;
93         default:                OS << "r?"; break;
94       }
95       break;
96     default:
97       OS << '?';
98       break;
99   }
100   OS << P.Obj;
101   if (Flags & NodeAttrs::Shadow)
102     OS << '"';
103   return OS;
104 }
105 
106 static void printRefHeader(raw_ostream &OS, const NodeAddr<RefNode*> RA,
107                 const DataFlowGraph &G) {
108   OS << Print<NodeId>(RA.Id, G) << '<'
109      << Print<RegisterRef>(RA.Addr->getRegRef(G), G) << '>';
110   if (RA.Addr->getFlags() & NodeAttrs::Fixed)
111     OS << '!';
112 }
113 
114 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeAddr<DefNode*>> &P) {
115   printRefHeader(OS, P.Obj, P.G);
116   OS << '(';
117   if (NodeId N = P.Obj.Addr->getReachingDef())
118     OS << Print<NodeId>(N, P.G);
119   OS << ',';
120   if (NodeId N = P.Obj.Addr->getReachedDef())
121     OS << Print<NodeId>(N, P.G);
122   OS << ',';
123   if (NodeId N = P.Obj.Addr->getReachedUse())
124     OS << Print<NodeId>(N, P.G);
125   OS << "):";
126   if (NodeId N = P.Obj.Addr->getSibling())
127     OS << Print<NodeId>(N, P.G);
128   return OS;
129 }
130 
131 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeAddr<UseNode*>> &P) {
132   printRefHeader(OS, P.Obj, P.G);
133   OS << '(';
134   if (NodeId N = P.Obj.Addr->getReachingDef())
135     OS << Print<NodeId>(N, P.G);
136   OS << "):";
137   if (NodeId N = P.Obj.Addr->getSibling())
138     OS << Print<NodeId>(N, P.G);
139   return OS;
140 }
141 
142 raw_ostream &operator<< (raw_ostream &OS,
143       const Print<NodeAddr<PhiUseNode*>> &P) {
144   printRefHeader(OS, P.Obj, P.G);
145   OS << '(';
146   if (NodeId N = P.Obj.Addr->getReachingDef())
147     OS << Print<NodeId>(N, P.G);
148   OS << ',';
149   if (NodeId N = P.Obj.Addr->getPredecessor())
150     OS << Print<NodeId>(N, P.G);
151   OS << "):";
152   if (NodeId N = P.Obj.Addr->getSibling())
153     OS << Print<NodeId>(N, P.G);
154   return OS;
155 }
156 
157 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeAddr<RefNode*>> &P) {
158   switch (P.Obj.Addr->getKind()) {
159     case NodeAttrs::Def:
160       OS << PrintNode<DefNode*>(P.Obj, P.G);
161       break;
162     case NodeAttrs::Use:
163       if (P.Obj.Addr->getFlags() & NodeAttrs::PhiRef)
164         OS << PrintNode<PhiUseNode*>(P.Obj, P.G);
165       else
166         OS << PrintNode<UseNode*>(P.Obj, P.G);
167       break;
168   }
169   return OS;
170 }
171 
172 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeList> &P) {
173   unsigned N = P.Obj.size();
174   for (auto I : P.Obj) {
175     OS << Print<NodeId>(I.Id, P.G);
176     if (--N)
177       OS << ' ';
178   }
179   return OS;
180 }
181 
182 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeSet> &P) {
183   unsigned N = P.Obj.size();
184   for (auto I : P.Obj) {
185     OS << Print<NodeId>(I, P.G);
186     if (--N)
187       OS << ' ';
188   }
189   return OS;
190 }
191 
192 namespace {
193 
194   template <typename T>
195   struct PrintListV {
196     PrintListV(const NodeList &L, const DataFlowGraph &G) : List(L), G(G) {}
197 
198     using Type = T;
199     const NodeList &List;
200     const DataFlowGraph &G;
201   };
202 
203   template <typename T>
204   raw_ostream &operator<< (raw_ostream &OS, const PrintListV<T> &P) {
205     unsigned N = P.List.size();
206     for (NodeAddr<T> A : P.List) {
207       OS << PrintNode<T>(A, P.G);
208       if (--N)
209         OS << ", ";
210     }
211     return OS;
212   }
213 
214 } // end anonymous namespace
215 
216 raw_ostream &operator<< (raw_ostream &OS, const Print<NodeAddr<PhiNode*>> &P) {
217   OS << Print<NodeId>(P.Obj.Id, P.G) << ": phi ["
218      << PrintListV<RefNode*>(P.Obj.Addr->members(P.G), P.G) << ']';
219   return OS;
220 }
221 
222 raw_ostream &operator<<(raw_ostream &OS, const Print<NodeAddr<StmtNode *>> &P) {
223   const MachineInstr &MI = *P.Obj.Addr->getCode();
224   unsigned Opc = MI.getOpcode();
225   OS << Print<NodeId>(P.Obj.Id, P.G) << ": " << P.G.getTII().getName(Opc);
226   // Print the target for calls and branches (for readability).
227   if (MI.isCall() || MI.isBranch()) {
228     MachineInstr::const_mop_iterator T =
229           llvm::find_if(MI.operands(),
230                         [] (const MachineOperand &Op) -> bool {
231                           return Op.isMBB() || Op.isGlobal() || Op.isSymbol();
232                         });
233     if (T != MI.operands_end()) {
234       OS << ' ';
235       if (T->isMBB())
236         OS << printMBBReference(*T->getMBB());
237       else if (T->isGlobal())
238         OS << T->getGlobal()->getName();
239       else if (T->isSymbol())
240         OS << T->getSymbolName();
241     }
242   }
243   OS << " [" << PrintListV<RefNode*>(P.Obj.Addr->members(P.G), P.G) << ']';
244   return OS;
245 }
246 
247 raw_ostream &operator<< (raw_ostream &OS,
248       const Print<NodeAddr<InstrNode*>> &P) {
249   switch (P.Obj.Addr->getKind()) {
250     case NodeAttrs::Phi:
251       OS << PrintNode<PhiNode*>(P.Obj, P.G);
252       break;
253     case NodeAttrs::Stmt:
254       OS << PrintNode<StmtNode*>(P.Obj, P.G);
255       break;
256     default:
257       OS << "instr? " << Print<NodeId>(P.Obj.Id, P.G);
258       break;
259   }
260   return OS;
261 }
262 
263 raw_ostream &operator<< (raw_ostream &OS,
264       const Print<NodeAddr<BlockNode*>> &P) {
265   MachineBasicBlock *BB = P.Obj.Addr->getCode();
266   unsigned NP = BB->pred_size();
267   std::vector<int> Ns;
268   auto PrintBBs = [&OS] (std::vector<int> Ns) -> void {
269     unsigned N = Ns.size();
270     for (int I : Ns) {
271       OS << "%bb." << I;
272       if (--N)
273         OS << ", ";
274     }
275   };
276 
277   OS << Print<NodeId>(P.Obj.Id, P.G) << ": --- " << printMBBReference(*BB)
278      << " --- preds(" << NP << "): ";
279   for (MachineBasicBlock *B : BB->predecessors())
280     Ns.push_back(B->getNumber());
281   PrintBBs(Ns);
282 
283   unsigned NS = BB->succ_size();
284   OS << "  succs(" << NS << "): ";
285   Ns.clear();
286   for (MachineBasicBlock *B : BB->successors())
287     Ns.push_back(B->getNumber());
288   PrintBBs(Ns);
289   OS << '\n';
290 
291   for (auto I : P.Obj.Addr->members(P.G))
292     OS << PrintNode<InstrNode*>(I, P.G) << '\n';
293   return OS;
294 }
295 
296 raw_ostream &operator<<(raw_ostream &OS, const Print<NodeAddr<FuncNode *>> &P) {
297   OS << "DFG dump:[\n" << Print<NodeId>(P.Obj.Id, P.G) << ": Function: "
298      << P.Obj.Addr->getCode()->getName() << '\n';
299   for (auto I : P.Obj.Addr->members(P.G))
300     OS << PrintNode<BlockNode*>(I, P.G) << '\n';
301   OS << "]\n";
302   return OS;
303 }
304 
305 raw_ostream &operator<< (raw_ostream &OS, const Print<RegisterSet> &P) {
306   OS << '{';
307   for (auto I : P.Obj)
308     OS << ' ' << Print<RegisterRef>(I, P.G);
309   OS << " }";
310   return OS;
311 }
312 
313 raw_ostream &operator<< (raw_ostream &OS, const Print<RegisterAggr> &P) {
314   P.Obj.print(OS);
315   return OS;
316 }
317 
318 raw_ostream &operator<< (raw_ostream &OS,
319       const Print<DataFlowGraph::DefStack> &P) {
320   for (auto I = P.Obj.top(), E = P.Obj.bottom(); I != E; ) {
321     OS << Print<NodeId>(I->Id, P.G)
322        << '<' << Print<RegisterRef>(I->Addr->getRegRef(P.G), P.G) << '>';
323     I.down();
324     if (I != E)
325       OS << ' ';
326   }
327   return OS;
328 }
329 
330 } // end namespace rdf
331 } // end namespace llvm
332 
333 // Node allocation functions.
334 //
335 // Node allocator is like a slab memory allocator: it allocates blocks of
336 // memory in sizes that are multiples of the size of a node. Each block has
337 // the same size. Nodes are allocated from the currently active block, and
338 // when it becomes full, a new one is created.
339 // There is a mapping scheme between node id and its location in a block,
340 // and within that block is described in the header file.
341 //
342 void NodeAllocator::startNewBlock() {
343   void *T = MemPool.Allocate(NodesPerBlock*NodeMemSize, NodeMemSize);
344   char *P = static_cast<char*>(T);
345   Blocks.push_back(P);
346   // Check if the block index is still within the allowed range, i.e. less
347   // than 2^N, where N is the number of bits in NodeId for the block index.
348   // BitsPerIndex is the number of bits per node index.
349   assert((Blocks.size() < ((size_t)1 << (8*sizeof(NodeId)-BitsPerIndex))) &&
350          "Out of bits for block index");
351   ActiveEnd = P;
352 }
353 
354 bool NodeAllocator::needNewBlock() {
355   if (Blocks.empty())
356     return true;
357 
358   char *ActiveBegin = Blocks.back();
359   uint32_t Index = (ActiveEnd-ActiveBegin)/NodeMemSize;
360   return Index >= NodesPerBlock;
361 }
362 
363 NodeAddr<NodeBase*> NodeAllocator::New() {
364   if (needNewBlock())
365     startNewBlock();
366 
367   uint32_t ActiveB = Blocks.size()-1;
368   uint32_t Index = (ActiveEnd - Blocks[ActiveB])/NodeMemSize;
369   NodeAddr<NodeBase*> NA = { reinterpret_cast<NodeBase*>(ActiveEnd),
370                              makeId(ActiveB, Index) };
371   ActiveEnd += NodeMemSize;
372   return NA;
373 }
374 
375 NodeId NodeAllocator::id(const NodeBase *P) const {
376   uintptr_t A = reinterpret_cast<uintptr_t>(P);
377   for (unsigned i = 0, n = Blocks.size(); i != n; ++i) {
378     uintptr_t B = reinterpret_cast<uintptr_t>(Blocks[i]);
379     if (A < B || A >= B + NodesPerBlock*NodeMemSize)
380       continue;
381     uint32_t Idx = (A-B)/NodeMemSize;
382     return makeId(i, Idx);
383   }
384   llvm_unreachable("Invalid node address");
385 }
386 
387 void NodeAllocator::clear() {
388   MemPool.Reset();
389   Blocks.clear();
390   ActiveEnd = nullptr;
391 }
392 
393 // Insert node NA after "this" in the circular chain.
394 void NodeBase::append(NodeAddr<NodeBase*> NA) {
395   NodeId Nx = Next;
396   // If NA is already "next", do nothing.
397   if (Next != NA.Id) {
398     Next = NA.Id;
399     NA.Addr->Next = Nx;
400   }
401 }
402 
403 // Fundamental node manipulator functions.
404 
405 // Obtain the register reference from a reference node.
406 RegisterRef RefNode::getRegRef(const DataFlowGraph &G) const {
407   assert(NodeAttrs::type(Attrs) == NodeAttrs::Ref);
408   if (NodeAttrs::flags(Attrs) & NodeAttrs::PhiRef)
409     return G.unpack(Ref.PR);
410   assert(Ref.Op != nullptr);
411   return G.makeRegRef(*Ref.Op);
412 }
413 
414 // Set the register reference in the reference node directly (for references
415 // in phi nodes).
416 void RefNode::setRegRef(RegisterRef RR, DataFlowGraph &G) {
417   assert(NodeAttrs::type(Attrs) == NodeAttrs::Ref);
418   assert(NodeAttrs::flags(Attrs) & NodeAttrs::PhiRef);
419   Ref.PR = G.pack(RR);
420 }
421 
422 // Set the register reference in the reference node based on a machine
423 // operand (for references in statement nodes).
424 void RefNode::setRegRef(MachineOperand *Op, DataFlowGraph &G) {
425   assert(NodeAttrs::type(Attrs) == NodeAttrs::Ref);
426   assert(!(NodeAttrs::flags(Attrs) & NodeAttrs::PhiRef));
427   (void)G;
428   Ref.Op = Op;
429 }
430 
431 // Get the owner of a given reference node.
432 NodeAddr<NodeBase*> RefNode::getOwner(const DataFlowGraph &G) {
433   NodeAddr<NodeBase*> NA = G.addr<NodeBase*>(getNext());
434 
435   while (NA.Addr != this) {
436     if (NA.Addr->getType() == NodeAttrs::Code)
437       return NA;
438     NA = G.addr<NodeBase*>(NA.Addr->getNext());
439   }
440   llvm_unreachable("No owner in circular list");
441 }
442 
443 // Connect the def node to the reaching def node.
444 void DefNode::linkToDef(NodeId Self, NodeAddr<DefNode*> DA) {
445   Ref.RD = DA.Id;
446   Ref.Sib = DA.Addr->getReachedDef();
447   DA.Addr->setReachedDef(Self);
448 }
449 
450 // Connect the use node to the reaching def node.
451 void UseNode::linkToDef(NodeId Self, NodeAddr<DefNode*> DA) {
452   Ref.RD = DA.Id;
453   Ref.Sib = DA.Addr->getReachedUse();
454   DA.Addr->setReachedUse(Self);
455 }
456 
457 // Get the first member of the code node.
458 NodeAddr<NodeBase*> CodeNode::getFirstMember(const DataFlowGraph &G) const {
459   if (Code.FirstM == 0)
460     return NodeAddr<NodeBase*>();
461   return G.addr<NodeBase*>(Code.FirstM);
462 }
463 
464 // Get the last member of the code node.
465 NodeAddr<NodeBase*> CodeNode::getLastMember(const DataFlowGraph &G) const {
466   if (Code.LastM == 0)
467     return NodeAddr<NodeBase*>();
468   return G.addr<NodeBase*>(Code.LastM);
469 }
470 
471 // Add node NA at the end of the member list of the given code node.
472 void CodeNode::addMember(NodeAddr<NodeBase*> NA, const DataFlowGraph &G) {
473   NodeAddr<NodeBase*> ML = getLastMember(G);
474   if (ML.Id != 0) {
475     ML.Addr->append(NA);
476   } else {
477     Code.FirstM = NA.Id;
478     NodeId Self = G.id(this);
479     NA.Addr->setNext(Self);
480   }
481   Code.LastM = NA.Id;
482 }
483 
484 // Add node NA after member node MA in the given code node.
485 void CodeNode::addMemberAfter(NodeAddr<NodeBase*> MA, NodeAddr<NodeBase*> NA,
486       const DataFlowGraph &G) {
487   MA.Addr->append(NA);
488   if (Code.LastM == MA.Id)
489     Code.LastM = NA.Id;
490 }
491 
492 // Remove member node NA from the given code node.
493 void CodeNode::removeMember(NodeAddr<NodeBase*> NA, const DataFlowGraph &G) {
494   NodeAddr<NodeBase*> MA = getFirstMember(G);
495   assert(MA.Id != 0);
496 
497   // Special handling if the member to remove is the first member.
498   if (MA.Id == NA.Id) {
499     if (Code.LastM == MA.Id) {
500       // If it is the only member, set both first and last to 0.
501       Code.FirstM = Code.LastM = 0;
502     } else {
503       // Otherwise, advance the first member.
504       Code.FirstM = MA.Addr->getNext();
505     }
506     return;
507   }
508 
509   while (MA.Addr != this) {
510     NodeId MX = MA.Addr->getNext();
511     if (MX == NA.Id) {
512       MA.Addr->setNext(NA.Addr->getNext());
513       // If the member to remove happens to be the last one, update the
514       // LastM indicator.
515       if (Code.LastM == NA.Id)
516         Code.LastM = MA.Id;
517       return;
518     }
519     MA = G.addr<NodeBase*>(MX);
520   }
521   llvm_unreachable("No such member");
522 }
523 
524 // Return the list of all members of the code node.
525 NodeList CodeNode::members(const DataFlowGraph &G) const {
526   static auto True = [] (NodeAddr<NodeBase*>) -> bool { return true; };
527   return members_if(True, G);
528 }
529 
530 // Return the owner of the given instr node.
531 NodeAddr<NodeBase*> InstrNode::getOwner(const DataFlowGraph &G) {
532   NodeAddr<NodeBase*> NA = G.addr<NodeBase*>(getNext());
533 
534   while (NA.Addr != this) {
535     assert(NA.Addr->getType() == NodeAttrs::Code);
536     if (NA.Addr->getKind() == NodeAttrs::Block)
537       return NA;
538     NA = G.addr<NodeBase*>(NA.Addr->getNext());
539   }
540   llvm_unreachable("No owner in circular list");
541 }
542 
543 // Add the phi node PA to the given block node.
544 void BlockNode::addPhi(NodeAddr<PhiNode*> PA, const DataFlowGraph &G) {
545   NodeAddr<NodeBase*> M = getFirstMember(G);
546   if (M.Id == 0) {
547     addMember(PA, G);
548     return;
549   }
550 
551   assert(M.Addr->getType() == NodeAttrs::Code);
552   if (M.Addr->getKind() == NodeAttrs::Stmt) {
553     // If the first member of the block is a statement, insert the phi as
554     // the first member.
555     Code.FirstM = PA.Id;
556     PA.Addr->setNext(M.Id);
557   } else {
558     // If the first member is a phi, find the last phi, and append PA to it.
559     assert(M.Addr->getKind() == NodeAttrs::Phi);
560     NodeAddr<NodeBase*> MN = M;
561     do {
562       M = MN;
563       MN = G.addr<NodeBase*>(M.Addr->getNext());
564       assert(MN.Addr->getType() == NodeAttrs::Code);
565     } while (MN.Addr->getKind() == NodeAttrs::Phi);
566 
567     // M is the last phi.
568     addMemberAfter(M, PA, G);
569   }
570 }
571 
572 // Find the block node corresponding to the machine basic block BB in the
573 // given func node.
574 NodeAddr<BlockNode*> FuncNode::findBlock(const MachineBasicBlock *BB,
575       const DataFlowGraph &G) const {
576   auto EqBB = [BB] (NodeAddr<NodeBase*> NA) -> bool {
577     return NodeAddr<BlockNode*>(NA).Addr->getCode() == BB;
578   };
579   NodeList Ms = members_if(EqBB, G);
580   if (!Ms.empty())
581     return Ms[0];
582   return NodeAddr<BlockNode*>();
583 }
584 
585 // Get the block node for the entry block in the given function.
586 NodeAddr<BlockNode*> FuncNode::getEntryBlock(const DataFlowGraph &G) {
587   MachineBasicBlock *EntryB = &getCode()->front();
588   return findBlock(EntryB, G);
589 }
590 
591 // Target operand information.
592 //
593 
594 // For a given instruction, check if there are any bits of RR that can remain
595 // unchanged across this def.
596 bool TargetOperandInfo::isPreserving(const MachineInstr &In, unsigned OpNum)
597       const {
598   return TII.isPredicated(In);
599 }
600 
601 // Check if the definition of RR produces an unspecified value.
602 bool TargetOperandInfo::isClobbering(const MachineInstr &In, unsigned OpNum)
603       const {
604   const MachineOperand &Op = In.getOperand(OpNum);
605   if (Op.isRegMask())
606     return true;
607   assert(Op.isReg());
608   if (In.isCall())
609     if (Op.isDef() && Op.isDead())
610       return true;
611   return false;
612 }
613 
614 // Check if the given instruction specifically requires
615 bool TargetOperandInfo::isFixedReg(const MachineInstr &In, unsigned OpNum)
616       const {
617   if (In.isCall() || In.isReturn() || In.isInlineAsm())
618     return true;
619   // Check for a tail call.
620   if (In.isBranch())
621     for (const MachineOperand &O : In.operands())
622       if (O.isGlobal() || O.isSymbol())
623         return true;
624 
625   const MCInstrDesc &D = In.getDesc();
626   if (!D.getImplicitDefs() && !D.getImplicitUses())
627     return false;
628   const MachineOperand &Op = In.getOperand(OpNum);
629   // If there is a sub-register, treat the operand as non-fixed. Currently,
630   // fixed registers are those that are listed in the descriptor as implicit
631   // uses or defs, and those lists do not allow sub-registers.
632   if (Op.getSubReg() != 0)
633     return false;
634   Register Reg = Op.getReg();
635   const MCPhysReg *ImpR = Op.isDef() ? D.getImplicitDefs()
636                                      : D.getImplicitUses();
637   if (!ImpR)
638     return false;
639   while (*ImpR)
640     if (*ImpR++ == Reg)
641       return true;
642   return false;
643 }
644 
645 //
646 // The data flow graph construction.
647 //
648 
649 DataFlowGraph::DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii,
650       const TargetRegisterInfo &tri, const MachineDominatorTree &mdt,
651       const MachineDominanceFrontier &mdf, const TargetOperandInfo &toi)
652     : MF(mf), TII(tii), TRI(tri), PRI(tri, mf), MDT(mdt), MDF(mdf), TOI(toi),
653       LiveIns(PRI) {
654 }
655 
656 // The implementation of the definition stack.
657 // Each register reference has its own definition stack. In particular,
658 // for a register references "Reg" and "Reg:subreg" will each have their
659 // own definition stacks.
660 
661 // Construct a stack iterator.
662 DataFlowGraph::DefStack::Iterator::Iterator(const DataFlowGraph::DefStack &S,
663       bool Top) : DS(S) {
664   if (!Top) {
665     // Initialize to bottom.
666     Pos = 0;
667     return;
668   }
669   // Initialize to the top, i.e. top-most non-delimiter (or 0, if empty).
670   Pos = DS.Stack.size();
671   while (Pos > 0 && DS.isDelimiter(DS.Stack[Pos-1]))
672     Pos--;
673 }
674 
675 // Return the size of the stack, including block delimiters.
676 unsigned DataFlowGraph::DefStack::size() const {
677   unsigned S = 0;
678   for (auto I = top(), E = bottom(); I != E; I.down())
679     S++;
680   return S;
681 }
682 
683 // Remove the top entry from the stack. Remove all intervening delimiters
684 // so that after this, the stack is either empty, or the top of the stack
685 // is a non-delimiter.
686 void DataFlowGraph::DefStack::pop() {
687   assert(!empty());
688   unsigned P = nextDown(Stack.size());
689   Stack.resize(P);
690 }
691 
692 // Push a delimiter for block node N on the stack.
693 void DataFlowGraph::DefStack::start_block(NodeId N) {
694   assert(N != 0);
695   Stack.push_back(NodeAddr<DefNode*>(nullptr, N));
696 }
697 
698 // Remove all nodes from the top of the stack, until the delimited for
699 // block node N is encountered. Remove the delimiter as well. In effect,
700 // this will remove from the stack all definitions from block N.
701 void DataFlowGraph::DefStack::clear_block(NodeId N) {
702   assert(N != 0);
703   unsigned P = Stack.size();
704   while (P > 0) {
705     bool Found = isDelimiter(Stack[P-1], N);
706     P--;
707     if (Found)
708       break;
709   }
710   // This will also remove the delimiter, if found.
711   Stack.resize(P);
712 }
713 
714 // Move the stack iterator up by one.
715 unsigned DataFlowGraph::DefStack::nextUp(unsigned P) const {
716   // Get the next valid position after P (skipping all delimiters).
717   // The input position P does not have to point to a non-delimiter.
718   unsigned SS = Stack.size();
719   bool IsDelim;
720   assert(P < SS);
721   do {
722     P++;
723     IsDelim = isDelimiter(Stack[P-1]);
724   } while (P < SS && IsDelim);
725   assert(!IsDelim);
726   return P;
727 }
728 
729 // Move the stack iterator down by one.
730 unsigned DataFlowGraph::DefStack::nextDown(unsigned P) const {
731   // Get the preceding valid position before P (skipping all delimiters).
732   // The input position P does not have to point to a non-delimiter.
733   assert(P > 0 && P <= Stack.size());
734   bool IsDelim = isDelimiter(Stack[P-1]);
735   do {
736     if (--P == 0)
737       break;
738     IsDelim = isDelimiter(Stack[P-1]);
739   } while (P > 0 && IsDelim);
740   assert(!IsDelim);
741   return P;
742 }
743 
744 // Register information.
745 
746 RegisterSet DataFlowGraph::getLandingPadLiveIns() const {
747   RegisterSet LR;
748   const Function &F = MF.getFunction();
749   const Constant *PF = F.hasPersonalityFn() ? F.getPersonalityFn()
750                                             : nullptr;
751   const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
752   if (RegisterId R = TLI.getExceptionPointerRegister(PF))
753     LR.insert(RegisterRef(R));
754   if (!isFuncletEHPersonality(classifyEHPersonality(PF))) {
755     if (RegisterId R = TLI.getExceptionSelectorRegister(PF))
756       LR.insert(RegisterRef(R));
757   }
758   return LR;
759 }
760 
761 // Node management functions.
762 
763 // Get the pointer to the node with the id N.
764 NodeBase *DataFlowGraph::ptr(NodeId N) const {
765   if (N == 0)
766     return nullptr;
767   return Memory.ptr(N);
768 }
769 
770 // Get the id of the node at the address P.
771 NodeId DataFlowGraph::id(const NodeBase *P) const {
772   if (P == nullptr)
773     return 0;
774   return Memory.id(P);
775 }
776 
777 // Allocate a new node and set the attributes to Attrs.
778 NodeAddr<NodeBase*> DataFlowGraph::newNode(uint16_t Attrs) {
779   NodeAddr<NodeBase*> P = Memory.New();
780   P.Addr->init();
781   P.Addr->setAttrs(Attrs);
782   return P;
783 }
784 
785 // Make a copy of the given node B, except for the data-flow links, which
786 // are set to 0.
787 NodeAddr<NodeBase*> DataFlowGraph::cloneNode(const NodeAddr<NodeBase*> B) {
788   NodeAddr<NodeBase*> NA = newNode(0);
789   memcpy(NA.Addr, B.Addr, sizeof(NodeBase));
790   // Ref nodes need to have the data-flow links reset.
791   if (NA.Addr->getType() == NodeAttrs::Ref) {
792     NodeAddr<RefNode*> RA = NA;
793     RA.Addr->setReachingDef(0);
794     RA.Addr->setSibling(0);
795     if (NA.Addr->getKind() == NodeAttrs::Def) {
796       NodeAddr<DefNode*> DA = NA;
797       DA.Addr->setReachedDef(0);
798       DA.Addr->setReachedUse(0);
799     }
800   }
801   return NA;
802 }
803 
804 // Allocation routines for specific node types/kinds.
805 
806 NodeAddr<UseNode*> DataFlowGraph::newUse(NodeAddr<InstrNode*> Owner,
807       MachineOperand &Op, uint16_t Flags) {
808   NodeAddr<UseNode*> UA = newNode(NodeAttrs::Ref | NodeAttrs::Use | Flags);
809   UA.Addr->setRegRef(&Op, *this);
810   return UA;
811 }
812 
813 NodeAddr<PhiUseNode*> DataFlowGraph::newPhiUse(NodeAddr<PhiNode*> Owner,
814       RegisterRef RR, NodeAddr<BlockNode*> PredB, uint16_t Flags) {
815   NodeAddr<PhiUseNode*> PUA = newNode(NodeAttrs::Ref | NodeAttrs::Use | Flags);
816   assert(Flags & NodeAttrs::PhiRef);
817   PUA.Addr->setRegRef(RR, *this);
818   PUA.Addr->setPredecessor(PredB.Id);
819   return PUA;
820 }
821 
822 NodeAddr<DefNode*> DataFlowGraph::newDef(NodeAddr<InstrNode*> Owner,
823       MachineOperand &Op, uint16_t Flags) {
824   NodeAddr<DefNode*> DA = newNode(NodeAttrs::Ref | NodeAttrs::Def | Flags);
825   DA.Addr->setRegRef(&Op, *this);
826   return DA;
827 }
828 
829 NodeAddr<DefNode*> DataFlowGraph::newDef(NodeAddr<InstrNode*> Owner,
830       RegisterRef RR, uint16_t Flags) {
831   NodeAddr<DefNode*> DA = newNode(NodeAttrs::Ref | NodeAttrs::Def | Flags);
832   assert(Flags & NodeAttrs::PhiRef);
833   DA.Addr->setRegRef(RR, *this);
834   return DA;
835 }
836 
837 NodeAddr<PhiNode*> DataFlowGraph::newPhi(NodeAddr<BlockNode*> Owner) {
838   NodeAddr<PhiNode*> PA = newNode(NodeAttrs::Code | NodeAttrs::Phi);
839   Owner.Addr->addPhi(PA, *this);
840   return PA;
841 }
842 
843 NodeAddr<StmtNode*> DataFlowGraph::newStmt(NodeAddr<BlockNode*> Owner,
844       MachineInstr *MI) {
845   NodeAddr<StmtNode*> SA = newNode(NodeAttrs::Code | NodeAttrs::Stmt);
846   SA.Addr->setCode(MI);
847   Owner.Addr->addMember(SA, *this);
848   return SA;
849 }
850 
851 NodeAddr<BlockNode*> DataFlowGraph::newBlock(NodeAddr<FuncNode*> Owner,
852       MachineBasicBlock *BB) {
853   NodeAddr<BlockNode*> BA = newNode(NodeAttrs::Code | NodeAttrs::Block);
854   BA.Addr->setCode(BB);
855   Owner.Addr->addMember(BA, *this);
856   return BA;
857 }
858 
859 NodeAddr<FuncNode*> DataFlowGraph::newFunc(MachineFunction *MF) {
860   NodeAddr<FuncNode*> FA = newNode(NodeAttrs::Code | NodeAttrs::Func);
861   FA.Addr->setCode(MF);
862   return FA;
863 }
864 
865 // Build the data flow graph.
866 void DataFlowGraph::build(unsigned Options) {
867   reset();
868   Func = newFunc(&MF);
869 
870   if (MF.empty())
871     return;
872 
873   for (MachineBasicBlock &B : MF) {
874     NodeAddr<BlockNode*> BA = newBlock(Func, &B);
875     BlockNodes.insert(std::make_pair(&B, BA));
876     for (MachineInstr &I : B) {
877       if (I.isDebugInstr())
878         continue;
879       buildStmt(BA, I);
880     }
881   }
882 
883   NodeAddr<BlockNode*> EA = Func.Addr->getEntryBlock(*this);
884   NodeList Blocks = Func.Addr->members(*this);
885 
886   // Collect information about block references.
887   RegisterSet AllRefs;
888   for (NodeAddr<BlockNode*> BA : Blocks)
889     for (NodeAddr<InstrNode*> IA : BA.Addr->members(*this))
890       for (NodeAddr<RefNode*> RA : IA.Addr->members(*this))
891         AllRefs.insert(RA.Addr->getRegRef(*this));
892 
893   // Collect function live-ins and entry block live-ins.
894   MachineRegisterInfo &MRI = MF.getRegInfo();
895   MachineBasicBlock &EntryB = *EA.Addr->getCode();
896   assert(EntryB.pred_empty() && "Function entry block has predecessors");
897   for (std::pair<unsigned,unsigned> P : MRI.liveins())
898     LiveIns.insert(RegisterRef(P.first));
899   if (MRI.tracksLiveness()) {
900     for (auto I : EntryB.liveins())
901       LiveIns.insert(RegisterRef(I.PhysReg, I.LaneMask));
902   }
903 
904   // Add function-entry phi nodes for the live-in registers.
905   //for (std::pair<RegisterId,LaneBitmask> P : LiveIns) {
906   for (auto I = LiveIns.rr_begin(), E = LiveIns.rr_end(); I != E; ++I) {
907     RegisterRef RR = *I;
908     NodeAddr<PhiNode*> PA = newPhi(EA);
909     uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving;
910     NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags);
911     PA.Addr->addMember(DA, *this);
912   }
913 
914   // Add phis for landing pads.
915   // Landing pads, unlike usual backs blocks, are not entered through
916   // branches in the program, or fall-throughs from other blocks. They
917   // are entered from the exception handling runtime and target's ABI
918   // may define certain registers as defined on entry to such a block.
919   RegisterSet EHRegs = getLandingPadLiveIns();
920   if (!EHRegs.empty()) {
921     for (NodeAddr<BlockNode*> BA : Blocks) {
922       const MachineBasicBlock &B = *BA.Addr->getCode();
923       if (!B.isEHPad())
924         continue;
925 
926       // Prepare a list of NodeIds of the block's predecessors.
927       NodeList Preds;
928       for (MachineBasicBlock *PB : B.predecessors())
929         Preds.push_back(findBlock(PB));
930 
931       // Build phi nodes for each live-in.
932       for (RegisterRef RR : EHRegs) {
933         NodeAddr<PhiNode*> PA = newPhi(BA);
934         uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving;
935         // Add def:
936         NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags);
937         PA.Addr->addMember(DA, *this);
938         // Add uses (no reaching defs for phi uses):
939         for (NodeAddr<BlockNode*> PBA : Preds) {
940           NodeAddr<PhiUseNode*> PUA = newPhiUse(PA, RR, PBA);
941           PA.Addr->addMember(PUA, *this);
942         }
943       }
944     }
945   }
946 
947   // Build a map "PhiM" which will contain, for each block, the set
948   // of references that will require phi definitions in that block.
949   BlockRefsMap PhiM;
950   for (NodeAddr<BlockNode*> BA : Blocks)
951     recordDefsForDF(PhiM, BA);
952   for (NodeAddr<BlockNode*> BA : Blocks)
953     buildPhis(PhiM, AllRefs, BA);
954 
955   // Link all the refs. This will recursively traverse the dominator tree.
956   DefStackMap DM;
957   linkBlockRefs(DM, EA);
958 
959   // Finally, remove all unused phi nodes.
960   if (!(Options & BuildOptions::KeepDeadPhis))
961     removeUnusedPhis();
962 }
963 
964 RegisterRef DataFlowGraph::makeRegRef(unsigned Reg, unsigned Sub) const {
965   assert(PhysicalRegisterInfo::isRegMaskId(Reg) ||
966          Register::isPhysicalRegister(Reg));
967   assert(Reg != 0);
968   if (Sub != 0)
969     Reg = TRI.getSubReg(Reg, Sub);
970   return RegisterRef(Reg);
971 }
972 
973 RegisterRef DataFlowGraph::makeRegRef(const MachineOperand &Op) const {
974   assert(Op.isReg() || Op.isRegMask());
975   if (Op.isReg())
976     return makeRegRef(Op.getReg(), Op.getSubReg());
977   return RegisterRef(PRI.getRegMaskId(Op.getRegMask()), LaneBitmask::getAll());
978 }
979 
980 // For each stack in the map DefM, push the delimiter for block B on it.
981 void DataFlowGraph::markBlock(NodeId B, DefStackMap &DefM) {
982   // Push block delimiters.
983   for (auto &P : DefM)
984     P.second.start_block(B);
985 }
986 
987 // Remove all definitions coming from block B from each stack in DefM.
988 void DataFlowGraph::releaseBlock(NodeId B, DefStackMap &DefM) {
989   // Pop all defs from this block from the definition stack. Defs that were
990   // added to the map during the traversal of instructions will not have a
991   // delimiter, but for those, the whole stack will be emptied.
992   for (auto &P : DefM)
993     P.second.clear_block(B);
994 
995   // Finally, remove empty stacks from the map.
996   for (auto I = DefM.begin(), E = DefM.end(), NextI = I; I != E; I = NextI) {
997     NextI = std::next(I);
998     // This preserves the validity of iterators other than I.
999     if (I->second.empty())
1000       DefM.erase(I);
1001   }
1002 }
1003 
1004 // Push all definitions from the instruction node IA to an appropriate
1005 // stack in DefM.
1006 void DataFlowGraph::pushAllDefs(NodeAddr<InstrNode*> IA, DefStackMap &DefM) {
1007   pushClobbers(IA, DefM);
1008   pushDefs(IA, DefM);
1009 }
1010 
1011 // Push all definitions from the instruction node IA to an appropriate
1012 // stack in DefM.
1013 void DataFlowGraph::pushClobbers(NodeAddr<InstrNode*> IA, DefStackMap &DefM) {
1014   NodeSet Visited;
1015   std::set<RegisterId> Defined;
1016 
1017   // The important objectives of this function are:
1018   // - to be able to handle instructions both while the graph is being
1019   //   constructed, and after the graph has been constructed, and
1020   // - maintain proper ordering of definitions on the stack for each
1021   //   register reference:
1022   //   - if there are two or more related defs in IA (i.e. coming from
1023   //     the same machine operand), then only push one def on the stack,
1024   //   - if there are multiple unrelated defs of non-overlapping
1025   //     subregisters of S, then the stack for S will have both (in an
1026   //     unspecified order), but the order does not matter from the data-
1027   //     -flow perspective.
1028 
1029   for (NodeAddr<DefNode*> DA : IA.Addr->members_if(IsDef, *this)) {
1030     if (Visited.count(DA.Id))
1031       continue;
1032     if (!(DA.Addr->getFlags() & NodeAttrs::Clobbering))
1033       continue;
1034 
1035     NodeList Rel = getRelatedRefs(IA, DA);
1036     NodeAddr<DefNode*> PDA = Rel.front();
1037     RegisterRef RR = PDA.Addr->getRegRef(*this);
1038 
1039     // Push the definition on the stack for the register and all aliases.
1040     // The def stack traversal in linkNodeUp will check the exact aliasing.
1041     DefM[RR.Reg].push(DA);
1042     Defined.insert(RR.Reg);
1043     for (RegisterId A : PRI.getAliasSet(RR.Reg)) {
1044       // Check that we don't push the same def twice.
1045       assert(A != RR.Reg);
1046       if (!Defined.count(A))
1047         DefM[A].push(DA);
1048     }
1049     // Mark all the related defs as visited.
1050     for (NodeAddr<NodeBase*> T : Rel)
1051       Visited.insert(T.Id);
1052   }
1053 }
1054 
1055 // Push all definitions from the instruction node IA to an appropriate
1056 // stack in DefM.
1057 void DataFlowGraph::pushDefs(NodeAddr<InstrNode*> IA, DefStackMap &DefM) {
1058   NodeSet Visited;
1059 #ifndef NDEBUG
1060   std::set<RegisterId> Defined;
1061 #endif
1062 
1063   // The important objectives of this function are:
1064   // - to be able to handle instructions both while the graph is being
1065   //   constructed, and after the graph has been constructed, and
1066   // - maintain proper ordering of definitions on the stack for each
1067   //   register reference:
1068   //   - if there are two or more related defs in IA (i.e. coming from
1069   //     the same machine operand), then only push one def on the stack,
1070   //   - if there are multiple unrelated defs of non-overlapping
1071   //     subregisters of S, then the stack for S will have both (in an
1072   //     unspecified order), but the order does not matter from the data-
1073   //     -flow perspective.
1074 
1075   for (NodeAddr<DefNode*> DA : IA.Addr->members_if(IsDef, *this)) {
1076     if (Visited.count(DA.Id))
1077       continue;
1078     if (DA.Addr->getFlags() & NodeAttrs::Clobbering)
1079       continue;
1080 
1081     NodeList Rel = getRelatedRefs(IA, DA);
1082     NodeAddr<DefNode*> PDA = Rel.front();
1083     RegisterRef RR = PDA.Addr->getRegRef(*this);
1084 #ifndef NDEBUG
1085     // Assert if the register is defined in two or more unrelated defs.
1086     // This could happen if there are two or more def operands defining it.
1087     if (!Defined.insert(RR.Reg).second) {
1088       MachineInstr *MI = NodeAddr<StmtNode*>(IA).Addr->getCode();
1089       dbgs() << "Multiple definitions of register: "
1090              << Print<RegisterRef>(RR, *this) << " in\n  " << *MI << "in "
1091              << printMBBReference(*MI->getParent()) << '\n';
1092       llvm_unreachable(nullptr);
1093     }
1094 #endif
1095     // Push the definition on the stack for the register and all aliases.
1096     // The def stack traversal in linkNodeUp will check the exact aliasing.
1097     DefM[RR.Reg].push(DA);
1098     for (RegisterId A : PRI.getAliasSet(RR.Reg)) {
1099       // Check that we don't push the same def twice.
1100       assert(A != RR.Reg);
1101       DefM[A].push(DA);
1102     }
1103     // Mark all the related defs as visited.
1104     for (NodeAddr<NodeBase*> T : Rel)
1105       Visited.insert(T.Id);
1106   }
1107 }
1108 
1109 // Return the list of all reference nodes related to RA, including RA itself.
1110 // See "getNextRelated" for the meaning of a "related reference".
1111 NodeList DataFlowGraph::getRelatedRefs(NodeAddr<InstrNode*> IA,
1112       NodeAddr<RefNode*> RA) const {
1113   assert(IA.Id != 0 && RA.Id != 0);
1114 
1115   NodeList Refs;
1116   NodeId Start = RA.Id;
1117   do {
1118     Refs.push_back(RA);
1119     RA = getNextRelated(IA, RA);
1120   } while (RA.Id != 0 && RA.Id != Start);
1121   return Refs;
1122 }
1123 
1124 // Clear all information in the graph.
1125 void DataFlowGraph::reset() {
1126   Memory.clear();
1127   BlockNodes.clear();
1128   Func = NodeAddr<FuncNode*>();
1129 }
1130 
1131 // Return the next reference node in the instruction node IA that is related
1132 // to RA. Conceptually, two reference nodes are related if they refer to the
1133 // same instance of a register access, but differ in flags or other minor
1134 // characteristics. Specific examples of related nodes are shadow reference
1135 // nodes.
1136 // Return the equivalent of nullptr if there are no more related references.
1137 NodeAddr<RefNode*> DataFlowGraph::getNextRelated(NodeAddr<InstrNode*> IA,
1138       NodeAddr<RefNode*> RA) const {
1139   assert(IA.Id != 0 && RA.Id != 0);
1140 
1141   auto Related = [this,RA](NodeAddr<RefNode*> TA) -> bool {
1142     if (TA.Addr->getKind() != RA.Addr->getKind())
1143       return false;
1144     if (TA.Addr->getRegRef(*this) != RA.Addr->getRegRef(*this))
1145       return false;
1146     return true;
1147   };
1148   auto RelatedStmt = [&Related,RA](NodeAddr<RefNode*> TA) -> bool {
1149     return Related(TA) &&
1150            &RA.Addr->getOp() == &TA.Addr->getOp();
1151   };
1152   auto RelatedPhi = [&Related,RA](NodeAddr<RefNode*> TA) -> bool {
1153     if (!Related(TA))
1154       return false;
1155     if (TA.Addr->getKind() != NodeAttrs::Use)
1156       return true;
1157     // For phi uses, compare predecessor blocks.
1158     const NodeAddr<const PhiUseNode*> TUA = TA;
1159     const NodeAddr<const PhiUseNode*> RUA = RA;
1160     return TUA.Addr->getPredecessor() == RUA.Addr->getPredecessor();
1161   };
1162 
1163   RegisterRef RR = RA.Addr->getRegRef(*this);
1164   if (IA.Addr->getKind() == NodeAttrs::Stmt)
1165     return RA.Addr->getNextRef(RR, RelatedStmt, true, *this);
1166   return RA.Addr->getNextRef(RR, RelatedPhi, true, *this);
1167 }
1168 
1169 // Find the next node related to RA in IA that satisfies condition P.
1170 // If such a node was found, return a pair where the second element is the
1171 // located node. If such a node does not exist, return a pair where the
1172 // first element is the element after which such a node should be inserted,
1173 // and the second element is a null-address.
1174 template <typename Predicate>
1175 std::pair<NodeAddr<RefNode*>,NodeAddr<RefNode*>>
1176 DataFlowGraph::locateNextRef(NodeAddr<InstrNode*> IA, NodeAddr<RefNode*> RA,
1177       Predicate P) const {
1178   assert(IA.Id != 0 && RA.Id != 0);
1179 
1180   NodeAddr<RefNode*> NA;
1181   NodeId Start = RA.Id;
1182   while (true) {
1183     NA = getNextRelated(IA, RA);
1184     if (NA.Id == 0 || NA.Id == Start)
1185       break;
1186     if (P(NA))
1187       break;
1188     RA = NA;
1189   }
1190 
1191   if (NA.Id != 0 && NA.Id != Start)
1192     return std::make_pair(RA, NA);
1193   return std::make_pair(RA, NodeAddr<RefNode*>());
1194 }
1195 
1196 // Get the next shadow node in IA corresponding to RA, and optionally create
1197 // such a node if it does not exist.
1198 NodeAddr<RefNode*> DataFlowGraph::getNextShadow(NodeAddr<InstrNode*> IA,
1199       NodeAddr<RefNode*> RA, bool Create) {
1200   assert(IA.Id != 0 && RA.Id != 0);
1201 
1202   uint16_t Flags = RA.Addr->getFlags() | NodeAttrs::Shadow;
1203   auto IsShadow = [Flags] (NodeAddr<RefNode*> TA) -> bool {
1204     return TA.Addr->getFlags() == Flags;
1205   };
1206   auto Loc = locateNextRef(IA, RA, IsShadow);
1207   if (Loc.second.Id != 0 || !Create)
1208     return Loc.second;
1209 
1210   // Create a copy of RA and mark is as shadow.
1211   NodeAddr<RefNode*> NA = cloneNode(RA);
1212   NA.Addr->setFlags(Flags | NodeAttrs::Shadow);
1213   IA.Addr->addMemberAfter(Loc.first, NA, *this);
1214   return NA;
1215 }
1216 
1217 // Get the next shadow node in IA corresponding to RA. Return null-address
1218 // if such a node does not exist.
1219 NodeAddr<RefNode*> DataFlowGraph::getNextShadow(NodeAddr<InstrNode*> IA,
1220       NodeAddr<RefNode*> RA) const {
1221   assert(IA.Id != 0 && RA.Id != 0);
1222   uint16_t Flags = RA.Addr->getFlags() | NodeAttrs::Shadow;
1223   auto IsShadow = [Flags] (NodeAddr<RefNode*> TA) -> bool {
1224     return TA.Addr->getFlags() == Flags;
1225   };
1226   return locateNextRef(IA, RA, IsShadow).second;
1227 }
1228 
1229 // Create a new statement node in the block node BA that corresponds to
1230 // the machine instruction MI.
1231 void DataFlowGraph::buildStmt(NodeAddr<BlockNode*> BA, MachineInstr &In) {
1232   NodeAddr<StmtNode*> SA = newStmt(BA, &In);
1233 
1234   auto isCall = [] (const MachineInstr &In) -> bool {
1235     if (In.isCall())
1236       return true;
1237     // Is tail call?
1238     if (In.isBranch()) {
1239       for (const MachineOperand &Op : In.operands())
1240         if (Op.isGlobal() || Op.isSymbol())
1241           return true;
1242       // Assume indirect branches are calls. This is for the purpose of
1243       // keeping implicit operands, and so it won't hurt on intra-function
1244       // indirect branches.
1245       if (In.isIndirectBranch())
1246         return true;
1247     }
1248     return false;
1249   };
1250 
1251   auto isDefUndef = [this] (const MachineInstr &In, RegisterRef DR) -> bool {
1252     // This instruction defines DR. Check if there is a use operand that
1253     // would make DR live on entry to the instruction.
1254     for (const MachineOperand &Op : In.operands()) {
1255       if (!Op.isReg() || Op.getReg() == 0 || !Op.isUse() || Op.isUndef())
1256         continue;
1257       RegisterRef UR = makeRegRef(Op);
1258       if (PRI.alias(DR, UR))
1259         return false;
1260     }
1261     return true;
1262   };
1263 
1264   bool IsCall = isCall(In);
1265   unsigned NumOps = In.getNumOperands();
1266 
1267   // Avoid duplicate implicit defs. This will not detect cases of implicit
1268   // defs that define registers that overlap, but it is not clear how to
1269   // interpret that in the absence of explicit defs. Overlapping explicit
1270   // defs are likely illegal already.
1271   BitVector DoneDefs(TRI.getNumRegs());
1272   // Process explicit defs first.
1273   for (unsigned OpN = 0; OpN < NumOps; ++OpN) {
1274     MachineOperand &Op = In.getOperand(OpN);
1275     if (!Op.isReg() || !Op.isDef() || Op.isImplicit())
1276       continue;
1277     Register R = Op.getReg();
1278     if (!R || !Register::isPhysicalRegister(R))
1279       continue;
1280     uint16_t Flags = NodeAttrs::None;
1281     if (TOI.isPreserving(In, OpN)) {
1282       Flags |= NodeAttrs::Preserving;
1283       // If the def is preserving, check if it is also undefined.
1284       if (isDefUndef(In, makeRegRef(Op)))
1285         Flags |= NodeAttrs::Undef;
1286     }
1287     if (TOI.isClobbering(In, OpN))
1288       Flags |= NodeAttrs::Clobbering;
1289     if (TOI.isFixedReg(In, OpN))
1290       Flags |= NodeAttrs::Fixed;
1291     if (IsCall && Op.isDead())
1292       Flags |= NodeAttrs::Dead;
1293     NodeAddr<DefNode*> DA = newDef(SA, Op, Flags);
1294     SA.Addr->addMember(DA, *this);
1295     assert(!DoneDefs.test(R));
1296     DoneDefs.set(R);
1297   }
1298 
1299   // Process reg-masks (as clobbers).
1300   BitVector DoneClobbers(TRI.getNumRegs());
1301   for (unsigned OpN = 0; OpN < NumOps; ++OpN) {
1302     MachineOperand &Op = In.getOperand(OpN);
1303     if (!Op.isRegMask())
1304       continue;
1305     uint16_t Flags = NodeAttrs::Clobbering | NodeAttrs::Fixed |
1306                      NodeAttrs::Dead;
1307     NodeAddr<DefNode*> DA = newDef(SA, Op, Flags);
1308     SA.Addr->addMember(DA, *this);
1309     // Record all clobbered registers in DoneDefs.
1310     const uint32_t *RM = Op.getRegMask();
1311     for (unsigned i = 1, e = TRI.getNumRegs(); i != e; ++i)
1312       if (!(RM[i/32] & (1u << (i%32))))
1313         DoneClobbers.set(i);
1314   }
1315 
1316   // Process implicit defs, skipping those that have already been added
1317   // as explicit.
1318   for (unsigned OpN = 0; OpN < NumOps; ++OpN) {
1319     MachineOperand &Op = In.getOperand(OpN);
1320     if (!Op.isReg() || !Op.isDef() || !Op.isImplicit())
1321       continue;
1322     Register R = Op.getReg();
1323     if (!R || !Register::isPhysicalRegister(R) || DoneDefs.test(R))
1324       continue;
1325     RegisterRef RR = makeRegRef(Op);
1326     uint16_t Flags = NodeAttrs::None;
1327     if (TOI.isPreserving(In, OpN)) {
1328       Flags |= NodeAttrs::Preserving;
1329       // If the def is preserving, check if it is also undefined.
1330       if (isDefUndef(In, RR))
1331         Flags |= NodeAttrs::Undef;
1332     }
1333     if (TOI.isClobbering(In, OpN))
1334       Flags |= NodeAttrs::Clobbering;
1335     if (TOI.isFixedReg(In, OpN))
1336       Flags |= NodeAttrs::Fixed;
1337     if (IsCall && Op.isDead()) {
1338       if (DoneClobbers.test(R))
1339         continue;
1340       Flags |= NodeAttrs::Dead;
1341     }
1342     NodeAddr<DefNode*> DA = newDef(SA, Op, Flags);
1343     SA.Addr->addMember(DA, *this);
1344     DoneDefs.set(R);
1345   }
1346 
1347   for (unsigned OpN = 0; OpN < NumOps; ++OpN) {
1348     MachineOperand &Op = In.getOperand(OpN);
1349     if (!Op.isReg() || !Op.isUse())
1350       continue;
1351     Register R = Op.getReg();
1352     if (!R || !Register::isPhysicalRegister(R))
1353       continue;
1354     uint16_t Flags = NodeAttrs::None;
1355     if (Op.isUndef())
1356       Flags |= NodeAttrs::Undef;
1357     if (TOI.isFixedReg(In, OpN))
1358       Flags |= NodeAttrs::Fixed;
1359     NodeAddr<UseNode*> UA = newUse(SA, Op, Flags);
1360     SA.Addr->addMember(UA, *this);
1361   }
1362 }
1363 
1364 // Scan all defs in the block node BA and record in PhiM the locations of
1365 // phi nodes corresponding to these defs.
1366 void DataFlowGraph::recordDefsForDF(BlockRefsMap &PhiM,
1367       NodeAddr<BlockNode*> BA) {
1368   // Check all defs from block BA and record them in each block in BA's
1369   // iterated dominance frontier. This information will later be used to
1370   // create phi nodes.
1371   MachineBasicBlock *BB = BA.Addr->getCode();
1372   assert(BB);
1373   auto DFLoc = MDF.find(BB);
1374   if (DFLoc == MDF.end() || DFLoc->second.empty())
1375     return;
1376 
1377   // Traverse all instructions in the block and collect the set of all
1378   // defined references. For each reference there will be a phi created
1379   // in the block's iterated dominance frontier.
1380   // This is done to make sure that each defined reference gets only one
1381   // phi node, even if it is defined multiple times.
1382   RegisterSet Defs;
1383   for (NodeAddr<InstrNode*> IA : BA.Addr->members(*this))
1384     for (NodeAddr<RefNode*> RA : IA.Addr->members_if(IsDef, *this))
1385       Defs.insert(RA.Addr->getRegRef(*this));
1386 
1387   // Calculate the iterated dominance frontier of BB.
1388   const MachineDominanceFrontier::DomSetType &DF = DFLoc->second;
1389   SetVector<MachineBasicBlock*> IDF(DF.begin(), DF.end());
1390   for (unsigned i = 0; i < IDF.size(); ++i) {
1391     auto F = MDF.find(IDF[i]);
1392     if (F != MDF.end())
1393       IDF.insert(F->second.begin(), F->second.end());
1394   }
1395 
1396   // Finally, add the set of defs to each block in the iterated dominance
1397   // frontier.
1398   for (auto *DB : IDF) {
1399     NodeAddr<BlockNode*> DBA = findBlock(DB);
1400     PhiM[DBA.Id].insert(Defs.begin(), Defs.end());
1401   }
1402 }
1403 
1404 // Given the locations of phi nodes in the map PhiM, create the phi nodes
1405 // that are located in the block node BA.
1406 void DataFlowGraph::buildPhis(BlockRefsMap &PhiM, RegisterSet &AllRefs,
1407       NodeAddr<BlockNode*> BA) {
1408   // Check if this blocks has any DF defs, i.e. if there are any defs
1409   // that this block is in the iterated dominance frontier of.
1410   auto HasDF = PhiM.find(BA.Id);
1411   if (HasDF == PhiM.end() || HasDF->second.empty())
1412     return;
1413 
1414   // First, remove all R in Refs in such that there exists T in Refs
1415   // such that T covers R. In other words, only leave those refs that
1416   // are not covered by another ref (i.e. maximal with respect to covering).
1417 
1418   auto MaxCoverIn = [this] (RegisterRef RR, RegisterSet &RRs) -> RegisterRef {
1419     for (RegisterRef I : RRs)
1420       if (I != RR && RegisterAggr::isCoverOf(I, RR, PRI))
1421         RR = I;
1422     return RR;
1423   };
1424 
1425   RegisterSet MaxDF;
1426   for (RegisterRef I : HasDF->second)
1427     MaxDF.insert(MaxCoverIn(I, HasDF->second));
1428 
1429   std::vector<RegisterRef> MaxRefs;
1430   for (RegisterRef I : MaxDF)
1431     MaxRefs.push_back(MaxCoverIn(I, AllRefs));
1432 
1433   // Now, for each R in MaxRefs, get the alias closure of R. If the closure
1434   // only has R in it, create a phi a def for R. Otherwise, create a phi,
1435   // and add a def for each S in the closure.
1436 
1437   // Sort the refs so that the phis will be created in a deterministic order.
1438   llvm::sort(MaxRefs);
1439   // Remove duplicates.
1440   auto NewEnd = std::unique(MaxRefs.begin(), MaxRefs.end());
1441   MaxRefs.erase(NewEnd, MaxRefs.end());
1442 
1443   auto Aliased = [this,&MaxRefs](RegisterRef RR,
1444                                  std::vector<unsigned> &Closure) -> bool {
1445     for (unsigned I : Closure)
1446       if (PRI.alias(RR, MaxRefs[I]))
1447         return true;
1448     return false;
1449   };
1450 
1451   // Prepare a list of NodeIds of the block's predecessors.
1452   NodeList Preds;
1453   const MachineBasicBlock *MBB = BA.Addr->getCode();
1454   for (MachineBasicBlock *PB : MBB->predecessors())
1455     Preds.push_back(findBlock(PB));
1456 
1457   while (!MaxRefs.empty()) {
1458     // Put the first element in the closure, and then add all subsequent
1459     // elements from MaxRefs to it, if they alias at least one element
1460     // already in the closure.
1461     // ClosureIdx: vector of indices in MaxRefs of members of the closure.
1462     std::vector<unsigned> ClosureIdx = { 0 };
1463     for (unsigned i = 1; i != MaxRefs.size(); ++i)
1464       if (Aliased(MaxRefs[i], ClosureIdx))
1465         ClosureIdx.push_back(i);
1466 
1467     // Build a phi for the closure.
1468     unsigned CS = ClosureIdx.size();
1469     NodeAddr<PhiNode*> PA = newPhi(BA);
1470 
1471     // Add defs.
1472     for (unsigned X = 0; X != CS; ++X) {
1473       RegisterRef RR = MaxRefs[ClosureIdx[X]];
1474       uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving;
1475       NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags);
1476       PA.Addr->addMember(DA, *this);
1477     }
1478     // Add phi uses.
1479     for (NodeAddr<BlockNode*> PBA : Preds) {
1480       for (unsigned X = 0; X != CS; ++X) {
1481         RegisterRef RR = MaxRefs[ClosureIdx[X]];
1482         NodeAddr<PhiUseNode*> PUA = newPhiUse(PA, RR, PBA);
1483         PA.Addr->addMember(PUA, *this);
1484       }
1485     }
1486 
1487     // Erase from MaxRefs all elements in the closure.
1488     auto Begin = MaxRefs.begin();
1489     for (unsigned Idx : llvm::reverse(ClosureIdx))
1490       MaxRefs.erase(Begin + Idx);
1491   }
1492 }
1493 
1494 // Remove any unneeded phi nodes that were created during the build process.
1495 void DataFlowGraph::removeUnusedPhis() {
1496   // This will remove unused phis, i.e. phis where each def does not reach
1497   // any uses or other defs. This will not detect or remove circular phi
1498   // chains that are otherwise dead. Unused/dead phis are created during
1499   // the build process and this function is intended to remove these cases
1500   // that are easily determinable to be unnecessary.
1501 
1502   SetVector<NodeId> PhiQ;
1503   for (NodeAddr<BlockNode*> BA : Func.Addr->members(*this)) {
1504     for (auto P : BA.Addr->members_if(IsPhi, *this))
1505       PhiQ.insert(P.Id);
1506   }
1507 
1508   static auto HasUsedDef = [](NodeList &Ms) -> bool {
1509     for (NodeAddr<NodeBase*> M : Ms) {
1510       if (M.Addr->getKind() != NodeAttrs::Def)
1511         continue;
1512       NodeAddr<DefNode*> DA = M;
1513       if (DA.Addr->getReachedDef() != 0 || DA.Addr->getReachedUse() != 0)
1514         return true;
1515     }
1516     return false;
1517   };
1518 
1519   // Any phi, if it is removed, may affect other phis (make them dead).
1520   // For each removed phi, collect the potentially affected phis and add
1521   // them back to the queue.
1522   while (!PhiQ.empty()) {
1523     auto PA = addr<PhiNode*>(PhiQ[0]);
1524     PhiQ.remove(PA.Id);
1525     NodeList Refs = PA.Addr->members(*this);
1526     if (HasUsedDef(Refs))
1527       continue;
1528     for (NodeAddr<RefNode*> RA : Refs) {
1529       if (NodeId RD = RA.Addr->getReachingDef()) {
1530         auto RDA = addr<DefNode*>(RD);
1531         NodeAddr<InstrNode*> OA = RDA.Addr->getOwner(*this);
1532         if (IsPhi(OA))
1533           PhiQ.insert(OA.Id);
1534       }
1535       if (RA.Addr->isDef())
1536         unlinkDef(RA, true);
1537       else
1538         unlinkUse(RA, true);
1539     }
1540     NodeAddr<BlockNode*> BA = PA.Addr->getOwner(*this);
1541     BA.Addr->removeMember(PA, *this);
1542   }
1543 }
1544 
1545 // For a given reference node TA in an instruction node IA, connect the
1546 // reaching def of TA to the appropriate def node. Create any shadow nodes
1547 // as appropriate.
1548 template <typename T>
1549 void DataFlowGraph::linkRefUp(NodeAddr<InstrNode*> IA, NodeAddr<T> TA,
1550       DefStack &DS) {
1551   if (DS.empty())
1552     return;
1553   RegisterRef RR = TA.Addr->getRegRef(*this);
1554   NodeAddr<T> TAP;
1555 
1556   // References from the def stack that have been examined so far.
1557   RegisterAggr Defs(PRI);
1558 
1559   for (auto I = DS.top(), E = DS.bottom(); I != E; I.down()) {
1560     RegisterRef QR = I->Addr->getRegRef(*this);
1561 
1562     // Skip all defs that are aliased to any of the defs that we have already
1563     // seen. If this completes a cover of RR, stop the stack traversal.
1564     bool Alias = Defs.hasAliasOf(QR);
1565     bool Cover = Defs.insert(QR).hasCoverOf(RR);
1566     if (Alias) {
1567       if (Cover)
1568         break;
1569       continue;
1570     }
1571 
1572     // The reaching def.
1573     NodeAddr<DefNode*> RDA = *I;
1574 
1575     // Pick the reached node.
1576     if (TAP.Id == 0) {
1577       TAP = TA;
1578     } else {
1579       // Mark the existing ref as "shadow" and create a new shadow.
1580       TAP.Addr->setFlags(TAP.Addr->getFlags() | NodeAttrs::Shadow);
1581       TAP = getNextShadow(IA, TAP, true);
1582     }
1583 
1584     // Create the link.
1585     TAP.Addr->linkToDef(TAP.Id, RDA);
1586 
1587     if (Cover)
1588       break;
1589   }
1590 }
1591 
1592 // Create data-flow links for all reference nodes in the statement node SA.
1593 template <typename Predicate>
1594 void DataFlowGraph::linkStmtRefs(DefStackMap &DefM, NodeAddr<StmtNode*> SA,
1595       Predicate P) {
1596 #ifndef NDEBUG
1597   RegisterSet Defs;
1598 #endif
1599 
1600   // Link all nodes (upwards in the data-flow) with their reaching defs.
1601   for (NodeAddr<RefNode*> RA : SA.Addr->members_if(P, *this)) {
1602     uint16_t Kind = RA.Addr->getKind();
1603     assert(Kind == NodeAttrs::Def || Kind == NodeAttrs::Use);
1604     RegisterRef RR = RA.Addr->getRegRef(*this);
1605 #ifndef NDEBUG
1606     // Do not expect multiple defs of the same reference.
1607     assert(Kind != NodeAttrs::Def || !Defs.count(RR));
1608     Defs.insert(RR);
1609 #endif
1610 
1611     auto F = DefM.find(RR.Reg);
1612     if (F == DefM.end())
1613       continue;
1614     DefStack &DS = F->second;
1615     if (Kind == NodeAttrs::Use)
1616       linkRefUp<UseNode*>(SA, RA, DS);
1617     else if (Kind == NodeAttrs::Def)
1618       linkRefUp<DefNode*>(SA, RA, DS);
1619     else
1620       llvm_unreachable("Unexpected node in instruction");
1621   }
1622 }
1623 
1624 // Create data-flow links for all instructions in the block node BA. This
1625 // will include updating any phi nodes in BA.
1626 void DataFlowGraph::linkBlockRefs(DefStackMap &DefM, NodeAddr<BlockNode*> BA) {
1627   // Push block delimiters.
1628   markBlock(BA.Id, DefM);
1629 
1630   auto IsClobber = [] (NodeAddr<RefNode*> RA) -> bool {
1631     return IsDef(RA) && (RA.Addr->getFlags() & NodeAttrs::Clobbering);
1632   };
1633   auto IsNoClobber = [] (NodeAddr<RefNode*> RA) -> bool {
1634     return IsDef(RA) && !(RA.Addr->getFlags() & NodeAttrs::Clobbering);
1635   };
1636 
1637   assert(BA.Addr && "block node address is needed to create a data-flow link");
1638   // For each non-phi instruction in the block, link all the defs and uses
1639   // to their reaching defs. For any member of the block (including phis),
1640   // push the defs on the corresponding stacks.
1641   for (NodeAddr<InstrNode*> IA : BA.Addr->members(*this)) {
1642     // Ignore phi nodes here. They will be linked part by part from the
1643     // predecessors.
1644     if (IA.Addr->getKind() == NodeAttrs::Stmt) {
1645       linkStmtRefs(DefM, IA, IsUse);
1646       linkStmtRefs(DefM, IA, IsClobber);
1647     }
1648 
1649     // Push the definitions on the stack.
1650     pushClobbers(IA, DefM);
1651 
1652     if (IA.Addr->getKind() == NodeAttrs::Stmt)
1653       linkStmtRefs(DefM, IA, IsNoClobber);
1654 
1655     pushDefs(IA, DefM);
1656   }
1657 
1658   // Recursively process all children in the dominator tree.
1659   MachineDomTreeNode *N = MDT.getNode(BA.Addr->getCode());
1660   for (auto *I : *N) {
1661     MachineBasicBlock *SB = I->getBlock();
1662     NodeAddr<BlockNode*> SBA = findBlock(SB);
1663     linkBlockRefs(DefM, SBA);
1664   }
1665 
1666   // Link the phi uses from the successor blocks.
1667   auto IsUseForBA = [BA](NodeAddr<NodeBase*> NA) -> bool {
1668     if (NA.Addr->getKind() != NodeAttrs::Use)
1669       return false;
1670     assert(NA.Addr->getFlags() & NodeAttrs::PhiRef);
1671     NodeAddr<PhiUseNode*> PUA = NA;
1672     return PUA.Addr->getPredecessor() == BA.Id;
1673   };
1674 
1675   RegisterSet EHLiveIns = getLandingPadLiveIns();
1676   MachineBasicBlock *MBB = BA.Addr->getCode();
1677 
1678   for (MachineBasicBlock *SB : MBB->successors()) {
1679     bool IsEHPad = SB->isEHPad();
1680     NodeAddr<BlockNode*> SBA = findBlock(SB);
1681     for (NodeAddr<InstrNode*> IA : SBA.Addr->members_if(IsPhi, *this)) {
1682       // Do not link phi uses for landing pad live-ins.
1683       if (IsEHPad) {
1684         // Find what register this phi is for.
1685         NodeAddr<RefNode*> RA = IA.Addr->getFirstMember(*this);
1686         assert(RA.Id != 0);
1687         if (EHLiveIns.count(RA.Addr->getRegRef(*this)))
1688           continue;
1689       }
1690       // Go over each phi use associated with MBB, and link it.
1691       for (auto U : IA.Addr->members_if(IsUseForBA, *this)) {
1692         NodeAddr<PhiUseNode*> PUA = U;
1693         RegisterRef RR = PUA.Addr->getRegRef(*this);
1694         linkRefUp<UseNode*>(IA, PUA, DefM[RR.Reg]);
1695       }
1696     }
1697   }
1698 
1699   // Pop all defs from this block from the definition stacks.
1700   releaseBlock(BA.Id, DefM);
1701 }
1702 
1703 // Remove the use node UA from any data-flow and structural links.
1704 void DataFlowGraph::unlinkUseDF(NodeAddr<UseNode*> UA) {
1705   NodeId RD = UA.Addr->getReachingDef();
1706   NodeId Sib = UA.Addr->getSibling();
1707 
1708   if (RD == 0) {
1709     assert(Sib == 0);
1710     return;
1711   }
1712 
1713   auto RDA = addr<DefNode*>(RD);
1714   auto TA = addr<UseNode*>(RDA.Addr->getReachedUse());
1715   if (TA.Id == UA.Id) {
1716     RDA.Addr->setReachedUse(Sib);
1717     return;
1718   }
1719 
1720   while (TA.Id != 0) {
1721     NodeId S = TA.Addr->getSibling();
1722     if (S == UA.Id) {
1723       TA.Addr->setSibling(UA.Addr->getSibling());
1724       return;
1725     }
1726     TA = addr<UseNode*>(S);
1727   }
1728 }
1729 
1730 // Remove the def node DA from any data-flow and structural links.
1731 void DataFlowGraph::unlinkDefDF(NodeAddr<DefNode*> DA) {
1732   //
1733   //         RD
1734   //         | reached
1735   //         | def
1736   //         :
1737   //         .
1738   //        +----+
1739   // ... -- | DA | -- ... -- 0  : sibling chain of DA
1740   //        +----+
1741   //         |  | reached
1742   //         |  : def
1743   //         |  .
1744   //         | ...  : Siblings (defs)
1745   //         |
1746   //         : reached
1747   //         . use
1748   //        ... : sibling chain of reached uses
1749 
1750   NodeId RD = DA.Addr->getReachingDef();
1751 
1752   // Visit all siblings of the reached def and reset their reaching defs.
1753   // Also, defs reached by DA are now "promoted" to being reached by RD,
1754   // so all of them will need to be spliced into the sibling chain where
1755   // DA belongs.
1756   auto getAllNodes = [this] (NodeId N) -> NodeList {
1757     NodeList Res;
1758     while (N) {
1759       auto RA = addr<RefNode*>(N);
1760       // Keep the nodes in the exact sibling order.
1761       Res.push_back(RA);
1762       N = RA.Addr->getSibling();
1763     }
1764     return Res;
1765   };
1766   NodeList ReachedDefs = getAllNodes(DA.Addr->getReachedDef());
1767   NodeList ReachedUses = getAllNodes(DA.Addr->getReachedUse());
1768 
1769   if (RD == 0) {
1770     for (NodeAddr<RefNode*> I : ReachedDefs)
1771       I.Addr->setSibling(0);
1772     for (NodeAddr<RefNode*> I : ReachedUses)
1773       I.Addr->setSibling(0);
1774   }
1775   for (NodeAddr<DefNode*> I : ReachedDefs)
1776     I.Addr->setReachingDef(RD);
1777   for (NodeAddr<UseNode*> I : ReachedUses)
1778     I.Addr->setReachingDef(RD);
1779 
1780   NodeId Sib = DA.Addr->getSibling();
1781   if (RD == 0) {
1782     assert(Sib == 0);
1783     return;
1784   }
1785 
1786   // Update the reaching def node and remove DA from the sibling list.
1787   auto RDA = addr<DefNode*>(RD);
1788   auto TA = addr<DefNode*>(RDA.Addr->getReachedDef());
1789   if (TA.Id == DA.Id) {
1790     // If DA is the first reached def, just update the RD's reached def
1791     // to the DA's sibling.
1792     RDA.Addr->setReachedDef(Sib);
1793   } else {
1794     // Otherwise, traverse the sibling list of the reached defs and remove
1795     // DA from it.
1796     while (TA.Id != 0) {
1797       NodeId S = TA.Addr->getSibling();
1798       if (S == DA.Id) {
1799         TA.Addr->setSibling(Sib);
1800         break;
1801       }
1802       TA = addr<DefNode*>(S);
1803     }
1804   }
1805 
1806   // Splice the DA's reached defs into the RDA's reached def chain.
1807   if (!ReachedDefs.empty()) {
1808     auto Last = NodeAddr<DefNode*>(ReachedDefs.back());
1809     Last.Addr->setSibling(RDA.Addr->getReachedDef());
1810     RDA.Addr->setReachedDef(ReachedDefs.front().Id);
1811   }
1812   // Splice the DA's reached uses into the RDA's reached use chain.
1813   if (!ReachedUses.empty()) {
1814     auto Last = NodeAddr<UseNode*>(ReachedUses.back());
1815     Last.Addr->setSibling(RDA.Addr->getReachedUse());
1816     RDA.Addr->setReachedUse(ReachedUses.front().Id);
1817   }
1818 }
1819