xref: /llvm-project/llvm/tools/llvm-mca/Views/RegisterFileStatistics.h (revision fe01014faa336d25543561fc65201dea7f424347)
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