diff --git a/llvm/test/tools/llvm-mca/RISCV/different-instruments.s b/llvm/test/tools/llvm-mca/RISCV/different-instruments.s --- a/llvm/test/tools/llvm-mca/RISCV/different-instruments.s +++ b/llvm/test/tools/llvm-mca/RISCV/different-instruments.s @@ -28,7 +28,7 @@ # CHECK: [1] [2] [3] [4] [5] [6] Instructions: # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m1, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vadd.vv v12, v12, v12 # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m8, tu, mu # CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 diff --git a/llvm/test/tools/llvm-mca/RISCV/instrument-at-start.s b/llvm/test/tools/llvm-mca/RISCV/instrument-at-start.s --- a/llvm/test/tools/llvm-mca/RISCV/instrument-at-start.s +++ b/llvm/test/tools/llvm-mca/RISCV/instrument-at-start.s @@ -25,7 +25,7 @@ # CHECK: [1] [2] [3] [4] [5] [6] Instructions: # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m1, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vadd.vv v12, v12, v12 # CHECK: Resources: # CHECK-NEXT: [0] - SiFive7FDiv diff --git a/llvm/test/tools/llvm-mca/RISCV/instrument-in-middle.s b/llvm/test/tools/llvm-mca/RISCV/instrument-in-middle.s --- a/llvm/test/tools/llvm-mca/RISCV/instrument-in-middle.s +++ b/llvm/test/tools/llvm-mca/RISCV/instrument-in-middle.s @@ -27,7 +27,7 @@ # CHECK: [1] [2] [3] [4] [5] [6] Instructions: # CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m8, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 1.00 vadd.vv v12, v12, v12 # CHECK: Resources: # CHECK-NEXT: [0] - SiFive7FDiv diff --git a/llvm/test/tools/llvm-mca/RISCV/instrument-in-region.s b/llvm/test/tools/llvm-mca/RISCV/instrument-in-region.s --- a/llvm/test/tools/llvm-mca/RISCV/instrument-in-region.s +++ b/llvm/test/tools/llvm-mca/RISCV/instrument-in-region.s @@ -29,7 +29,7 @@ # CHECK: [1] [2] [3] [4] [5] [6] Instructions: # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m1, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vadd.vv v12, v12, v12 # CHECK: Resources: # CHECK-NEXT: [0] - SiFive7FDiv diff --git a/llvm/test/tools/llvm-mca/RISCV/instrument-straddles-region.s b/llvm/test/tools/llvm-mca/RISCV/instrument-straddles-region.s --- a/llvm/test/tools/llvm-mca/RISCV/instrument-straddles-region.s +++ b/llvm/test/tools/llvm-mca/RISCV/instrument-straddles-region.s @@ -30,7 +30,7 @@ # CHECK: [1] [2] [3] [4] [5] [6] Instructions: # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m1, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vadd.vv v12, v12, v12 # CHECK: Resources: # CHECK-NEXT: [0] - SiFive7FDiv diff --git a/llvm/test/tools/llvm-mca/RISCV/multiple-same-instruments.s b/llvm/test/tools/llvm-mca/RISCV/multiple-same-instruments.s --- a/llvm/test/tools/llvm-mca/RISCV/multiple-same-instruments.s +++ b/llvm/test/tools/llvm-mca/RISCV/multiple-same-instruments.s @@ -33,13 +33,13 @@ # CHECK: [1] [2] [3] [4] [5] [6] Instructions: # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m1, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vadd.vv v12, v12, v12 # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m1, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 -# CHECK-NEXT: 1 4 16.00 vsub.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 2.00 vsub.vv v12, v12, v12 # CHECK-NEXT: 1 3 1.00 U vsetvli zero, a0, e8, m2, tu, mu -# CHECK-NEXT: 1 4 16.00 vadd.vv v12, v12, v12 -# CHECK-NEXT: 1 4 16.00 vsub.vv v12, v12, v12 +# CHECK-NEXT: 1 4 8.00 vadd.vv v12, v12, v12 +# CHECK-NEXT: 1 4 8.00 vsub.vv v12, v12, v12 # CHECK: Resources: # CHECK-NEXT: [0] - SiFive7FDiv diff --git a/llvm/tools/llvm-mca/Views/InstructionInfoView.h b/llvm/tools/llvm-mca/Views/InstructionInfoView.h --- a/llvm/tools/llvm-mca/Views/InstructionInfoView.h +++ b/llvm/tools/llvm-mca/Views/InstructionInfoView.h @@ -42,6 +42,7 @@ #include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MCA/CodeEmitter.h" +#include "llvm/MCA/CustomBehaviour.h" #include "llvm/Support/raw_ostream.h" #define DEBUG_TYPE "llvm-mca" @@ -57,6 +58,10 @@ bool PrintBarriers; using UniqueInst = std::unique_ptr; ArrayRef LoweredInsts; + const InstrumentManager &IM; + using InstToInstrumentsT = + DenseMap>; + const InstToInstrumentsT &InstToInstruments; struct InstructionInfoViewData { unsigned NumMicroOpcodes = 0; @@ -77,10 +82,12 @@ bool ShouldPrintEncodings, llvm::ArrayRef S, llvm::MCInstPrinter &IP, ArrayRef LoweredInsts, - bool ShouldPrintBarriers) + bool ShouldPrintBarriers, const InstrumentManager &IM, + const InstToInstrumentsT &InstToInstruments) : InstructionView(ST, IP, S), MCII(II), CE(C), PrintEncodings(ShouldPrintEncodings), - PrintBarriers(ShouldPrintBarriers), LoweredInsts(LoweredInsts) {} + PrintBarriers(ShouldPrintBarriers), LoweredInsts(LoweredInsts), IM(IM), + InstToInstruments(InstToInstruments) {} void printView(llvm::raw_ostream &OS) const override; StringRef getNameAsString() const override { return "InstructionInfoView"; } diff --git a/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp b/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp --- a/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp +++ b/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp @@ -117,8 +117,13 @@ InstructionInfoViewData &IIVDEntry = std::get<1>(I); const MCInstrDesc &MCDesc = MCII.get(Inst.getOpcode()); - // Obtain the scheduling class information from the instruction. - unsigned SchedClassID = MCDesc.getSchedClass(); + // Obtain the scheduling class information from the instruction + // and instruments. + auto IVecIt = InstToInstruments.find(&Inst); + unsigned SchedClassID = + IVecIt == InstToInstruments.end() + ? MCDesc.getSchedClass() + : IM.getSchedClassID(MCII, Inst, IVecIt->second); unsigned CPUID = SM.getProcessorID(); // Try to solve variant scheduling classes. diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -571,11 +571,14 @@ IPP->resetState(); + DenseMap> + InstToInstruments; SmallVector> LoweredSequence; for (const MCInst &MCI : Insts) { SMLoc Loc = MCI.getLoc(); const SmallVector Instruments = InstrumentRegions.getActiveInstruments(Loc); + InstToInstruments.insert({&MCI, Instruments}); Expected> Inst = IB.createInstruction(MCI, Instruments); @@ -621,7 +624,7 @@ if (PrintInstructionInfoView) { Printer.addView(std::make_unique( *STI, *MCII, CE, ShowEncoding, Insts, *IP, LoweredSequence, - ShowBarriers)); + ShowBarriers, *IM, InstToInstruments)); } Printer.addView( std::make_unique(*STI, *IP, Insts)); @@ -698,7 +701,7 @@ if (PrintInstructionInfoView) Printer.addView(std::make_unique( *STI, *MCII, CE, ShowEncoding, Insts, *IP, LoweredSequence, - ShowBarriers)); + ShowBarriers, *IM, InstToInstruments)); // Fetch custom Views that are to be placed after the InstructionInfoView. // Refer to the comment paired with the CB->getStartViews(*IP, Insts); line