1c931ac59Spaperchalice //===- MachineDomTreeUpdater.cpp -----------------------------------------===// 2c931ac59Spaperchalice // 3c931ac59Spaperchalice // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c931ac59Spaperchalice // See https://llvm.org/LICENSE.txt for license information. 5c931ac59Spaperchalice // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c931ac59Spaperchalice // 7c931ac59Spaperchalice //===----------------------------------------------------------------------===// 8c931ac59Spaperchalice // 9c931ac59Spaperchalice // This file implements the MachineDomTreeUpdater class, which provides a 10c931ac59Spaperchalice // uniform way to update dominator tree related data structures. 11c931ac59Spaperchalice // 12c931ac59Spaperchalice //===----------------------------------------------------------------------===// 13c931ac59Spaperchalice 14c931ac59Spaperchalice #include "llvm/CodeGen/MachineDomTreeUpdater.h" 15e5094bafSpaperchalice #include "llvm/Analysis/GenericDomTreeUpdaterImpl.h" 16c931ac59Spaperchalice #include "llvm/CodeGen/MachinePostDominators.h" 17c931ac59Spaperchalice 18c931ac59Spaperchalice namespace llvm { 19c931ac59Spaperchalice 20c931ac59Spaperchalice template class GenericDomTreeUpdater< 21c931ac59Spaperchalice MachineDomTreeUpdater, MachineDominatorTree, MachinePostDominatorTree>; 22c931ac59Spaperchalice 23e5094bafSpaperchalice template void 24e5094bafSpaperchalice GenericDomTreeUpdater<MachineDomTreeUpdater, MachineDominatorTree, 25e5094bafSpaperchalice MachinePostDominatorTree>::recalculate(MachineFunction 26e5094bafSpaperchalice &MF); 27e5094bafSpaperchalice 28*1562b70eSpaperchalice template void GenericDomTreeUpdater< 29*1562b70eSpaperchalice MachineDomTreeUpdater, MachineDominatorTree, 30*1562b70eSpaperchalice MachinePostDominatorTree>::applyUpdatesImpl</*IsForward=*/true>(); 31*1562b70eSpaperchalice template void GenericDomTreeUpdater< 32*1562b70eSpaperchalice MachineDomTreeUpdater, MachineDominatorTree, 33*1562b70eSpaperchalice MachinePostDominatorTree>::applyUpdatesImpl</*IsForward=*/false>(); 34*1562b70eSpaperchalice 35c931ac59Spaperchalice bool MachineDomTreeUpdater::forceFlushDeletedBB() { 36c931ac59Spaperchalice if (DeletedBBs.empty()) 37c931ac59Spaperchalice return false; 38c931ac59Spaperchalice 39c931ac59Spaperchalice for (auto *BB : DeletedBBs) { 40c931ac59Spaperchalice eraseDelBBNode(BB); 41c931ac59Spaperchalice BB->eraseFromParent(); 42c931ac59Spaperchalice } 43c931ac59Spaperchalice DeletedBBs.clear(); 44c931ac59Spaperchalice return true; 45c931ac59Spaperchalice } 46c931ac59Spaperchalice 47c931ac59Spaperchalice // The DT and PDT require the nodes related to updates 48c931ac59Spaperchalice // are not deleted when update functions are called. 49c931ac59Spaperchalice // So MachineBasicBlock deletions must be pended when the 50c931ac59Spaperchalice // UpdateStrategy is Lazy. When the UpdateStrategy is 51c931ac59Spaperchalice // Eager, the MachineBasicBlock will be deleted immediately. 52c931ac59Spaperchalice void MachineDomTreeUpdater::deleteBB(MachineBasicBlock *DelBB) { 53c931ac59Spaperchalice validateDeleteBB(DelBB); 54c931ac59Spaperchalice if (Strategy == UpdateStrategy::Lazy) { 55c931ac59Spaperchalice DeletedBBs.insert(DelBB); 56c931ac59Spaperchalice return; 57c931ac59Spaperchalice } 58c931ac59Spaperchalice 59c931ac59Spaperchalice eraseDelBBNode(DelBB); 60c931ac59Spaperchalice DelBB->eraseFromParent(); 61c931ac59Spaperchalice } 62c931ac59Spaperchalice 63c931ac59Spaperchalice void MachineDomTreeUpdater::validateDeleteBB(MachineBasicBlock *DelBB) { 64c931ac59Spaperchalice assert(DelBB && "Invalid push_back of nullptr DelBB."); 65c931ac59Spaperchalice assert(DelBB->pred_empty() && "DelBB has one or more predecessors."); 66c931ac59Spaperchalice } 67c931ac59Spaperchalice 68c931ac59Spaperchalice } // namespace llvm 69