brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 6fd8464 Raw
97 lines · cpp
1///===- LazyMachineBlockFrequencyInfo.cpp - Lazy Machine Block Frequency --===//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-exception6///7///===---------------------------------------------------------------------===//8/// \file9/// This is an alternative analysis pass to MachineBlockFrequencyInfo.  The10/// difference is that with this pass the block frequencies are not computed11/// when the analysis pass is executed but rather when the BFI result is12/// explicitly requested by the analysis client.13///14///===---------------------------------------------------------------------===//15 16#include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"17#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"18#include "llvm/InitializePasses.h"19 20using namespace llvm;21 22#define DEBUG_TYPE "lazy-machine-block-freq"23 24INITIALIZE_PASS_BEGIN(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,25                      "Lazy Machine Block Frequency Analysis", true, true)26INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)27INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)28INITIALIZE_PASS_END(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,29                    "Lazy Machine Block Frequency Analysis", true, true)30 31char LazyMachineBlockFrequencyInfoPass::ID = 0;32 33LazyMachineBlockFrequencyInfoPass::LazyMachineBlockFrequencyInfoPass()34    : MachineFunctionPass(ID) {35  initializeLazyMachineBlockFrequencyInfoPassPass(36      *PassRegistry::getPassRegistry());37}38 39void LazyMachineBlockFrequencyInfoPass::getAnalysisUsage(40    AnalysisUsage &AU) const {41  AU.addRequired<MachineBranchProbabilityInfoWrapperPass>();42  AU.setPreservesAll();43  MachineFunctionPass::getAnalysisUsage(AU);44}45 46void LazyMachineBlockFrequencyInfoPass::releaseMemory() {47  OwnedMBFI.reset();48  OwnedMLI.reset();49  OwnedMDT.reset();50}51 52MachineBlockFrequencyInfo &53LazyMachineBlockFrequencyInfoPass::calculateIfNotAvailable() const {54  auto *MBFIWrapper =55      getAnalysisIfAvailable<MachineBlockFrequencyInfoWrapperPass>();56  if (MBFIWrapper) {57    LLVM_DEBUG(dbgs() << "MachineBlockFrequencyInfo is available\n");58    return MBFIWrapper->getMBFI();59  }60 61  auto &MBPI = getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();62  auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();63  auto *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;64  auto *MDTWrapper = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();65  auto *MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;66  LLVM_DEBUG(dbgs() << "Building MachineBlockFrequencyInfo on the fly\n");67  LLVM_DEBUG(if (MLI) dbgs() << "LoopInfo is available\n");68 69  if (!MLI) {70    LLVM_DEBUG(dbgs() << "Building LoopInfo on the fly\n");71    // First create a dominator tree.72    LLVM_DEBUG(if (MDT) dbgs() << "DominatorTree is available\n");73 74    if (!MDT) {75      LLVM_DEBUG(dbgs() << "Building DominatorTree on the fly\n");76      OwnedMDT = std::make_unique<MachineDominatorTree>();77      OwnedMDT->recalculate(*MF);78      MDT = OwnedMDT.get();79    }80 81    // Generate LoopInfo from it.82    OwnedMLI = std::make_unique<MachineLoopInfo>();83    OwnedMLI->analyze(*MDT);84    MLI = OwnedMLI.get();85  }86 87  OwnedMBFI = std::make_unique<MachineBlockFrequencyInfo>();88  OwnedMBFI->calculate(*MF, MBPI, *MLI);89  return *OwnedMBFI;90}91 92bool LazyMachineBlockFrequencyInfoPass::runOnMachineFunction(93    MachineFunction &F) {94  MF = &F;95  return false;96}97