mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-02 08:11:54 +00:00

This allows MIR passes to emit optimization remarks with the same level of functionality that is available to IR passes. It also hooks up the greedy register allocator to report spills. This allows for interesting use cases like increasing interleaving on a loop until spilling of registers is observed. I still need to experiment whether reporting every spill scales but this demonstrates for now that the functionality works from llc using -pass-remarks*=<pass>. Differential Revision: https://reviews.llvm.org/D29004 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293110 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/MachineBlockFrequencyInfo.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<MachineBlockFrequencyInfo>();
|
|
else
|
|
MBFI = nullptr;
|
|
|
|
ORE = llvm::make_unique<MachineOptimizationRemarkEmitter>(MF, MBFI);
|
|
return false;
|
|
}
|
|
|
|
void MachineOptimizationRemarkEmitterPass::getAnalysisUsage(
|
|
AnalysisUsage &AU) const {
|
|
AU.addRequired<MachineBlockFrequencyInfo>();
|
|
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(MachineBlockFrequencyInfo)
|
|
INITIALIZE_PASS_END(MachineOptimizationRemarkEmitterPass, ORE_NAME, ore_name,
|
|
false, true)
|