mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
45f0e5261e
llvm-mca is an LLVM based performance analysis tool that can be used to statically measure the performance of code, and to help triage potential problems with target scheduling models. llvm-mca uses information which is already available in LLVM (e.g. scheduling models) to statically measure the performance of machine code in a specific cpu. Performance is measured in terms of throughput as well as processor resource consumption. The tool currently works for processors with an out-of-order backend, for which there is a scheduling model available in LLVM. The main goal of this tool is not just to predict the performance of the code when run on the target, but also help with diagnosing potential performance issues. Given an assembly code sequence, llvm-mca estimates the IPC (instructions per cycle), as well as hardware resources pressure. The analysis and reporting style were mostly inspired by the IACA tool from Intel. This patch is related to the RFC on llvm-dev visible at this link: http://lists.llvm.org/pipermail/llvm-dev/2018-March/121490.html Differential Revision: https://reviews.llvm.org/D43951 llvm-svn: 326998
63 lines
2.2 KiB
C++
63 lines
2.2 KiB
C++
//===--------------------- InstrBuilder.h -----------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
///
|
|
/// A builder class for instructions that are statically analyzed by llvm-mca.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TOOLS_LLVM_MCA_INSTRBUILDER_H
|
|
#define LLVM_TOOLS_LLVM_MCA_INSTRBUILDER_H
|
|
|
|
#include "Dispatch.h"
|
|
#include "Instruction.h"
|
|
#include "llvm/MC/MCInstrInfo.h"
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
|
|
|
namespace mca {
|
|
|
|
class DispatchUnit;
|
|
|
|
/// \brief A builder class that knows how to construct Instruction objects.
|
|
///
|
|
/// Every llvm-mca Instruction is described by an object of class InstrDesc.
|
|
/// An InstrDesc describes which registers are read/written by the instruction,
|
|
/// as well as the instruction latency and hardware resources consumed.
|
|
///
|
|
/// This class is used by the tool to construct Instructions and instruction
|
|
/// descriptors (i.e. InstrDesc objects).
|
|
/// Information from the machine scheduling model is used to identify processor
|
|
/// resources that are consumed by an instruction.
|
|
class InstrBuilder {
|
|
const llvm::MCInstrInfo &MCII;
|
|
const llvm::ArrayRef<uint64_t> ProcResourceMasks;
|
|
|
|
llvm::DenseMap<unsigned short, std::unique_ptr<const InstrDesc>> Descriptors;
|
|
llvm::DenseMap<unsigned, std::unique_ptr<Instruction>> Instructions;
|
|
|
|
void createInstrDescImpl(const llvm::MCSubtargetInfo &STI,
|
|
const llvm::MCInst &MCI);
|
|
|
|
public:
|
|
InstrBuilder(const llvm::MCInstrInfo &mcii,
|
|
const llvm::ArrayRef<uint64_t> Masks)
|
|
: MCII(mcii), ProcResourceMasks(Masks) {}
|
|
|
|
const InstrDesc &getOrCreateInstrDesc(const llvm::MCSubtargetInfo &STI,
|
|
const llvm::MCInst &MCI);
|
|
|
|
Instruction *createInstruction(const llvm::MCSubtargetInfo &STI,
|
|
DispatchUnit &DU, unsigned Idx,
|
|
const llvm::MCInst &MCI);
|
|
};
|
|
|
|
} // namespace mca
|
|
|
|
#endif
|