Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===---------------------- CustomBehaviour.h -------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
///
10
/// This file defines the base class CustomBehaviour which can be inherited from
11
/// by specific targets (ex. llvm/tools/llvm-mca/lib/X86CustomBehaviour.h).
12
/// CustomBehaviour is designed to enforce custom behaviour and dependencies
13
/// within the llvm-mca pipeline simulation that llvm-mca isn't already capable
14
/// of extracting from the Scheduling Models.
15
///
16
//===----------------------------------------------------------------------===//
17
 
18
#ifndef LLVM_MCA_CUSTOMBEHAVIOUR_H
19
#define LLVM_MCA_CUSTOMBEHAVIOUR_H
20
 
21
#include "llvm/ADT/SmallVector.h"
22
#include "llvm/MC/MCInst.h"
23
#include "llvm/MC/MCInstrInfo.h"
24
#include "llvm/MC/MCSubtargetInfo.h"
25
#include "llvm/MCA/SourceMgr.h"
26
#include "llvm/MCA/View.h"
27
 
28
namespace llvm {
29
namespace mca {
30
 
31
/// Class which can be overriden by targets to modify the
32
/// mca::Instruction objects before the pipeline starts.
33
/// A common usage of this class is to add immediate operands to certain
34
/// instructions or to remove Defs/Uses from an instruction where the
35
/// schedulinng model is incorrect.
36
class InstrPostProcess {
37
protected:
38
  const MCSubtargetInfo &STI;
39
  const MCInstrInfo &MCII;
40
 
41
public:
42
  InstrPostProcess(const MCSubtargetInfo &STI, const MCInstrInfo &MCII)
43
      : STI(STI), MCII(MCII) {}
44
 
45
  virtual ~InstrPostProcess() = default;
46
 
47
  /// This method can be overriden by targets to modify the mca::Instruction
48
  /// object after it has been lowered from the MCInst.
49
  /// This is generally a less disruptive alternative to modifying the
50
  /// scheduling model.
51
  virtual void postProcessInstruction(std::unique_ptr<Instruction> &Inst,
52
                                      const MCInst &MCI) {}
53
 
54
  // The resetState() method gets invoked at the beginning of each code region
55
  // so that targets that override this function can clear any state that they
56
  // have left from the previous code region.
57
  virtual void resetState() {}
58
};
59
 
60
/// Class which can be overriden by targets to enforce instruction
61
/// dependencies and behaviours that aren't expressed well enough
62
/// within the scheduling model for mca to automatically simulate
63
/// them properly.
64
/// If you implement this class for your target, make sure to also implement
65
/// a target specific InstrPostProcess class as well.
66
class CustomBehaviour {
67
protected:
68
  const MCSubtargetInfo &STI;
69
  const mca::SourceMgr &SrcMgr;
70
  const MCInstrInfo &MCII;
71
 
72
public:
73
  CustomBehaviour(const MCSubtargetInfo &STI, const mca::SourceMgr &SrcMgr,
74
                  const MCInstrInfo &MCII)
75
      : STI(STI), SrcMgr(SrcMgr), MCII(MCII) {}
76
 
77
  virtual ~CustomBehaviour();
78
 
79
  /// Before the llvm-mca pipeline dispatches an instruction, it first checks
80
  /// for any register or resource dependencies / hazards. If it doesn't find
81
  /// any, this method will be invoked to determine if there are any custom
82
  /// hazards that the instruction needs to wait for.
83
  /// The return value of this method is the number of cycles that the
84
  /// instruction needs to wait for.
85
  /// It's safe to underestimate the number of cycles to wait for since these
86
  /// checks will be invoked again before the intruction gets dispatched.
87
  /// However, it's not safe (accurate) to overestimate the number of cycles
88
  /// to wait for since the instruction will wait for AT LEAST that number of
89
  /// cycles before attempting to be dispatched again.
90
  virtual unsigned checkCustomHazard(ArrayRef<InstRef> IssuedInst,
91
                                     const InstRef &IR);
92
 
93
  // Functions that target CBs can override to return a list of
94
  // target specific Views that need to live within /lib/Target/ so that
95
  // they can benefit from the target CB or from backend functionality that is
96
  // not already exposed through MC-layer classes. Keep in mind that how this
97
  // function is used is that the function is called within llvm-mca.cpp and
98
  // then each unique_ptr<View> is passed into the PipelinePrinter::addView()
99
  // function. This function will then std::move the View into its own vector of
100
  // Views. So any CB that overrides this function needs to make sure that they
101
  // are not relying on the current address or reference of the View
102
  // unique_ptrs. If you do need the CB and View to be able to communicate with
103
  // each other, consider giving the View a reference or pointer to the CB when
104
  // the View is constructed. Then the View can query the CB for information
105
  // when it needs it.
106
  /// Return a vector of Views that will be added before all other Views.
107
  virtual std::vector<std::unique_ptr<View>>
108
  getStartViews(llvm::MCInstPrinter &IP, llvm::ArrayRef<llvm::MCInst> Insts);
109
  /// Return a vector of Views that will be added after the InstructionInfoView.
110
  virtual std::vector<std::unique_ptr<View>>
111
  getPostInstrInfoViews(llvm::MCInstPrinter &IP,
112
                        llvm::ArrayRef<llvm::MCInst> Insts);
113
  /// Return a vector of Views that will be added after all other Views.
114
  virtual std::vector<std::unique_ptr<View>>
115
  getEndViews(llvm::MCInstPrinter &IP, llvm::ArrayRef<llvm::MCInst> Insts);
116
};
117
 
118
class Instrument {
119
  /// The description of Instrument kind
120
  const StringRef Desc;
121
 
122
  /// The instrumentation data
123
  const StringRef Data;
124
 
125
public:
126
  Instrument(StringRef Desc, StringRef Data) : Desc(Desc), Data(Data) {}
127
 
128
  Instrument() : Instrument("", "") {}
129
 
130
  virtual ~Instrument() = default;
131
 
132
  StringRef getDesc() const { return Desc; }
133
  StringRef getData() const { return Data; }
134
};
135
 
136
using SharedInstrument = std::shared_ptr<Instrument>;
137
 
138
/// This class allows targets to optionally customize the logic that resolves
139
/// scheduling class IDs. Targets can use information encoded in Instrument
140
/// objects to make more informed scheduling decisions.
141
class InstrumentManager {
142
protected:
143
  const MCSubtargetInfo &STI;
144
  const MCInstrInfo &MCII;
145
 
146
public:
147
  InstrumentManager(const MCSubtargetInfo &STI, const MCInstrInfo &MCII)
148
      : STI(STI), MCII(MCII) {}
149
 
150
  virtual ~InstrumentManager() = default;
151
 
152
  /// Returns true if llvm-mca should ignore instruments.
153
  virtual bool shouldIgnoreInstruments() const { return true; }
154
 
155
  // Returns true if this supports processing Instrument with
156
  // Instrument.Desc equal to Type
157
  virtual bool supportsInstrumentType(StringRef Type) const { return false; }
158
 
159
  /// Allocate an Instrument, and return a shared pointer to it.
160
  virtual SharedInstrument createInstrument(StringRef Desc, StringRef Data);
161
 
162
  /// Given an MCInst and a vector of Instrument, a target can
163
  /// return a SchedClassID. This can be used by a subtarget to return a
164
  /// PseudoInstruction SchedClassID instead of the one that belongs to the
165
  /// BaseInstruction This can be useful when a BaseInstruction does not convey
166
  /// the correct scheduling information without additional data. By default,
167
  /// it returns the SchedClassID that belongs to MCI.
168
  virtual unsigned
169
  getSchedClassID(const MCInstrInfo &MCII, const MCInst &MCI,
170
                  const SmallVector<SharedInstrument> &IVec) const;
171
};
172
 
173
} // namespace mca
174
} // namespace llvm
175
 
176
#endif /* LLVM_MCA_CUSTOMBEHAVIOUR_H */