mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
337f461009
And use it in MachineOptimizationRemarkEmitter. A test will follow on top of Justin's changes to enable MachineORE in AsmPrinter. The approach is similar to the IR-level pass. It's a bit simpler because BPI is immutable at the Machine level so we don't need to make that lazy. Because of this, a new function mapping is introduced (BPIPassTrait::getBPI). This function extracts BPI from the pass. In case of the lazy pass, this is when the calculation of the BFI occurs. For Machine-level, this is the identity function. Differential Revision: https://reviews.llvm.org/D29836 llvm-svn: 295072
122 lines
4.1 KiB
C++
122 lines
4.1 KiB
C++
//===- LazyBranchProbabilityInfo.h - Lazy Branch Probability ----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This is an alternative analysis pass to BranchProbabilityInfoWrapperPass.
|
|
// The difference is that with this pass the branch probabilities are not
|
|
// computed when the analysis pass is executed but rather when the BPI results
|
|
// is explicitly requested by the analysis client.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ANALYSIS_LAZYBRANCHPROBABILITYINFO_H
|
|
#define LLVM_ANALYSIS_LAZYBRANCHPROBABILITYINFO_H
|
|
|
|
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
|
#include "llvm/Pass.h"
|
|
|
|
namespace llvm {
|
|
class AnalysisUsage;
|
|
class Function;
|
|
class LoopInfo;
|
|
|
|
/// \brief This is an alternative analysis pass to
|
|
/// BranchProbabilityInfoWrapperPass. The difference is that with this pass the
|
|
/// branch probabilities are not computed when the analysis pass is executed but
|
|
/// rather when the BPI results is explicitly requested by the analysis client.
|
|
///
|
|
/// There are some additional requirements for any client pass that wants to use
|
|
/// the analysis:
|
|
///
|
|
/// 1. The pass needs to initialize dependent passes with:
|
|
///
|
|
/// INITIALIZE_PASS_DEPENDENCY(LazyBPIPass)
|
|
///
|
|
/// 2. Similarly, getAnalysisUsage should call:
|
|
///
|
|
/// LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU)
|
|
///
|
|
/// 3. The computed BPI should be requested with
|
|
/// getAnalysis<LazyBranchProbabilityInfoPass>().getBPI() before LoopInfo
|
|
/// could be invalidated for example by changing the CFG.
|
|
///
|
|
/// Note that it is expected that we wouldn't need this functionality for the
|
|
/// new PM since with the new PM, analyses are executed on demand.
|
|
class LazyBranchProbabilityInfoPass : public FunctionPass {
|
|
|
|
/// Wraps a BPI to allow lazy computation of the branch probabilities.
|
|
///
|
|
/// A pass that only conditionally uses BPI can uncondtionally require the
|
|
/// analysis without paying for the overhead if BPI doesn't end up being used.
|
|
class LazyBranchProbabilityInfo {
|
|
public:
|
|
LazyBranchProbabilityInfo(const Function *F, const LoopInfo *LI)
|
|
: Calculated(false), F(F), LI(LI) {}
|
|
|
|
/// Retrieve the BPI with the branch probabilities computed.
|
|
BranchProbabilityInfo &getCalculated() {
|
|
if (!Calculated) {
|
|
assert(F && LI && "call setAnalysis");
|
|
BPI.calculate(*F, *LI);
|
|
Calculated = true;
|
|
}
|
|
return BPI;
|
|
}
|
|
|
|
const BranchProbabilityInfo &getCalculated() const {
|
|
return const_cast<LazyBranchProbabilityInfo *>(this)->getCalculated();
|
|
}
|
|
|
|
private:
|
|
BranchProbabilityInfo BPI;
|
|
bool Calculated;
|
|
const Function *F;
|
|
const LoopInfo *LI;
|
|
};
|
|
|
|
std::unique_ptr<LazyBranchProbabilityInfo> LBPI;
|
|
|
|
public:
|
|
static char ID;
|
|
|
|
LazyBranchProbabilityInfoPass();
|
|
|
|
/// \brief Compute and return the branch probabilities.
|
|
BranchProbabilityInfo &getBPI() { return LBPI->getCalculated(); }
|
|
|
|
/// \brief Compute and return the branch probabilities.
|
|
const BranchProbabilityInfo &getBPI() const { return LBPI->getCalculated(); }
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
|
|
|
/// Helper for client passes to set up the analysis usage on behalf of this
|
|
/// pass.
|
|
static void getLazyBPIAnalysisUsage(AnalysisUsage &AU);
|
|
|
|
bool runOnFunction(Function &F) override;
|
|
void releaseMemory() override;
|
|
void print(raw_ostream &OS, const Module *M) const override;
|
|
};
|
|
|
|
/// \brief Helper for client passes to initialize dependent passes for LBPI.
|
|
void initializeLazyBPIPassPass(PassRegistry &Registry);
|
|
|
|
/// \brief Simple trait class that provides a mapping between BPI passes and the
|
|
/// corresponding BPInfo.
|
|
template <typename PassT> struct BPIPassTrait {
|
|
static PassT &getBPI(PassT *P) { return *P; }
|
|
};
|
|
|
|
template <> struct BPIPassTrait<LazyBranchProbabilityInfoPass> {
|
|
static BranchProbabilityInfo &getBPI(LazyBranchProbabilityInfoPass *P) {
|
|
return P->getBPI();
|
|
}
|
|
};
|
|
}
|
|
#endif
|