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