mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-08 16:31:55 +00:00

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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295996 91177308-0d34-0410-b5e6-96231b3b80d8
91 lines
3.1 KiB
C++
91 lines
3.1 KiB
C++
///===- MachineOptimizationRemarkEmitter.cpp - Opt Diagnostic -*- C++ -*---===//
|
|
///
|
|
/// The LLVM Compiler Infrastructure
|
|
///
|
|
/// This file is distributed under the University of Illinois Open Source
|
|
/// License. See LICENSE.TXT for details.
|
|
///
|
|
///===---------------------------------------------------------------------===//
|
|
/// \file
|
|
/// Optimization diagnostic interfaces for machine passes. It's packaged as an
|
|
/// analysis pass so that by using this service passes become dependent on MBFI
|
|
/// as well. MBFI is used to compute the "hotness" of the diagnostic message.
|
|
///
|
|
///===---------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
|
|
#include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
|
|
#include "llvm/IR/DebugInfo.h"
|
|
#include "llvm/IR/DiagnosticInfo.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
|
|
using namespace llvm;
|
|
|
|
Optional<uint64_t>
|
|
MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) {
|
|
if (!MBFI)
|
|
return None;
|
|
|
|
return MBFI->getBlockProfileCount(&MBB);
|
|
}
|
|
|
|
void MachineOptimizationRemarkEmitter::computeHotness(
|
|
DiagnosticInfoMIROptimization &Remark) {
|
|
const MachineBasicBlock *MBB = Remark.getBlock();
|
|
if (MBB)
|
|
Remark.setHotness(computeHotness(*MBB));
|
|
}
|
|
|
|
void MachineOptimizationRemarkEmitter::emit(
|
|
DiagnosticInfoOptimizationBase &OptDiagCommon) {
|
|
auto &OptDiag = cast<DiagnosticInfoMIROptimization>(OptDiagCommon);
|
|
computeHotness(OptDiag);
|
|
|
|
LLVMContext &Ctx = MF.getFunction()->getContext();
|
|
yaml::Output *Out = Ctx.getDiagnosticsOutputFile();
|
|
if (Out) {
|
|
auto *P = &const_cast<DiagnosticInfoOptimizationBase &>(OptDiagCommon);
|
|
*Out << P;
|
|
}
|
|
// FIXME: now that IsVerbose is part of DI, filtering for this will be moved
|
|
// from here to clang.
|
|
if (!OptDiag.isVerbose() || shouldEmitVerbose())
|
|
Ctx.diagnose(OptDiag);
|
|
}
|
|
|
|
MachineOptimizationRemarkEmitterPass::MachineOptimizationRemarkEmitterPass()
|
|
: MachineFunctionPass(ID) {
|
|
initializeMachineOptimizationRemarkEmitterPassPass(
|
|
*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
bool MachineOptimizationRemarkEmitterPass::runOnMachineFunction(
|
|
MachineFunction &MF) {
|
|
MachineBlockFrequencyInfo *MBFI;
|
|
|
|
if (MF.getFunction()->getContext().getDiagnosticHotnessRequested())
|
|
MBFI = &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI();
|
|
else
|
|
MBFI = nullptr;
|
|
|
|
ORE = llvm::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI);
|
|
return false;
|
|
}
|
|
|
|
void MachineOptimizationRemarkEmitterPass::getAnalysisUsage(
|
|
AnalysisUsage &AU) const {
|
|
AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
|
|
AU.setPreservesAll();
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
|
|
char MachineOptimizationRemarkEmitterPass::ID = 0;
|
|
static const char ore_name[] = "Machine Optimization Remark Emitter";
|
|
#define ORE_NAME "machine-opt-remark-emitter"
|
|
|
|
INITIALIZE_PASS_BEGIN(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
|
|
false, true)
|
|
INITIALIZE_PASS_DEPENDENCY(LazyMachineBlockFrequencyInfoPass)
|
|
INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
|
|
false, true)
|