LLVM  11.0.0git
TailDuplication.cpp
Go to the documentation of this file.
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file This pass duplicates basic blocks ending in unconditional branches
10 /// into the tails of their predecessors, using the TailDuplicator utility
11 /// class.
12 //
13 //===----------------------------------------------------------------------===//
14 
21 #include "llvm/CodeGen/Passes.h"
23 #include "llvm/InitializePasses.h"
24 #include "llvm/Pass.h"
25 
26 using namespace llvm;
27 
28 #define DEBUG_TYPE "tailduplication"
29 
30 namespace {
31 
32 class TailDuplicateBase : public MachineFunctionPass {
33  TailDuplicator Duplicator;
34  std::unique_ptr<MBFIWrapper> MBFIW;
35  bool PreRegAlloc;
36 public:
37  TailDuplicateBase(char &PassID, bool PreRegAlloc)
38  : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
39 
40  bool runOnMachineFunction(MachineFunction &MF) override;
41 
42  void getAnalysisUsage(AnalysisUsage &AU) const override {
47  }
48 };
49 
50 class TailDuplicate : public TailDuplicateBase {
51 public:
52  static char ID;
53  TailDuplicate() : TailDuplicateBase(ID, false) {
55  }
56 };
57 
58 class EarlyTailDuplicate : public TailDuplicateBase {
59 public:
60  static char ID;
61  EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
63  }
64 
65  MachineFunctionProperties getClearedProperties() const override {
68  }
69 };
70 
71 } // end anonymous namespace
72 
75 
78 
79 INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
80 INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
81  "Early Tail Duplication", false, false)
82 
83 bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
84  if (skipFunction(MF.getFunction()))
85  return false;
86 
87  auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
88  auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
89  auto *MBFI = (PSI && PSI->hasProfileSummary()) ?
90  &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI() :
91  nullptr;
92  if (MBFI)
93  MBFIW = std::make_unique<MBFIWrapper>(*MBFI);
94  Duplicator.initMF(MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get() : nullptr, PSI,
95  /*LayoutMode=*/false);
96 
97  bool MadeChange = false;
98  while (Duplicator.tailDuplicateBlocks())
99  MadeChange = true;
100 
101  return MadeChange;
102 }
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This class represents lattice values for constants.
Definition: AllocatorList.h:23
Tail - This calling convention attemps to make calls as fast as possible while guaranteeing that tail...
Definition: CallingConv.h:81
void initializeEarlyTailDuplicatePass(PassRegistry &)
AnalysisUsage & addRequired()
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
char & EarlyTailDuplicateID
Duplicate blocks with unconditional branches into tails of their predecessors.
===- LazyMachineBlockFrequencyInfo.h - Lazy Block Frequency -*- C++ -*–===//
INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication", "Early Tail Duplication", false, false) bool TailDuplicateBase
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
This is an alternative analysis pass to MachineBlockFrequencyInfo.
Represent the analysis usage information of a pass.
TargetPassConfig.
char & TailDuplicateID
TailDuplicate - Duplicate blocks with unconditional branches into tails of their predecessors.
#define DEBUG_TYPE
MachineFunctionProperties & set(Property P)
void initializeTailDuplicatePass(PassRegistry &)
Utility class to perform tail duplication.
Properties which a MachineFunction may have at a given point in time.