diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp | 100 | 
1 files changed, 100 insertions, 0 deletions
diff --git a/contrib/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp b/contrib/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp new file mode 100644 index 000000000000..6b6b5f2814a9 --- /dev/null +++ b/contrib/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp @@ -0,0 +1,100 @@ +///===- 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/CodeGen/MachineInstr.h" +#include "llvm/IR/DebugInfo.h" +#include "llvm/IR/DiagnosticInfo.h" +#include "llvm/IR/LLVMContext.h" + +using namespace llvm; + +DiagnosticInfoMIROptimization::MachineArgument::MachineArgument( +    StringRef MKey, const MachineInstr &MI) +    : Argument() { +  Key = MKey; + +  raw_string_ostream OS(Val); +  MI.print(OS, /*SkipOpers=*/false, /*SkipDebugLoc=*/true); +} + +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)  | 
