110aa09f0SMatt Davis //===--------------------- RegisterFileStatistics.h -------------*- C++ -*-===// 210aa09f0SMatt Davis // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 610aa09f0SMatt Davis // 710aa09f0SMatt Davis //===----------------------------------------------------------------------===// 810aa09f0SMatt Davis /// \file 910aa09f0SMatt Davis /// 1010aa09f0SMatt Davis /// This view collects and prints register file usage statistics. 1110aa09f0SMatt Davis /// 1210aa09f0SMatt Davis /// Example (-mcpu=btver2): 1310aa09f0SMatt Davis /// ======================== 1410aa09f0SMatt Davis /// 1510aa09f0SMatt Davis /// Register File statistics: 1610aa09f0SMatt Davis /// Total number of mappings created: 6 1710aa09f0SMatt Davis /// Max number of mappings used: 3 1810aa09f0SMatt Davis /// 1910aa09f0SMatt Davis /// * Register File #1 -- FpuPRF: 2010aa09f0SMatt Davis /// Number of physical registers: 72 2110aa09f0SMatt Davis /// Total number of mappings created: 0 2210aa09f0SMatt Davis /// Max number of mappings used: 0 23fe3bc1b9SAndrea Di Biagio /// Number of optimizable moves: 200 24fe3bc1b9SAndrea Di Biagio /// Number of moves eliminated: 200 (100.0%) 25fe3bc1b9SAndrea Di Biagio /// Number of zero moves: 200 (100.0%) 26fe3bc1b9SAndrea Di Biagio /// Max moves eliminated per cycle: 2 2710aa09f0SMatt Davis /// 2810aa09f0SMatt Davis /// * Register File #2 -- IntegerPRF: 2910aa09f0SMatt Davis /// Number of physical registers: 64 3010aa09f0SMatt Davis /// Total number of mappings created: 6 3110aa09f0SMatt Davis /// Max number of mappings used: 3 3210aa09f0SMatt Davis // 3310aa09f0SMatt Davis //===----------------------------------------------------------------------===// 3410aa09f0SMatt Davis 3510aa09f0SMatt Davis #ifndef LLVM_TOOLS_LLVM_MCA_REGISTERFILESTATISTICS_H 3610aa09f0SMatt Davis #define LLVM_TOOLS_LLVM_MCA_REGISTERFILESTATISTICS_H 3710aa09f0SMatt Davis 3810aa09f0SMatt Davis #include "llvm/ADT/SmallVector.h" 3910aa09f0SMatt Davis #include "llvm/MC/MCSubtargetInfo.h" 40*fe01014fSPatrick Holland #include "llvm/MCA/View.h" 4110aa09f0SMatt Davis 425a8fd657SFangrui Song namespace llvm { 4310aa09f0SMatt Davis namespace mca { 4410aa09f0SMatt Davis 4510aa09f0SMatt Davis class RegisterFileStatistics : public View { 4610aa09f0SMatt Davis const llvm::MCSubtargetInfo &STI; 4710aa09f0SMatt Davis 4810aa09f0SMatt Davis // Used to track the number of physical registers used in a register file. 4910aa09f0SMatt Davis struct RegisterFileUsage { 5010aa09f0SMatt Davis unsigned TotalMappings; 5110aa09f0SMatt Davis unsigned MaxUsedMappings; 5210aa09f0SMatt Davis unsigned CurrentlyUsedMappings; 5310aa09f0SMatt Davis }; 5410aa09f0SMatt Davis 55fe3bc1b9SAndrea Di Biagio struct MoveEliminationInfo { 56fe3bc1b9SAndrea Di Biagio unsigned TotalMoveEliminationCandidates; 57fe3bc1b9SAndrea Di Biagio unsigned TotalMovesEliminated; 58fe3bc1b9SAndrea Di Biagio unsigned TotalMovesThatPropagateZero; 59fe3bc1b9SAndrea Di Biagio unsigned MaxMovesEliminatedPerCycle; 60fe3bc1b9SAndrea Di Biagio unsigned CurrentMovesEliminated; 61fe3bc1b9SAndrea Di Biagio }; 62fe3bc1b9SAndrea Di Biagio 6310aa09f0SMatt Davis // There is one entry for each register file implemented by the processor. 64fe3bc1b9SAndrea Di Biagio llvm::SmallVector<RegisterFileUsage, 4> PRFUsage; 65fe3bc1b9SAndrea Di Biagio llvm::SmallVector<MoveEliminationInfo, 4> MoveElimInfo; 66fe3bc1b9SAndrea Di Biagio 67fe3bc1b9SAndrea Di Biagio void updateRegisterFileUsage(ArrayRef<unsigned> UsedPhysRegs); 68fe3bc1b9SAndrea Di Biagio void updateMoveElimInfo(const Instruction &Inst); 6910aa09f0SMatt Davis 7010aa09f0SMatt Davis public: 71b7f120f0SAndrea Di Biagio RegisterFileStatistics(const llvm::MCSubtargetInfo &sti); 7210aa09f0SMatt Davis 73fe3bc1b9SAndrea Di Biagio void onCycleEnd() override; 7410aa09f0SMatt Davis void onEvent(const HWInstructionEvent &Event) override; 7510aa09f0SMatt Davis void printView(llvm::raw_ostream &OS) const override; getNameAsString()76d38be2baSWolfgang Pieb StringRef getNameAsString() const override { 77d38be2baSWolfgang Pieb return "RegisterFileStatistics"; 78d38be2baSWolfgang Pieb } isSerializable()79aa13e4feSMarcos Horro bool isSerializable() const override { return false; } 8010aa09f0SMatt Davis }; 8110aa09f0SMatt Davis } // namespace mca 825a8fd657SFangrui Song } // namespace llvm 8310aa09f0SMatt Davis 8410aa09f0SMatt Davis #endif 85