brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · bcec318 Raw
136 lines · cpp
1//===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===//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//9/// \file This pass duplicates basic blocks ending in unconditional branches10/// into the tails of their predecessors, using the TailDuplicator utility11/// class.12//13//===----------------------------------------------------------------------===//14 15#include "llvm/CodeGen/TailDuplication.h"16#include "llvm/Analysis/ProfileSummaryInfo.h"17#include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"18#include "llvm/CodeGen/MBFIWrapper.h"19#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"20#include "llvm/CodeGen/MachineFunction.h"21#include "llvm/CodeGen/MachineFunctionPass.h"22#include "llvm/CodeGen/MachinePassManager.h"23#include "llvm/CodeGen/TailDuplicator.h"24#include "llvm/IR/Analysis.h"25#include "llvm/InitializePasses.h"26#include "llvm/Pass.h"27#include "llvm/PassRegistry.h"28 29using namespace llvm;30 31#define DEBUG_TYPE "tailduplication"32 33namespace {34 35class TailDuplicateBaseLegacy : public MachineFunctionPass {36  TailDuplicator Duplicator;37  std::unique_ptr<MBFIWrapper> MBFIW;38  bool PreRegAlloc;39public:40  TailDuplicateBaseLegacy(char &PassID, bool PreRegAlloc)41      : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}42 43  bool runOnMachineFunction(MachineFunction &MF) override;44 45  void getAnalysisUsage(AnalysisUsage &AU) const override {46    AU.addRequired<MachineBranchProbabilityInfoWrapperPass>();47    AU.addRequired<LazyMachineBlockFrequencyInfoPass>();48    AU.addRequired<ProfileSummaryInfoWrapperPass>();49    MachineFunctionPass::getAnalysisUsage(AU);50  }51};52 53class TailDuplicateLegacy : public TailDuplicateBaseLegacy {54public:55  static char ID;56  TailDuplicateLegacy() : TailDuplicateBaseLegacy(ID, false) {57    initializeTailDuplicateLegacyPass(*PassRegistry::getPassRegistry());58  }59};60 61class EarlyTailDuplicateLegacy : public TailDuplicateBaseLegacy {62public:63  static char ID;64  EarlyTailDuplicateLegacy() : TailDuplicateBaseLegacy(ID, true) {65    initializeEarlyTailDuplicateLegacyPass(*PassRegistry::getPassRegistry());66  }67 68  MachineFunctionProperties getClearedProperties() const override {69    return MachineFunctionProperties().setNoPHIs();70  }71};72 73} // end anonymous namespace74 75char TailDuplicateLegacy::ID;76char EarlyTailDuplicateLegacy::ID;77 78char &llvm::TailDuplicateLegacyID = TailDuplicateLegacy::ID;79char &llvm::EarlyTailDuplicateLegacyID = EarlyTailDuplicateLegacy::ID;80 81INITIALIZE_PASS(TailDuplicateLegacy, DEBUG_TYPE, "Tail Duplication", false,82                false)83INITIALIZE_PASS(EarlyTailDuplicateLegacy, "early-tailduplication",84                "Early Tail Duplication", false, false)85 86bool TailDuplicateBaseLegacy::runOnMachineFunction(MachineFunction &MF) {87  if (skipFunction(MF.getFunction()))88    return false;89 90  auto MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();91  auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();92  auto *MBFI = (PSI && PSI->hasProfileSummary()) ?93               &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI() :94               nullptr;95  if (MBFI)96    MBFIW = std::make_unique<MBFIWrapper>(*MBFI);97  Duplicator.initMF(MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get() : nullptr, PSI,98                    /*LayoutMode=*/false);99 100  bool MadeChange = false;101  while (Duplicator.tailDuplicateBlocks())102    MadeChange = true;103 104  return MadeChange;105}106 107template <typename DerivedT, bool PreRegAlloc>108PreservedAnalyses TailDuplicatePassBase<DerivedT, PreRegAlloc>::run(109    MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {110  MFPropsModifier _(static_cast<DerivedT &>(*this), MF);111 112  auto *MBPI = &MFAM.getResult<MachineBranchProbabilityAnalysis>(MF);113  auto *PSI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)114                  .getCachedResult<ProfileSummaryAnalysis>(115                      *MF.getFunction().getParent());116  auto *MBFI = (PSI && PSI->hasProfileSummary()117                    ? &MFAM.getResult<MachineBlockFrequencyAnalysis>(MF)118                    : nullptr);119  if (MBFI)120    MBFIW = std::make_unique<MBFIWrapper>(*MBFI);121 122  TailDuplicator Duplicator;123  Duplicator.initMF(MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get() : nullptr, PSI,124                    /*LayoutMode=*/false);125  bool MadeChange = false;126  while (Duplicator.tailDuplicateBlocks())127    MadeChange = true;128 129  if (!MadeChange)130    return PreservedAnalyses::all();131  return getMachineFunctionPassPreservedAnalyses();132}133 134template class llvm::TailDuplicatePassBase<TailDuplicatePass, false>;135template class llvm::TailDuplicatePassBase<EarlyTailDuplicatePass, true>;136