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(RA.Id, G) << '<' 109 << Print(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(N, P.G); 119 OS << ','; 120 if (NodeId N = P.Obj.Addr->getReachedDef()) 121 OS << Print(N, P.G); 122 OS << ','; 123 if (NodeId N = P.Obj.Addr->getReachedUse()) 124 OS << Print(N, P.G); 125 OS << "):"; 126 if (NodeId N = P.Obj.Addr->getSibling()) 127 OS << Print(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(N, P.G); 136 OS << "):"; 137 if (NodeId N = P.Obj.Addr->getSibling()) 138 OS << Print(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(N, P.G); 148 OS << ','; 149 if (NodeId N = P.Obj.Addr->getPredecessor()) 150 OS << Print(N, P.G); 151 OS << "):"; 152 if (NodeId N = P.Obj.Addr->getSibling()) 153 OS << Print(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(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(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(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(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(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(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(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(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(I->Id, P.G) 322 << '<' << Print(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.implicit_defs().empty() && D.implicit_uses().empty()) 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 ArrayRef<MCPhysReg> ImpOps = 636 Op.isDef() ? D.implicit_defs() : D.implicit_uses(); 637 return is_contained(ImpOps, Reg); 638 } 639 640 // 641 // The data flow graph construction. 642 // 643 644 DataFlowGraph::DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii, 645 const TargetRegisterInfo &tri, const MachineDominatorTree &mdt, 646 const MachineDominanceFrontier &mdf) 647 : DefaultTOI(std::make_unique<TargetOperandInfo>(tii)), MF(mf), TII(tii), 648 TRI(tri), PRI(tri, mf), MDT(mdt), MDF(mdf), TOI(*DefaultTOI), 649 LiveIns(PRI) { 650 } 651 652 DataFlowGraph::DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii, 653 const TargetRegisterInfo &tri, const MachineDominatorTree &mdt, 654 const MachineDominanceFrontier &mdf, const TargetOperandInfo &toi) 655 : MF(mf), TII(tii), TRI(tri), PRI(tri, mf), MDT(mdt), MDF(mdf), TOI(toi), 656 LiveIns(PRI) { 657 } 658 659 // The implementation of the definition stack. 660 // Each register reference has its own definition stack. In particular, 661 // for a register references "Reg" and "Reg:subreg" will each have their 662 // own definition stacks. 663 664 // Construct a stack iterator. 665 DataFlowGraph::DefStack::Iterator::Iterator(const DataFlowGraph::DefStack &S, 666 bool Top) : DS(S) { 667 if (!Top) { 668 // Initialize to bottom. 669 Pos = 0; 670 return; 671 } 672 // Initialize to the top, i.e. top-most non-delimiter (or 0, if empty). 673 Pos = DS.Stack.size(); 674 while (Pos > 0 && DS.isDelimiter(DS.Stack[Pos-1])) 675 Pos--; 676 } 677 678 // Return the size of the stack, including block delimiters. 679 unsigned DataFlowGraph::DefStack::size() const { 680 unsigned S = 0; 681 for (auto I = top(), E = bottom(); I != E; I.down()) 682 S++; 683 return S; 684 } 685 686 // Remove the top entry from the stack. Remove all intervening delimiters 687 // so that after this, the stack is either empty, or the top of the stack 688 // is a non-delimiter. 689 void DataFlowGraph::DefStack::pop() { 690 assert(!empty()); 691 unsigned P = nextDown(Stack.size()); 692 Stack.resize(P); 693 } 694 695 // Push a delimiter for block node N on the stack. 696 void DataFlowGraph::DefStack::start_block(NodeId N) { 697 assert(N != 0); 698 Stack.push_back(NodeAddr<DefNode*>(nullptr, N)); 699 } 700 701 // Remove all nodes from the top of the stack, until the delimited for 702 // block node N is encountered. Remove the delimiter as well. In effect, 703 // this will remove from the stack all definitions from block N. 704 void DataFlowGraph::DefStack::clear_block(NodeId N) { 705 assert(N != 0); 706 unsigned P = Stack.size(); 707 while (P > 0) { 708 bool Found = isDelimiter(Stack[P-1], N); 709 P--; 710 if (Found) 711 break; 712 } 713 // This will also remove the delimiter, if found. 714 Stack.resize(P); 715 } 716 717 // Move the stack iterator up by one. 718 unsigned DataFlowGraph::DefStack::nextUp(unsigned P) const { 719 // Get the next valid position after P (skipping all delimiters). 720 // The input position P does not have to point to a non-delimiter. 721 unsigned SS = Stack.size(); 722 bool IsDelim; 723 assert(P < SS); 724 do { 725 P++; 726 IsDelim = isDelimiter(Stack[P-1]); 727 } while (P < SS && IsDelim); 728 assert(!IsDelim); 729 return P; 730 } 731 732 // Move the stack iterator down by one. 733 unsigned DataFlowGraph::DefStack::nextDown(unsigned P) const { 734 // Get the preceding valid position before P (skipping all delimiters). 735 // The input position P does not have to point to a non-delimiter. 736 assert(P > 0 && P <= Stack.size()); 737 bool IsDelim = isDelimiter(Stack[P-1]); 738 do { 739 if (--P == 0) 740 break; 741 IsDelim = isDelimiter(Stack[P-1]); 742 } while (P > 0 && IsDelim); 743 assert(!IsDelim); 744 return P; 745 } 746 747 // Register information. 748 749 RegisterSet DataFlowGraph::getLandingPadLiveIns() const { 750 RegisterSet LR; 751 const Function &F = MF.getFunction(); 752 const Constant *PF = F.hasPersonalityFn() ? F.getPersonalityFn() 753 : nullptr; 754 const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering(); 755 if (RegisterId R = TLI.getExceptionPointerRegister(PF)) 756 LR.insert(RegisterRef(R)); 757 if (!isFuncletEHPersonality(classifyEHPersonality(PF))) { 758 if (RegisterId R = TLI.getExceptionSelectorRegister(PF)) 759 LR.insert(RegisterRef(R)); 760 } 761 return LR; 762 } 763 764 // Node management functions. 765 766 // Get the pointer to the node with the id N. 767 NodeBase *DataFlowGraph::ptr(NodeId N) const { 768 if (N == 0) 769 return nullptr; 770 return Memory.ptr(N); 771 } 772 773 // Get the id of the node at the address P. 774 NodeId DataFlowGraph::id(const NodeBase *P) const { 775 if (P == nullptr) 776 return 0; 777 return Memory.id(P); 778 } 779 780 // Allocate a new node and set the attributes to Attrs. 781 NodeAddr<NodeBase*> DataFlowGraph::newNode(uint16_t Attrs) { 782 NodeAddr<NodeBase*> P = Memory.New(); 783 P.Addr->init(); 784 P.Addr->setAttrs(Attrs); 785 return P; 786 } 787 788 // Make a copy of the given node B, except for the data-flow links, which 789 // are set to 0. 790 NodeAddr<NodeBase*> DataFlowGraph::cloneNode(const NodeAddr<NodeBase*> B) { 791 NodeAddr<NodeBase*> NA = newNode(0); 792 memcpy(NA.Addr, B.Addr, sizeof(NodeBase)); 793 // Ref nodes need to have the data-flow links reset. 794 if (NA.Addr->getType() == NodeAttrs::Ref) { 795 NodeAddr<RefNode*> RA = NA; 796 RA.Addr->setReachingDef(0); 797 RA.Addr->setSibling(0); 798 if (NA.Addr->getKind() == NodeAttrs::Def) { 799 NodeAddr<DefNode*> DA = NA; 800 DA.Addr->setReachedDef(0); 801 DA.Addr->setReachedUse(0); 802 } 803 } 804 return NA; 805 } 806 807 // Allocation routines for specific node types/kinds. 808 809 NodeAddr<UseNode*> DataFlowGraph::newUse(NodeAddr<InstrNode*> Owner, 810 MachineOperand &Op, uint16_t Flags) { 811 NodeAddr<UseNode*> UA = newNode(NodeAttrs::Ref | NodeAttrs::Use | Flags); 812 UA.Addr->setRegRef(&Op, *this); 813 return UA; 814 } 815 816 NodeAddr<PhiUseNode*> DataFlowGraph::newPhiUse(NodeAddr<PhiNode*> Owner, 817 RegisterRef RR, NodeAddr<BlockNode*> PredB, uint16_t Flags) { 818 NodeAddr<PhiUseNode*> PUA = newNode(NodeAttrs::Ref | NodeAttrs::Use | Flags); 819 assert(Flags & NodeAttrs::PhiRef); 820 PUA.Addr->setRegRef(RR, *this); 821 PUA.Addr->setPredecessor(PredB.Id); 822 return PUA; 823 } 824 825 NodeAddr<DefNode*> DataFlowGraph::newDef(NodeAddr<InstrNode*> Owner, 826 MachineOperand &Op, uint16_t Flags) { 827 NodeAddr<DefNode*> DA = newNode(NodeAttrs::Ref | NodeAttrs::Def | Flags); 828 DA.Addr->setRegRef(&Op, *this); 829 return DA; 830 } 831 832 NodeAddr<DefNode*> DataFlowGraph::newDef(NodeAddr<InstrNode*> Owner, 833 RegisterRef RR, uint16_t Flags) { 834 NodeAddr<DefNode*> DA = newNode(NodeAttrs::Ref | NodeAttrs::Def | Flags); 835 assert(Flags & NodeAttrs::PhiRef); 836 DA.Addr->setRegRef(RR, *this); 837 return DA; 838 } 839 840 NodeAddr<PhiNode*> DataFlowGraph::newPhi(NodeAddr<BlockNode*> Owner) { 841 NodeAddr<PhiNode*> PA = newNode(NodeAttrs::Code | NodeAttrs::Phi); 842 Owner.Addr->addPhi(PA, *this); 843 return PA; 844 } 845 846 NodeAddr<StmtNode*> DataFlowGraph::newStmt(NodeAddr<BlockNode*> Owner, 847 MachineInstr *MI) { 848 NodeAddr<StmtNode*> SA = newNode(NodeAttrs::Code | NodeAttrs::Stmt); 849 SA.Addr->setCode(MI); 850 Owner.Addr->addMember(SA, *this); 851 return SA; 852 } 853 854 NodeAddr<BlockNode*> DataFlowGraph::newBlock(NodeAddr<FuncNode*> Owner, 855 MachineBasicBlock *BB) { 856 NodeAddr<BlockNode*> BA = newNode(NodeAttrs::Code | NodeAttrs::Block); 857 BA.Addr->setCode(BB); 858 Owner.Addr->addMember(BA, *this); 859 return BA; 860 } 861 862 NodeAddr<FuncNode*> DataFlowGraph::newFunc(MachineFunction *MF) { 863 NodeAddr<FuncNode*> FA = newNode(NodeAttrs::Code | NodeAttrs::Func); 864 FA.Addr->setCode(MF); 865 return FA; 866 } 867 868 // Build the data flow graph. 869 void DataFlowGraph::build(unsigned Options) { 870 reset(); 871 Func = newFunc(&MF); 872 873 if (MF.empty()) 874 return; 875 876 for (MachineBasicBlock &B : MF) { 877 NodeAddr<BlockNode*> BA = newBlock(Func, &B); 878 BlockNodes.insert(std::make_pair(&B, BA)); 879 for (MachineInstr &I : B) { 880 if (I.isDebugInstr()) 881 continue; 882 buildStmt(BA, I); 883 } 884 } 885 886 NodeAddr<BlockNode*> EA = Func.Addr->getEntryBlock(*this); 887 NodeList Blocks = Func.Addr->members(*this); 888 889 // Collect information about block references. 890 RegisterSet AllRefs; 891 for (NodeAddr<BlockNode*> BA : Blocks) 892 for (NodeAddr<InstrNode*> IA : BA.Addr->members(*this)) 893 for (NodeAddr<RefNode*> RA : IA.Addr->members(*this)) 894 AllRefs.insert(RA.Addr->getRegRef(*this)); 895 896 // Collect function live-ins and entry block live-ins. 897 MachineRegisterInfo &MRI = MF.getRegInfo(); 898 MachineBasicBlock &EntryB = *EA.Addr->getCode(); 899 assert(EntryB.pred_empty() && "Function entry block has predecessors"); 900 for (std::pair<unsigned,unsigned> P : MRI.liveins()) 901 LiveIns.insert(RegisterRef(P.first)); 902 if (MRI.tracksLiveness()) { 903 for (auto I : EntryB.liveins()) 904 LiveIns.insert(RegisterRef(I.PhysReg, I.LaneMask)); 905 } 906 907 // Add function-entry phi nodes for the live-in registers. 908 //for (std::pair<RegisterId,LaneBitmask> P : LiveIns) { 909 for (auto I = LiveIns.rr_begin(), E = LiveIns.rr_end(); I != E; ++I) { 910 RegisterRef RR = *I; 911 NodeAddr<PhiNode*> PA = newPhi(EA); 912 uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving; 913 NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags); 914 PA.Addr->addMember(DA, *this); 915 } 916 917 // Add phis for landing pads. 918 // Landing pads, unlike usual backs blocks, are not entered through 919 // branches in the program, or fall-throughs from other blocks. They 920 // are entered from the exception handling runtime and target's ABI 921 // may define certain registers as defined on entry to such a block. 922 RegisterSet EHRegs = getLandingPadLiveIns(); 923 if (!EHRegs.empty()) { 924 for (NodeAddr<BlockNode*> BA : Blocks) { 925 const MachineBasicBlock &B = *BA.Addr->getCode(); 926 if (!B.isEHPad()) 927 continue; 928 929 // Prepare a list of NodeIds of the block's predecessors. 930 NodeList Preds; 931 for (MachineBasicBlock *PB : B.predecessors()) 932 Preds.push_back(findBlock(PB)); 933 934 // Build phi nodes for each live-in. 935 for (RegisterRef RR : EHRegs) { 936 NodeAddr<PhiNode*> PA = newPhi(BA); 937 uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving; 938 // Add def: 939 NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags); 940 PA.Addr->addMember(DA, *this); 941 // Add uses (no reaching defs for phi uses): 942 for (NodeAddr<BlockNode*> PBA : Preds) { 943 NodeAddr<PhiUseNode*> PUA = newPhiUse(PA, RR, PBA); 944 PA.Addr->addMember(PUA, *this); 945 } 946 } 947 } 948 } 949 950 // Build a map "PhiM" which will contain, for each block, the set 951 // of references that will require phi definitions in that block. 952 BlockRefsMap PhiM; 953 for (NodeAddr<BlockNode*> BA : Blocks) 954 recordDefsForDF(PhiM, BA); 955 for (NodeAddr<BlockNode*> BA : Blocks) 956 buildPhis(PhiM, AllRefs, BA); 957 958 // Link all the refs. This will recursively traverse the dominator tree. 959 DefStackMap DM; 960 linkBlockRefs(DM, EA); 961 962 // Finally, remove all unused phi nodes. 963 if (!(Options & BuildOptions::KeepDeadPhis)) 964 removeUnusedPhis(); 965 } 966 967 RegisterRef DataFlowGraph::makeRegRef(unsigned Reg, unsigned Sub) const { 968 assert(PhysicalRegisterInfo::isRegMaskId(Reg) || 969 Register::isPhysicalRegister(Reg)); 970 assert(Reg != 0); 971 if (Sub != 0) 972 Reg = TRI.getSubReg(Reg, Sub); 973 return RegisterRef(Reg); 974 } 975 976 RegisterRef DataFlowGraph::makeRegRef(const MachineOperand &Op) const { 977 assert(Op.isReg() || Op.isRegMask()); 978 if (Op.isReg()) 979 return makeRegRef(Op.getReg(), Op.getSubReg()); 980 return RegisterRef(PRI.getRegMaskId(Op.getRegMask()), LaneBitmask::getAll()); 981 } 982 983 // For each stack in the map DefM, push the delimiter for block B on it. 984 void DataFlowGraph::markBlock(NodeId B, DefStackMap &DefM) { 985 // Push block delimiters. 986 for (auto &P : DefM) 987 P.second.start_block(B); 988 } 989 990 // Remove all definitions coming from block B from each stack in DefM. 991 void DataFlowGraph::releaseBlock(NodeId B, DefStackMap &DefM) { 992 // Pop all defs from this block from the definition stack. Defs that were 993 // added to the map during the traversal of instructions will not have a 994 // delimiter, but for those, the whole stack will be emptied. 995 for (auto &P : DefM) 996 P.second.clear_block(B); 997 998 // Finally, remove empty stacks from the map. 999 for (auto I = DefM.begin(), E = DefM.end(), NextI = I; I != E; I = NextI) { 1000 NextI = std::next(I); 1001 // This preserves the validity of iterators other than I. 1002 if (I->second.empty()) 1003 DefM.erase(I); 1004 } 1005 } 1006 1007 // Push all definitions from the instruction node IA to an appropriate 1008 // stack in DefM. 1009 void DataFlowGraph::pushAllDefs(NodeAddr<InstrNode*> IA, DefStackMap &DefM) { 1010 pushClobbers(IA, DefM); 1011 pushDefs(IA, DefM); 1012 } 1013 1014 // Push all definitions from the instruction node IA to an appropriate 1015 // stack in DefM. 1016 void DataFlowGraph::pushClobbers(NodeAddr<InstrNode*> IA, DefStackMap &DefM) { 1017 NodeSet Visited; 1018 std::set<RegisterId> Defined; 1019 1020 // The important objectives of this function are: 1021 // - to be able to handle instructions both while the graph is being 1022 // constructed, and after the graph has been constructed, and 1023 // - maintain proper ordering of definitions on the stack for each 1024 // register reference: 1025 // - if there are two or more related defs in IA (i.e. coming from 1026 // the same machine operand), then only push one def on the stack, 1027 // - if there are multiple unrelated defs of non-overlapping 1028 // subregisters of S, then the stack for S will have both (in an 1029 // unspecified order), but the order does not matter from the data- 1030 // -flow perspective. 1031 1032 for (NodeAddr<DefNode*> DA : IA.Addr->members_if(IsDef, *this)) { 1033 if (Visited.count(DA.Id)) 1034 continue; 1035 if (!(DA.Addr->getFlags() & NodeAttrs::Clobbering)) 1036 continue; 1037 1038 NodeList Rel = getRelatedRefs(IA, DA); 1039 NodeAddr<DefNode*> PDA = Rel.front(); 1040 RegisterRef RR = PDA.Addr->getRegRef(*this); 1041 1042 // Push the definition on the stack for the register and all aliases. 1043 // The def stack traversal in linkNodeUp will check the exact aliasing. 1044 DefM[RR.Reg].push(DA); 1045 Defined.insert(RR.Reg); 1046 for (RegisterId A : PRI.getAliasSet(RR.Reg)) { 1047 // Check that we don't push the same def twice. 1048 assert(A != RR.Reg); 1049 if (!Defined.count(A)) 1050 DefM[A].push(DA); 1051 } 1052 // Mark all the related defs as visited. 1053 for (NodeAddr<NodeBase*> T : Rel) 1054 Visited.insert(T.Id); 1055 } 1056 } 1057 1058 // Push all definitions from the instruction node IA to an appropriate 1059 // stack in DefM. 1060 void DataFlowGraph::pushDefs(NodeAddr<InstrNode*> IA, DefStackMap &DefM) { 1061 NodeSet Visited; 1062 #ifndef NDEBUG 1063 std::set<RegisterId> Defined; 1064 #endif 1065 1066 // The important objectives of this function are: 1067 // - to be able to handle instructions both while the graph is being 1068 // constructed, and after the graph has been constructed, and 1069 // - maintain proper ordering of definitions on the stack for each 1070 // register reference: 1071 // - if there are two or more related defs in IA (i.e. coming from 1072 // the same machine operand), then only push one def on the stack, 1073 // - if there are multiple unrelated defs of non-overlapping 1074 // subregisters of S, then the stack for S will have both (in an 1075 // unspecified order), but the order does not matter from the data- 1076 // -flow perspective. 1077 1078 for (NodeAddr<DefNode*> DA : IA.Addr->members_if(IsDef, *this)) { 1079 if (Visited.count(DA.Id)) 1080 continue; 1081 if (DA.Addr->getFlags() & NodeAttrs::Clobbering) 1082 continue; 1083 1084 NodeList Rel = getRelatedRefs(IA, DA); 1085 NodeAddr<DefNode*> PDA = Rel.front(); 1086 RegisterRef RR = PDA.Addr->getRegRef(*this); 1087 #ifndef NDEBUG 1088 // Assert if the register is defined in two or more unrelated defs. 1089 // This could happen if there are two or more def operands defining it. 1090 if (!Defined.insert(RR.Reg).second) { 1091 MachineInstr *MI = NodeAddr<StmtNode*>(IA).Addr->getCode(); 1092 dbgs() << "Multiple definitions of register: " 1093 << Print(RR, *this) << " in\n " << *MI << "in " 1094 << printMBBReference(*MI->getParent()) << '\n'; 1095 llvm_unreachable(nullptr); 1096 } 1097 #endif 1098 // Push the definition on the stack for the register and all aliases. 1099 // The def stack traversal in linkNodeUp will check the exact aliasing. 1100 DefM[RR.Reg].push(DA); 1101 for (RegisterId A : PRI.getAliasSet(RR.Reg)) { 1102 // Check that we don't push the same def twice. 1103 assert(A != RR.Reg); 1104 DefM[A].push(DA); 1105 } 1106 // Mark all the related defs as visited. 1107 for (NodeAddr<NodeBase*> T : Rel) 1108 Visited.insert(T.Id); 1109 } 1110 } 1111 1112 // Return the list of all reference nodes related to RA, including RA itself. 1113 // See "getNextRelated" for the meaning of a "related reference". 1114 NodeList DataFlowGraph::getRelatedRefs(NodeAddr<InstrNode*> IA, 1115 NodeAddr<RefNode*> RA) const { 1116 assert(IA.Id != 0 && RA.Id != 0); 1117 1118 NodeList Refs; 1119 NodeId Start = RA.Id; 1120 do { 1121 Refs.push_back(RA); 1122 RA = getNextRelated(IA, RA); 1123 } while (RA.Id != 0 && RA.Id != Start); 1124 return Refs; 1125 } 1126 1127 // Clear all information in the graph. 1128 void DataFlowGraph::reset() { 1129 Memory.clear(); 1130 BlockNodes.clear(); 1131 Func = NodeAddr<FuncNode*>(); 1132 } 1133 1134 // Return the next reference node in the instruction node IA that is related 1135 // to RA. Conceptually, two reference nodes are related if they refer to the 1136 // same instance of a register access, but differ in flags or other minor 1137 // characteristics. Specific examples of related nodes are shadow reference 1138 // nodes. 1139 // Return the equivalent of nullptr if there are no more related references. 1140 NodeAddr<RefNode*> DataFlowGraph::getNextRelated(NodeAddr<InstrNode*> IA, 1141 NodeAddr<RefNode*> RA) const { 1142 assert(IA.Id != 0 && RA.Id != 0); 1143 1144 auto Related = [this,RA](NodeAddr<RefNode*> TA) -> bool { 1145 if (TA.Addr->getKind() != RA.Addr->getKind()) 1146 return false; 1147 if (TA.Addr->getRegRef(*this) != RA.Addr->getRegRef(*this)) 1148 return false; 1149 return true; 1150 }; 1151 auto RelatedStmt = [&Related,RA](NodeAddr<RefNode*> TA) -> bool { 1152 return Related(TA) && 1153 &RA.Addr->getOp() == &TA.Addr->getOp(); 1154 }; 1155 auto RelatedPhi = [&Related,RA](NodeAddr<RefNode*> TA) -> bool { 1156 if (!Related(TA)) 1157 return false; 1158 if (TA.Addr->getKind() != NodeAttrs::Use) 1159 return true; 1160 // For phi uses, compare predecessor blocks. 1161 const NodeAddr<const PhiUseNode*> TUA = TA; 1162 const NodeAddr<const PhiUseNode*> RUA = RA; 1163 return TUA.Addr->getPredecessor() == RUA.Addr->getPredecessor(); 1164 }; 1165 1166 RegisterRef RR = RA.Addr->getRegRef(*this); 1167 if (IA.Addr->getKind() == NodeAttrs::Stmt) 1168 return RA.Addr->getNextRef(RR, RelatedStmt, true, *this); 1169 return RA.Addr->getNextRef(RR, RelatedPhi, true, *this); 1170 } 1171 1172 // Find the next node related to RA in IA that satisfies condition P. 1173 // If such a node was found, return a pair where the second element is the 1174 // located node. If such a node does not exist, return a pair where the 1175 // first element is the element after which such a node should be inserted, 1176 // and the second element is a null-address. 1177 template <typename Predicate> 1178 std::pair<NodeAddr<RefNode*>,NodeAddr<RefNode*>> 1179 DataFlowGraph::locateNextRef(NodeAddr<InstrNode*> IA, NodeAddr<RefNode*> RA, 1180 Predicate P) const { 1181 assert(IA.Id != 0 && RA.Id != 0); 1182 1183 NodeAddr<RefNode*> NA; 1184 NodeId Start = RA.Id; 1185 while (true) { 1186 NA = getNextRelated(IA, RA); 1187 if (NA.Id == 0 || NA.Id == Start) 1188 break; 1189 if (P(NA)) 1190 break; 1191 RA = NA; 1192 } 1193 1194 if (NA.Id != 0 && NA.Id != Start) 1195 return std::make_pair(RA, NA); 1196 return std::make_pair(RA, NodeAddr<RefNode*>()); 1197 } 1198 1199 // Get the next shadow node in IA corresponding to RA, and optionally create 1200 // such a node if it does not exist. 1201 NodeAddr<RefNode*> DataFlowGraph::getNextShadow(NodeAddr<InstrNode*> IA, 1202 NodeAddr<RefNode*> RA, bool Create) { 1203 assert(IA.Id != 0 && RA.Id != 0); 1204 1205 uint16_t Flags = RA.Addr->getFlags() | NodeAttrs::Shadow; 1206 auto IsShadow = [Flags] (NodeAddr<RefNode*> TA) -> bool { 1207 return TA.Addr->getFlags() == Flags; 1208 }; 1209 auto Loc = locateNextRef(IA, RA, IsShadow); 1210 if (Loc.second.Id != 0 || !Create) 1211 return Loc.second; 1212 1213 // Create a copy of RA and mark is as shadow. 1214 NodeAddr<RefNode*> NA = cloneNode(RA); 1215 NA.Addr->setFlags(Flags | NodeAttrs::Shadow); 1216 IA.Addr->addMemberAfter(Loc.first, NA, *this); 1217 return NA; 1218 } 1219 1220 // Get the next shadow node in IA corresponding to RA. Return null-address 1221 // if such a node does not exist. 1222 NodeAddr<RefNode*> DataFlowGraph::getNextShadow(NodeAddr<InstrNode*> IA, 1223 NodeAddr<RefNode*> RA) const { 1224 assert(IA.Id != 0 && RA.Id != 0); 1225 uint16_t Flags = RA.Addr->getFlags() | NodeAttrs::Shadow; 1226 auto IsShadow = [Flags] (NodeAddr<RefNode*> TA) -> bool { 1227 return TA.Addr->getFlags() == Flags; 1228 }; 1229 return locateNextRef(IA, RA, IsShadow).second; 1230 } 1231 1232 // Create a new statement node in the block node BA that corresponds to 1233 // the machine instruction MI. 1234 void DataFlowGraph::buildStmt(NodeAddr<BlockNode*> BA, MachineInstr &In) { 1235 NodeAddr<StmtNode*> SA = newStmt(BA, &In); 1236 1237 auto isCall = [] (const MachineInstr &In) -> bool { 1238 if (In.isCall()) 1239 return true; 1240 // Is tail call? 1241 if (In.isBranch()) { 1242 for (const MachineOperand &Op : In.operands()) 1243 if (Op.isGlobal() || Op.isSymbol()) 1244 return true; 1245 // Assume indirect branches are calls. This is for the purpose of 1246 // keeping implicit operands, and so it won't hurt on intra-function 1247 // indirect branches. 1248 if (In.isIndirectBranch()) 1249 return true; 1250 } 1251 return false; 1252 }; 1253 1254 auto isDefUndef = [this] (const MachineInstr &In, RegisterRef DR) -> bool { 1255 // This instruction defines DR. Check if there is a use operand that 1256 // would make DR live on entry to the instruction. 1257 for (const MachineOperand &Op : In.operands()) { 1258 if (!Op.isReg() || Op.getReg() == 0 || !Op.isUse() || Op.isUndef()) 1259 continue; 1260 RegisterRef UR = makeRegRef(Op); 1261 if (PRI.alias(DR, UR)) 1262 return false; 1263 } 1264 return true; 1265 }; 1266 1267 bool IsCall = isCall(In); 1268 unsigned NumOps = In.getNumOperands(); 1269 1270 // Avoid duplicate implicit defs. This will not detect cases of implicit 1271 // defs that define registers that overlap, but it is not clear how to 1272 // interpret that in the absence of explicit defs. Overlapping explicit 1273 // defs are likely illegal already. 1274 BitVector DoneDefs(TRI.getNumRegs()); 1275 // Process explicit defs first. 1276 for (unsigned OpN = 0; OpN < NumOps; ++OpN) { 1277 MachineOperand &Op = In.getOperand(OpN); 1278 if (!Op.isReg() || !Op.isDef() || Op.isImplicit()) 1279 continue; 1280 Register R = Op.getReg(); 1281 if (!R || !R.isPhysical()) 1282 continue; 1283 uint16_t Flags = NodeAttrs::None; 1284 if (TOI.isPreserving(In, OpN)) { 1285 Flags |= NodeAttrs::Preserving; 1286 // If the def is preserving, check if it is also undefined. 1287 if (isDefUndef(In, makeRegRef(Op))) 1288 Flags |= NodeAttrs::Undef; 1289 } 1290 if (TOI.isClobbering(In, OpN)) 1291 Flags |= NodeAttrs::Clobbering; 1292 if (TOI.isFixedReg(In, OpN)) 1293 Flags |= NodeAttrs::Fixed; 1294 if (IsCall && Op.isDead()) 1295 Flags |= NodeAttrs::Dead; 1296 NodeAddr<DefNode*> DA = newDef(SA, Op, Flags); 1297 SA.Addr->addMember(DA, *this); 1298 assert(!DoneDefs.test(R)); 1299 DoneDefs.set(R); 1300 } 1301 1302 // Process reg-masks (as clobbers). 1303 BitVector DoneClobbers(TRI.getNumRegs()); 1304 for (unsigned OpN = 0; OpN < NumOps; ++OpN) { 1305 MachineOperand &Op = In.getOperand(OpN); 1306 if (!Op.isRegMask()) 1307 continue; 1308 uint16_t Flags = NodeAttrs::Clobbering | NodeAttrs::Fixed | 1309 NodeAttrs::Dead; 1310 NodeAddr<DefNode*> DA = newDef(SA, Op, Flags); 1311 SA.Addr->addMember(DA, *this); 1312 // Record all clobbered registers in DoneDefs. 1313 const uint32_t *RM = Op.getRegMask(); 1314 for (unsigned i = 1, e = TRI.getNumRegs(); i != e; ++i) 1315 if (!(RM[i/32] & (1u << (i%32)))) 1316 DoneClobbers.set(i); 1317 } 1318 1319 // Process implicit defs, skipping those that have already been added 1320 // as explicit. 1321 for (unsigned OpN = 0; OpN < NumOps; ++OpN) { 1322 MachineOperand &Op = In.getOperand(OpN); 1323 if (!Op.isReg() || !Op.isDef() || !Op.isImplicit()) 1324 continue; 1325 Register R = Op.getReg(); 1326 if (!R || !R.isPhysical() || DoneDefs.test(R)) 1327 continue; 1328 RegisterRef RR = makeRegRef(Op); 1329 uint16_t Flags = NodeAttrs::None; 1330 if (TOI.isPreserving(In, OpN)) { 1331 Flags |= NodeAttrs::Preserving; 1332 // If the def is preserving, check if it is also undefined. 1333 if (isDefUndef(In, RR)) 1334 Flags |= NodeAttrs::Undef; 1335 } 1336 if (TOI.isClobbering(In, OpN)) 1337 Flags |= NodeAttrs::Clobbering; 1338 if (TOI.isFixedReg(In, OpN)) 1339 Flags |= NodeAttrs::Fixed; 1340 if (IsCall && Op.isDead()) { 1341 if (DoneClobbers.test(R)) 1342 continue; 1343 Flags |= NodeAttrs::Dead; 1344 } 1345 NodeAddr<DefNode*> DA = newDef(SA, Op, Flags); 1346 SA.Addr->addMember(DA, *this); 1347 DoneDefs.set(R); 1348 } 1349 1350 for (unsigned OpN = 0; OpN < NumOps; ++OpN) { 1351 MachineOperand &Op = In.getOperand(OpN); 1352 if (!Op.isReg() || !Op.isUse()) 1353 continue; 1354 Register R = Op.getReg(); 1355 if (!R || !R.isPhysical()) 1356 continue; 1357 uint16_t Flags = NodeAttrs::None; 1358 if (Op.isUndef()) 1359 Flags |= NodeAttrs::Undef; 1360 if (TOI.isFixedReg(In, OpN)) 1361 Flags |= NodeAttrs::Fixed; 1362 NodeAddr<UseNode*> UA = newUse(SA, Op, Flags); 1363 SA.Addr->addMember(UA, *this); 1364 } 1365 } 1366 1367 // Scan all defs in the block node BA and record in PhiM the locations of 1368 // phi nodes corresponding to these defs. 1369 void DataFlowGraph::recordDefsForDF(BlockRefsMap &PhiM, 1370 NodeAddr<BlockNode*> BA) { 1371 // Check all defs from block BA and record them in each block in BA's 1372 // iterated dominance frontier. This information will later be used to 1373 // create phi nodes. 1374 MachineBasicBlock *BB = BA.Addr->getCode(); 1375 assert(BB); 1376 auto DFLoc = MDF.find(BB); 1377 if (DFLoc == MDF.end() || DFLoc->second.empty()) 1378 return; 1379 1380 // Traverse all instructions in the block and collect the set of all 1381 // defined references. For each reference there will be a phi created 1382 // in the block's iterated dominance frontier. 1383 // This is done to make sure that each defined reference gets only one 1384 // phi node, even if it is defined multiple times. 1385 RegisterSet Defs; 1386 for (NodeAddr<InstrNode*> IA : BA.Addr->members(*this)) 1387 for (NodeAddr<RefNode*> RA : IA.Addr->members_if(IsDef, *this)) 1388 Defs.insert(RA.Addr->getRegRef(*this)); 1389 1390 // Calculate the iterated dominance frontier of BB. 1391 const MachineDominanceFrontier::DomSetType &DF = DFLoc->second; 1392 SetVector<MachineBasicBlock*> IDF(DF.begin(), DF.end()); 1393 for (unsigned i = 0; i < IDF.size(); ++i) { 1394 auto F = MDF.find(IDF[i]); 1395 if (F != MDF.end()) 1396 IDF.insert(F->second.begin(), F->second.end()); 1397 } 1398 1399 // Finally, add the set of defs to each block in the iterated dominance 1400 // frontier. 1401 for (auto *DB : IDF) { 1402 NodeAddr<BlockNode*> DBA = findBlock(DB); 1403 PhiM[DBA.Id].insert(Defs.begin(), Defs.end()); 1404 } 1405 } 1406 1407 // Given the locations of phi nodes in the map PhiM, create the phi nodes 1408 // that are located in the block node BA. 1409 void DataFlowGraph::buildPhis(BlockRefsMap &PhiM, RegisterSet &AllRefs, 1410 NodeAddr<BlockNode*> BA) { 1411 // Check if this blocks has any DF defs, i.e. if there are any defs 1412 // that this block is in the iterated dominance frontier of. 1413 auto HasDF = PhiM.find(BA.Id); 1414 if (HasDF == PhiM.end() || HasDF->second.empty()) 1415 return; 1416 1417 // First, remove all R in Refs in such that there exists T in Refs 1418 // such that T covers R. In other words, only leave those refs that 1419 // are not covered by another ref (i.e. maximal with respect to covering). 1420 1421 auto MaxCoverIn = [this] (RegisterRef RR, RegisterSet &RRs) -> RegisterRef { 1422 for (RegisterRef I : RRs) 1423 if (I != RR && RegisterAggr::isCoverOf(I, RR, PRI)) 1424 RR = I; 1425 return RR; 1426 }; 1427 1428 RegisterSet MaxDF; 1429 for (RegisterRef I : HasDF->second) 1430 MaxDF.insert(MaxCoverIn(I, HasDF->second)); 1431 1432 std::vector<RegisterRef> MaxRefs; 1433 for (RegisterRef I : MaxDF) 1434 MaxRefs.push_back(MaxCoverIn(I, AllRefs)); 1435 1436 // Now, for each R in MaxRefs, get the alias closure of R. If the closure 1437 // only has R in it, create a phi a def for R. Otherwise, create a phi, 1438 // and add a def for each S in the closure. 1439 1440 // Sort the refs so that the phis will be created in a deterministic order. 1441 llvm::sort(MaxRefs); 1442 // Remove duplicates. 1443 auto NewEnd = std::unique(MaxRefs.begin(), MaxRefs.end()); 1444 MaxRefs.erase(NewEnd, MaxRefs.end()); 1445 1446 auto Aliased = [this,&MaxRefs](RegisterRef RR, 1447 std::vector<unsigned> &Closure) -> bool { 1448 for (unsigned I : Closure) 1449 if (PRI.alias(RR, MaxRefs[I])) 1450 return true; 1451 return false; 1452 }; 1453 1454 // Prepare a list of NodeIds of the block's predecessors. 1455 NodeList Preds; 1456 const MachineBasicBlock *MBB = BA.Addr->getCode(); 1457 for (MachineBasicBlock *PB : MBB->predecessors()) 1458 Preds.push_back(findBlock(PB)); 1459 1460 while (!MaxRefs.empty()) { 1461 // Put the first element in the closure, and then add all subsequent 1462 // elements from MaxRefs to it, if they alias at least one element 1463 // already in the closure. 1464 // ClosureIdx: vector of indices in MaxRefs of members of the closure. 1465 std::vector<unsigned> ClosureIdx = { 0 }; 1466 for (unsigned i = 1; i != MaxRefs.size(); ++i) 1467 if (Aliased(MaxRefs[i], ClosureIdx)) 1468 ClosureIdx.push_back(i); 1469 1470 // Build a phi for the closure. 1471 unsigned CS = ClosureIdx.size(); 1472 NodeAddr<PhiNode*> PA = newPhi(BA); 1473 1474 // Add defs. 1475 for (unsigned X = 0; X != CS; ++X) { 1476 RegisterRef RR = MaxRefs[ClosureIdx[X]]; 1477 uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving; 1478 NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags); 1479 PA.Addr->addMember(DA, *this); 1480 } 1481 // Add phi uses. 1482 for (NodeAddr<BlockNode*> PBA : Preds) { 1483 for (unsigned X = 0; X != CS; ++X) { 1484 RegisterRef RR = MaxRefs[ClosureIdx[X]]; 1485 NodeAddr<PhiUseNode*> PUA = newPhiUse(PA, RR, PBA); 1486 PA.Addr->addMember(PUA, *this); 1487 } 1488 } 1489 1490 // Erase from MaxRefs all elements in the closure. 1491 auto Begin = MaxRefs.begin(); 1492 for (unsigned Idx : llvm::reverse(ClosureIdx)) 1493 MaxRefs.erase(Begin + Idx); 1494 } 1495 } 1496 1497 // Remove any unneeded phi nodes that were created during the build process. 1498 void DataFlowGraph::removeUnusedPhis() { 1499 // This will remove unused phis, i.e. phis where each def does not reach 1500 // any uses or other defs. This will not detect or remove circular phi 1501 // chains that are otherwise dead. Unused/dead phis are created during 1502 // the build process and this function is intended to remove these cases 1503 // that are easily determinable to be unnecessary. 1504 1505 SetVector<NodeId> PhiQ; 1506 for (NodeAddr<BlockNode*> BA : Func.Addr->members(*this)) { 1507 for (auto P : BA.Addr->members_if(IsPhi, *this)) 1508 PhiQ.insert(P.Id); 1509 } 1510 1511 static auto HasUsedDef = [](NodeList &Ms) -> bool { 1512 for (NodeAddr<NodeBase*> M : Ms) { 1513 if (M.Addr->getKind() != NodeAttrs::Def) 1514 continue; 1515 NodeAddr<DefNode*> DA = M; 1516 if (DA.Addr->getReachedDef() != 0 || DA.Addr->getReachedUse() != 0) 1517 return true; 1518 } 1519 return false; 1520 }; 1521 1522 // Any phi, if it is removed, may affect other phis (make them dead). 1523 // For each removed phi, collect the potentially affected phis and add 1524 // them back to the queue. 1525 while (!PhiQ.empty()) { 1526 auto PA = addr<PhiNode*>(PhiQ[0]); 1527 PhiQ.remove(PA.Id); 1528 NodeList Refs = PA.Addr->members(*this); 1529 if (HasUsedDef(Refs)) 1530 continue; 1531 for (NodeAddr<RefNode*> RA : Refs) { 1532 if (NodeId RD = RA.Addr->getReachingDef()) { 1533 auto RDA = addr<DefNode*>(RD); 1534 NodeAddr<InstrNode*> OA = RDA.Addr->getOwner(*this); 1535 if (IsPhi(OA)) 1536 PhiQ.insert(OA.Id); 1537 } 1538 if (RA.Addr->isDef()) 1539 unlinkDef(RA, true); 1540 else 1541 unlinkUse(RA, true); 1542 } 1543 NodeAddr<BlockNode*> BA = PA.Addr->getOwner(*this); 1544 BA.Addr->removeMember(PA, *this); 1545 } 1546 } 1547 1548 // For a given reference node TA in an instruction node IA, connect the 1549 // reaching def of TA to the appropriate def node. Create any shadow nodes 1550 // as appropriate. 1551 template <typename T> 1552 void DataFlowGraph::linkRefUp(NodeAddr<InstrNode*> IA, NodeAddr<T> TA, 1553 DefStack &DS) { 1554 if (DS.empty()) 1555 return; 1556 RegisterRef RR = TA.Addr->getRegRef(*this); 1557 NodeAddr<T> TAP; 1558 1559 // References from the def stack that have been examined so far. 1560 RegisterAggr Defs(PRI); 1561 1562 for (auto I = DS.top(), E = DS.bottom(); I != E; I.down()) { 1563 RegisterRef QR = I->Addr->getRegRef(*this); 1564 1565 // Skip all defs that are aliased to any of the defs that we have already 1566 // seen. If this completes a cover of RR, stop the stack traversal. 1567 bool Alias = Defs.hasAliasOf(QR); 1568 bool Cover = Defs.insert(QR).hasCoverOf(RR); 1569 if (Alias) { 1570 if (Cover) 1571 break; 1572 continue; 1573 } 1574 1575 // The reaching def. 1576 NodeAddr<DefNode*> RDA = *I; 1577 1578 // Pick the reached node. 1579 if (TAP.Id == 0) { 1580 TAP = TA; 1581 } else { 1582 // Mark the existing ref as "shadow" and create a new shadow. 1583 TAP.Addr->setFlags(TAP.Addr->getFlags() | NodeAttrs::Shadow); 1584 TAP = getNextShadow(IA, TAP, true); 1585 } 1586 1587 // Create the link. 1588 TAP.Addr->linkToDef(TAP.Id, RDA); 1589 1590 if (Cover) 1591 break; 1592 } 1593 } 1594 1595 // Create data-flow links for all reference nodes in the statement node SA. 1596 template <typename Predicate> 1597 void DataFlowGraph::linkStmtRefs(DefStackMap &DefM, NodeAddr<StmtNode*> SA, 1598 Predicate P) { 1599 #ifndef NDEBUG 1600 RegisterSet Defs; 1601 #endif 1602 1603 // Link all nodes (upwards in the data-flow) with their reaching defs. 1604 for (NodeAddr<RefNode*> RA : SA.Addr->members_if(P, *this)) { 1605 uint16_t Kind = RA.Addr->getKind(); 1606 assert(Kind == NodeAttrs::Def || Kind == NodeAttrs::Use); 1607 RegisterRef RR = RA.Addr->getRegRef(*this); 1608 #ifndef NDEBUG 1609 // Do not expect multiple defs of the same reference. 1610 assert(Kind != NodeAttrs::Def || !Defs.count(RR)); 1611 Defs.insert(RR); 1612 #endif 1613 1614 auto F = DefM.find(RR.Reg); 1615 if (F == DefM.end()) 1616 continue; 1617 DefStack &DS = F->second; 1618 if (Kind == NodeAttrs::Use) 1619 linkRefUp<UseNode*>(SA, RA, DS); 1620 else if (Kind == NodeAttrs::Def) 1621 linkRefUp<DefNode*>(SA, RA, DS); 1622 else 1623 llvm_unreachable("Unexpected node in instruction"); 1624 } 1625 } 1626 1627 // Create data-flow links for all instructions in the block node BA. This 1628 // will include updating any phi nodes in BA. 1629 void DataFlowGraph::linkBlockRefs(DefStackMap &DefM, NodeAddr<BlockNode*> BA) { 1630 // Push block delimiters. 1631 markBlock(BA.Id, DefM); 1632 1633 auto IsClobber = [] (NodeAddr<RefNode*> RA) -> bool { 1634 return IsDef(RA) && (RA.Addr->getFlags() & NodeAttrs::Clobbering); 1635 }; 1636 auto IsNoClobber = [] (NodeAddr<RefNode*> RA) -> bool { 1637 return IsDef(RA) && !(RA.Addr->getFlags() & NodeAttrs::Clobbering); 1638 }; 1639 1640 assert(BA.Addr && "block node address is needed to create a data-flow link"); 1641 // For each non-phi instruction in the block, link all the defs and uses 1642 // to their reaching defs. For any member of the block (including phis), 1643 // push the defs on the corresponding stacks. 1644 for (NodeAddr<InstrNode*> IA : BA.Addr->members(*this)) { 1645 // Ignore phi nodes here. They will be linked part by part from the 1646 // predecessors. 1647 if (IA.Addr->getKind() == NodeAttrs::Stmt) { 1648 linkStmtRefs(DefM, IA, IsUse); 1649 linkStmtRefs(DefM, IA, IsClobber); 1650 } 1651 1652 // Push the definitions on the stack. 1653 pushClobbers(IA, DefM); 1654 1655 if (IA.Addr->getKind() == NodeAttrs::Stmt) 1656 linkStmtRefs(DefM, IA, IsNoClobber); 1657 1658 pushDefs(IA, DefM); 1659 } 1660 1661 // Recursively process all children in the dominator tree. 1662 MachineDomTreeNode *N = MDT.getNode(BA.Addr->getCode()); 1663 for (auto *I : *N) { 1664 MachineBasicBlock *SB = I->getBlock(); 1665 NodeAddr<BlockNode*> SBA = findBlock(SB); 1666 linkBlockRefs(DefM, SBA); 1667 } 1668 1669 // Link the phi uses from the successor blocks. 1670 auto IsUseForBA = [BA](NodeAddr<NodeBase*> NA) -> bool { 1671 if (NA.Addr->getKind() != NodeAttrs::Use) 1672 return false; 1673 assert(NA.Addr->getFlags() & NodeAttrs::PhiRef); 1674 NodeAddr<PhiUseNode*> PUA = NA; 1675 return PUA.Addr->getPredecessor() == BA.Id; 1676 }; 1677 1678 RegisterSet EHLiveIns = getLandingPadLiveIns(); 1679 MachineBasicBlock *MBB = BA.Addr->getCode(); 1680 1681 for (MachineBasicBlock *SB : MBB->successors()) { 1682 bool IsEHPad = SB->isEHPad(); 1683 NodeAddr<BlockNode*> SBA = findBlock(SB); 1684 for (NodeAddr<InstrNode*> IA : SBA.Addr->members_if(IsPhi, *this)) { 1685 // Do not link phi uses for landing pad live-ins. 1686 if (IsEHPad) { 1687 // Find what register this phi is for. 1688 NodeAddr<RefNode*> RA = IA.Addr->getFirstMember(*this); 1689 assert(RA.Id != 0); 1690 if (EHLiveIns.count(RA.Addr->getRegRef(*this))) 1691 continue; 1692 } 1693 // Go over each phi use associated with MBB, and link it. 1694 for (auto U : IA.Addr->members_if(IsUseForBA, *this)) { 1695 NodeAddr<PhiUseNode*> PUA = U; 1696 RegisterRef RR = PUA.Addr->getRegRef(*this); 1697 linkRefUp<UseNode*>(IA, PUA, DefM[RR.Reg]); 1698 } 1699 } 1700 } 1701 1702 // Pop all defs from this block from the definition stacks. 1703 releaseBlock(BA.Id, DefM); 1704 } 1705 1706 // Remove the use node UA from any data-flow and structural links. 1707 void DataFlowGraph::unlinkUseDF(NodeAddr<UseNode*> UA) { 1708 NodeId RD = UA.Addr->getReachingDef(); 1709 NodeId Sib = UA.Addr->getSibling(); 1710 1711 if (RD == 0) { 1712 assert(Sib == 0); 1713 return; 1714 } 1715 1716 auto RDA = addr<DefNode*>(RD); 1717 auto TA = addr<UseNode*>(RDA.Addr->getReachedUse()); 1718 if (TA.Id == UA.Id) { 1719 RDA.Addr->setReachedUse(Sib); 1720 return; 1721 } 1722 1723 while (TA.Id != 0) { 1724 NodeId S = TA.Addr->getSibling(); 1725 if (S == UA.Id) { 1726 TA.Addr->setSibling(UA.Addr->getSibling()); 1727 return; 1728 } 1729 TA = addr<UseNode*>(S); 1730 } 1731 } 1732 1733 // Remove the def node DA from any data-flow and structural links. 1734 void DataFlowGraph::unlinkDefDF(NodeAddr<DefNode*> DA) { 1735 // 1736 // RD 1737 // | reached 1738 // | def 1739 // : 1740 // . 1741 // +----+ 1742 // ... -- | DA | -- ... -- 0 : sibling chain of DA 1743 // +----+ 1744 // | | reached 1745 // | : def 1746 // | . 1747 // | ... : Siblings (defs) 1748 // | 1749 // : reached 1750 // . use 1751 // ... : sibling chain of reached uses 1752 1753 NodeId RD = DA.Addr->getReachingDef(); 1754 1755 // Visit all siblings of the reached def and reset their reaching defs. 1756 // Also, defs reached by DA are now "promoted" to being reached by RD, 1757 // so all of them will need to be spliced into the sibling chain where 1758 // DA belongs. 1759 auto getAllNodes = [this] (NodeId N) -> NodeList { 1760 NodeList Res; 1761 while (N) { 1762 auto RA = addr<RefNode*>(N); 1763 // Keep the nodes in the exact sibling order. 1764 Res.push_back(RA); 1765 N = RA.Addr->getSibling(); 1766 } 1767 return Res; 1768 }; 1769 NodeList ReachedDefs = getAllNodes(DA.Addr->getReachedDef()); 1770 NodeList ReachedUses = getAllNodes(DA.Addr->getReachedUse()); 1771 1772 if (RD == 0) { 1773 for (NodeAddr<RefNode*> I : ReachedDefs) 1774 I.Addr->setSibling(0); 1775 for (NodeAddr<RefNode*> I : ReachedUses) 1776 I.Addr->setSibling(0); 1777 } 1778 for (NodeAddr<DefNode*> I : ReachedDefs) 1779 I.Addr->setReachingDef(RD); 1780 for (NodeAddr<UseNode*> I : ReachedUses) 1781 I.Addr->setReachingDef(RD); 1782 1783 NodeId Sib = DA.Addr->getSibling(); 1784 if (RD == 0) { 1785 assert(Sib == 0); 1786 return; 1787 } 1788 1789 // Update the reaching def node and remove DA from the sibling list. 1790 auto RDA = addr<DefNode*>(RD); 1791 auto TA = addr<DefNode*>(RDA.Addr->getReachedDef()); 1792 if (TA.Id == DA.Id) { 1793 // If DA is the first reached def, just update the RD's reached def 1794 // to the DA's sibling. 1795 RDA.Addr->setReachedDef(Sib); 1796 } else { 1797 // Otherwise, traverse the sibling list of the reached defs and remove 1798 // DA from it. 1799 while (TA.Id != 0) { 1800 NodeId S = TA.Addr->getSibling(); 1801 if (S == DA.Id) { 1802 TA.Addr->setSibling(Sib); 1803 break; 1804 } 1805 TA = addr<DefNode*>(S); 1806 } 1807 } 1808 1809 // Splice the DA's reached defs into the RDA's reached def chain. 1810 if (!ReachedDefs.empty()) { 1811 auto Last = NodeAddr<DefNode*>(ReachedDefs.back()); 1812 Last.Addr->setSibling(RDA.Addr->getReachedDef()); 1813 RDA.Addr->setReachedDef(ReachedDefs.front().Id); 1814 } 1815 // Splice the DA's reached uses into the RDA's reached use chain. 1816 if (!ReachedUses.empty()) { 1817 auto Last = NodeAddr<UseNode*>(ReachedUses.back()); 1818 Last.Addr->setSibling(RDA.Addr->getReachedUse()); 1819 RDA.Addr->setReachedUse(ReachedUses.front().Id); 1820 } 1821 } 1822