mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
d52db24563
Since LoopInfo is not available in machine passes as universally as in IR passes, using the same approach for OptimizationRemarkEmitter as we did for IR will run LoopInfo and DominatorTree unnecessarily. (LoopInfo is not used lazily by ORE.) To fix this, I am modifying the approach I took in D29836. LazyMachineBFI now uses its client passes including MachineBFI itself that are available or otherwise compute them on the fly. So for example GreedyRegAlloc, since it's already using MBFI, will reuse that instance. On the other hand, AsmPrinter in Justin's patch will generate DT, LI and finally BFI on the fly. (I am of course wondering now if the simplicity of this approach is even preferable in IR. I will do some experiments.) Testing is provided by an updated version of D29837 which requires Justin's patch to bring ORE to the AsmPrinter. Differential Revision: https://reviews.llvm.org/D30128 llvm-svn: 295996
77 lines
2.8 KiB
C++
77 lines
2.8 KiB
C++
///===- LazyMachineBlockFrequencyInfo.h - Lazy Block Frequency -*- C++ -*--===//
|
|
///
|
|
/// The LLVM Compiler Infrastructure
|
|
///
|
|
/// This file is distributed under the University of Illinois Open Source
|
|
/// License. See LICENSE.TXT for details.
|
|
///
|
|
///===---------------------------------------------------------------------===//
|
|
/// \file
|
|
/// This is an alternative analysis pass to MachineBlockFrequencyInfo. The
|
|
/// difference is that with this pass the block frequencies are not computed
|
|
/// when the analysis pass is executed but rather when the BFI result is
|
|
/// explicitly requested by the analysis client.
|
|
///
|
|
///===---------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ANALYSIS_LAZYMACHINEBLOCKFREQUENCYINFO_H
|
|
#define LLVM_ANALYSIS_LAZYMACHINEBLOCKFREQUENCYINFO_H
|
|
|
|
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
|
|
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
|
|
#include "llvm/CodeGen/MachineDominators.h"
|
|
#include "llvm/CodeGen/MachineLoopInfo.h"
|
|
|
|
namespace llvm {
|
|
/// \brief This is an alternative analysis pass to MachineBlockFrequencyInfo.
|
|
/// The difference is that with this pass, the block frequencies are not
|
|
/// computed when the analysis pass is executed but rather when the BFI result
|
|
/// is explicitly requested by the analysis client.
|
|
///
|
|
/// This works by checking querying if MBFI is available and otherwise
|
|
/// generating MBFI on the fly. In this case the passes required for (LI, DT)
|
|
/// are also queried before being computed on the fly.
|
|
///
|
|
/// 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 LazyMachineBlockFrequencyInfoPass : public MachineFunctionPass {
|
|
private:
|
|
/// If generated on the fly this own the instance.
|
|
mutable std::unique_ptr<MachineBlockFrequencyInfo> OwnedMBFI;
|
|
|
|
/// If generated on the fly this own the instance.
|
|
mutable std::unique_ptr<MachineLoopInfo> OwnedMLI;
|
|
|
|
/// If generated on the fly this own the instance.
|
|
mutable std::unique_ptr<MachineDominatorTree> OwnedMDT;
|
|
|
|
/// The function.
|
|
MachineFunction *MF = nullptr;
|
|
|
|
/// \brief Calculate MBFI and all other analyses that's not available and
|
|
/// required by BFI.
|
|
MachineBlockFrequencyInfo &calculateIfNotAvailable() const;
|
|
|
|
public:
|
|
static char ID;
|
|
|
|
LazyMachineBlockFrequencyInfoPass();
|
|
|
|
/// \brief Compute and return the block frequencies.
|
|
MachineBlockFrequencyInfo &getBFI() { return calculateIfNotAvailable(); }
|
|
|
|
/// \brief Compute and return the block frequencies.
|
|
const MachineBlockFrequencyInfo &getBFI() const {
|
|
return calculateIfNotAvailable();
|
|
}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
|
|
|
bool runOnMachineFunction(MachineFunction &F) override;
|
|
void releaseMemory() override;
|
|
void print(raw_ostream &OS, const Module *M) const override;
|
|
};
|
|
}
|
|
#endif
|