| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 1 | //===- lib/Codegen/MachineRegionInfo.cpp ----------------------------------===// | 
|  | 2 | // | 
| Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 6 | // | 
|  | 7 | //===----------------------------------------------------------------------===// | 
|  | 8 |  | 
| Chandler Carruth | 6bda14b | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 9 | #include "llvm/CodeGen/MachineRegionInfo.h" | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 10 | #include "llvm/ADT/Statistic.h" | 
|  | 11 | #include "llvm/Analysis/RegionInfoImpl.h" | 
| Chandler Carruth | d990388 | 2015-01-14 11:23:27 +0000 | [diff] [blame] | 12 | #include "llvm/CodeGen/MachinePostDominators.h" | 
| Nico Weber | 432a388 | 2018-04-30 14:59:11 +0000 | [diff] [blame] | 13 | #include "llvm/Config/llvm-config.h" | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 14 | #include "llvm/Pass.h" | 
|  | 15 | #include "llvm/Support/Compiler.h" | 
|  | 16 | #include "llvm/Support/Debug.h" | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 17 |  | 
| Matthias Braun | 4313059 | 2017-02-18 00:41:16 +0000 | [diff] [blame] | 18 | #define DEBUG_TYPE "machine-region-info" | 
| Richard Smith | 5e23fb8 | 2014-07-30 00:25:24 +0000 | [diff] [blame] | 19 |  | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 20 | using namespace llvm; | 
|  | 21 |  | 
|  | 22 | STATISTIC(numMachineRegions,       "The # of machine regions"); | 
|  | 23 | STATISTIC(numMachineSimpleRegions, "The # of simple machine regions"); | 
|  | 24 |  | 
|  | 25 | namespace llvm { | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 26 |  | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 27 | template class RegionBase<RegionTraits<MachineFunction>>; | 
|  | 28 | template class RegionNodeBase<RegionTraits<MachineFunction>>; | 
|  | 29 | template class RegionInfoBase<RegionTraits<MachineFunction>>; | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 30 |  | 
|  | 31 | } // end namespace llvm | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 32 |  | 
|  | 33 | //===----------------------------------------------------------------------===// | 
|  | 34 | // MachineRegion implementation | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 35 |  | 
|  | 36 | MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit, | 
|  | 37 | MachineRegionInfo* RI, | 
|  | 38 | MachineDominatorTree *DT, MachineRegion *Parent) : | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 39 | RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {} | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 40 |  | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 41 | MachineRegion::~MachineRegion() = default; | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 42 |  | 
|  | 43 | //===----------------------------------------------------------------------===// | 
|  | 44 | // MachineRegionInfo implementation | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 45 |  | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 46 | MachineRegionInfo::MachineRegionInfo() = default; | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 47 |  | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 48 | MachineRegionInfo::~MachineRegionInfo() = default; | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 49 |  | 
|  | 50 | void MachineRegionInfo::updateStatistics(MachineRegion *R) { | 
|  | 51 | ++numMachineRegions; | 
|  | 52 |  | 
|  | 53 | // TODO: Slow. Should only be enabled if -stats is used. | 
|  | 54 | if (R->isSimple()) | 
|  | 55 | ++numMachineSimpleRegions; | 
|  | 56 | } | 
|  | 57 |  | 
| NAKAMURA Takumi | 74a5332 | 2014-07-20 11:14:55 +0000 | [diff] [blame] | 58 | void MachineRegionInfo::recalculate(MachineFunction &F, | 
|  | 59 | MachineDominatorTree *DT_, | 
|  | 60 | MachinePostDominatorTree *PDT_, | 
|  | 61 | MachineDominanceFrontier *DF_) { | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 62 | DT = DT_; | 
|  | 63 | PDT = PDT_; | 
|  | 64 | DF = DF_; | 
|  | 65 |  | 
|  | 66 | MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F); | 
|  | 67 |  | 
|  | 68 | TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr); | 
|  | 69 | updateStatistics(TopLevelRegion); | 
|  | 70 | calculate(F); | 
|  | 71 | } | 
|  | 72 |  | 
|  | 73 | //===----------------------------------------------------------------------===// | 
|  | 74 | // MachineRegionInfoPass implementation | 
|  | 75 | // | 
|  | 76 |  | 
|  | 77 | MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) { | 
|  | 78 | initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry()); | 
|  | 79 | } | 
|  | 80 |  | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 81 | MachineRegionInfoPass::~MachineRegionInfoPass() = default; | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 82 |  | 
|  | 83 | bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) { | 
|  | 84 | releaseMemory(); | 
|  | 85 |  | 
|  | 86 | auto DT = &getAnalysis<MachineDominatorTree>(); | 
|  | 87 | auto PDT = &getAnalysis<MachinePostDominatorTree>(); | 
|  | 88 | auto DF = &getAnalysis<MachineDominanceFrontier>(); | 
|  | 89 |  | 
|  | 90 | RI.recalculate(F, DT, PDT, DF); | 
| Matthias Braun | 4313059 | 2017-02-18 00:41:16 +0000 | [diff] [blame] | 91 |  | 
| Nicola Zaghen | d34e60c | 2018-05-14 12:53:11 +0000 | [diff] [blame] | 92 | LLVM_DEBUG(RI.dump()); | 
| Matthias Braun | 4313059 | 2017-02-18 00:41:16 +0000 | [diff] [blame] | 93 |  | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 94 | return false; | 
|  | 95 | } | 
|  | 96 |  | 
|  | 97 | void MachineRegionInfoPass::releaseMemory() { | 
|  | 98 | RI.releaseMemory(); | 
|  | 99 | } | 
|  | 100 |  | 
|  | 101 | void MachineRegionInfoPass::verifyAnalysis() const { | 
|  | 102 | // Only do verification when user wants to, otherwise this expensive check | 
|  | 103 | // will be invoked by PMDataManager::verifyPreservedAnalysis when | 
|  | 104 | // a regionpass (marked PreservedAll) finish. | 
|  | 105 | if (MachineRegionInfo::VerifyRegionInfo) | 
|  | 106 | RI.verifyAnalysis(); | 
|  | 107 | } | 
|  | 108 |  | 
|  | 109 | void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { | 
|  | 110 | AU.setPreservesAll(); | 
| Matthias Braun | 4313059 | 2017-02-18 00:41:16 +0000 | [diff] [blame] | 111 | AU.addRequired<MachineDominatorTree>(); | 
|  | 112 | AU.addRequired<MachinePostDominatorTree>(); | 
|  | 113 | AU.addRequired<MachineDominanceFrontier>(); | 
|  | 114 | MachineFunctionPass::getAnalysisUsage(AU); | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 115 | } | 
|  | 116 |  | 
|  | 117 | void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const { | 
|  | 118 | RI.print(OS); | 
|  | 119 | } | 
|  | 120 |  | 
| Aaron Ballman | 615eb47 | 2017-10-15 14:32:27 +0000 | [diff] [blame] | 121 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) | 
| Yaron Keren | eb2a254 | 2016-01-29 20:50:44 +0000 | [diff] [blame] | 122 | LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const { | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 123 | RI.dump(); | 
|  | 124 | } | 
| NAKAMURA Takumi | 118b0c7 | 2014-07-20 00:00:42 +0000 | [diff] [blame] | 125 | #endif | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 126 |  | 
|  | 127 | char MachineRegionInfoPass::ID = 0; | 
| Jan Sjodin | 695e437 | 2017-04-11 11:40:55 +0000 | [diff] [blame] | 128 | char &MachineRegionInfoPassID = MachineRegionInfoPass::ID; | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 129 |  | 
| Matthias Braun | 4313059 | 2017-02-18 00:41:16 +0000 | [diff] [blame] | 130 | INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE, | 
|  | 131 | "Detect single entry single exit regions", true, true) | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 132 | INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) | 
|  | 133 | INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree) | 
|  | 134 | INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier) | 
| Matthias Braun | 4313059 | 2017-02-18 00:41:16 +0000 | [diff] [blame] | 135 | INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE, | 
|  | 136 | "Detect single entry single exit regions", true, true) | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 137 |  | 
|  | 138 | // Create methods available outside of this file, to use them | 
|  | 139 | // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by | 
|  | 140 | // the link time optimization. | 
|  | 141 |  | 
|  | 142 | namespace llvm { | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 143 |  | 
|  | 144 | FunctionPass *createMachineRegionInfoPass() { | 
|  | 145 | return new MachineRegionInfoPass(); | 
| Matt Arsenault | 1b8d837 | 2014-07-19 18:29:29 +0000 | [diff] [blame] | 146 | } | 
|  | 147 |  | 
| Eugene Zelenko | 7ea6923 | 2017-06-01 23:25:02 +0000 | [diff] [blame] | 148 | } // end namespace llvm |