Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- TargetInstrPredicate.td - ---------------------------*- tablegen -*-===// |
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 | // |
||
9 | // This file defines class MCInstPredicate and its subclasses. |
||
10 | // |
||
11 | // MCInstPredicate definitions are used by target scheduling models to describe |
||
12 | // constraints on instructions. |
||
13 | // |
||
14 | // Here is an example of an MCInstPredicate definition in TableGen: |
||
15 | // |
||
16 | // def MCInstPredicateExample : CheckAll<[ |
||
17 | // CheckOpcode<[BLR]>, |
||
18 | // CheckIsRegOperand<0>, |
||
19 | // CheckNot<CheckRegOperand<0, LR>>]>; |
||
20 | // |
||
21 | // The syntax for MCInstPredicate is declarative, and predicate definitions can |
||
22 | // be composed together in order to generate more complex constraints. |
||
23 | // |
||
24 | // The `CheckAll` from the example defines a composition of three different |
||
25 | // predicates. Definition `MCInstPredicateExample` identifies instructions |
||
26 | // whose opcode is BLR, and whose first operand is a register different from |
||
27 | // register `LR`. |
||
28 | // |
||
29 | // Every MCInstPredicate class has a well-known semantic in tablegen. For |
||
30 | // example, `CheckOpcode` is a special type of predicate used to describe a |
||
31 | // constraint on the value of an instruction opcode. |
||
32 | // |
||
33 | // MCInstPredicate definitions are typically used by scheduling models to |
||
34 | // construct MCSchedPredicate definitions (see the definition of class |
||
35 | // MCSchedPredicate in llvm/Target/TargetSchedule.td). |
||
36 | // In particular, an MCSchedPredicate can be used instead of a SchedPredicate |
||
37 | // when defining the set of SchedReadVariant and SchedWriteVariant of a |
||
38 | // processor scheduling model. |
||
39 | // |
||
40 | // The `MCInstPredicateExample` definition above is equivalent (and therefore |
||
41 | // could replace) the following definition from a previous ExynosM3 model (see |
||
42 | // AArch64SchedExynosM3.td): |
||
43 | // |
||
44 | // def M3BranchLinkFastPred : SchedPredicate<[{ |
||
45 | // MI->getOpcode() == AArch64::BLR && |
||
46 | // MI->getOperand(0).isReg() && |
||
47 | // MI->getOperand(0).getReg() != AArch64::LR}]>; |
||
48 | // |
||
49 | // The main advantage of using MCInstPredicate instead of SchedPredicate is |
||
50 | // portability: users don't need to specify predicates in C++. As a consequence |
||
51 | // of this, MCInstPredicate definitions are not bound to a particular |
||
52 | // representation (i.e. MachineInstr vs MCInst). |
||
53 | // |
||
54 | // Tablegen backends know how to expand MCInstPredicate definitions into actual |
||
55 | // C++ code that works on MachineInstr (and/or MCInst). |
||
56 | // |
||
57 | // Instances of class PredicateExpander (see utils/Tablegen/PredicateExpander.h) |
||
58 | // know how to expand a predicate. For each MCInstPredicate class, there must be |
||
59 | // an "expand" method available in the PredicateExpander interface. |
||
60 | // |
||
61 | // For example, a `CheckOpcode` predicate is expanded using method |
||
62 | // `PredicateExpander::expandCheckOpcode()`. |
||
63 | // |
||
64 | // New MCInstPredicate classes must be added to this file. For each new class |
||
65 | // XYZ, an "expandXYZ" method must be added to the PredicateExpander. |
||
66 | // |
||
67 | //===----------------------------------------------------------------------===// |
||
68 | |||
69 | // Forward declarations. |
||
70 | class Instruction; |
||
71 | class SchedMachineModel; |
||
72 | |||
73 | // A generic machine instruction predicate. |
||
74 | class MCInstPredicate; |
||
75 | |||
76 | class MCTrue : MCInstPredicate; // A predicate that always evaluates to True. |
||
77 | class MCFalse : MCInstPredicate; // A predicate that always evaluates to False. |
||
78 | def TruePred : MCTrue; |
||
79 | def FalsePred : MCFalse; |
||
80 | |||
81 | // A predicate used to negate the outcome of another predicate. |
||
82 | // It allows to easily express "set difference" operations. For example, it |
||
83 | // makes it easy to describe a check that tests if an opcode is not part of a |
||
84 | // set of opcodes. |
||
85 | class CheckNot<MCInstPredicate P> : MCInstPredicate { |
||
86 | MCInstPredicate Pred = P; |
||
87 | } |
||
88 | |||
89 | // This class is used as a building block to define predicates on instruction |
||
90 | // operands. It is used to reference a specific machine operand. |
||
91 | class MCOperandPredicate<int Index> : MCInstPredicate { |
||
92 | int OpIndex = Index; |
||
93 | } |
||
94 | |||
95 | // Return true if machine operand at position `Index` is a register operand. |
||
96 | class CheckIsRegOperand<int Index> : MCOperandPredicate<Index>; |
||
97 | |||
98 | // Return true if machine operand at position `Index` is an immediate operand. |
||
99 | class CheckIsImmOperand<int Index> : MCOperandPredicate<Index>; |
||
100 | |||
101 | // Check if machine operands at index `First` and index `Second` both reference |
||
102 | // the same register. |
||
103 | class CheckSameRegOperand<int First, int Second> : MCInstPredicate { |
||
104 | int FirstIndex = First; |
||
105 | int SecondIndex = Second; |
||
106 | } |
||
107 | |||
108 | // Base class for checks on register/immediate operands. |
||
109 | // It allows users to define checks like: |
||
110 | // MyFunction(MI->getOperand(Index).getImm()) == Val; |
||
111 | // |
||
112 | // In the example above, `MyFunction` is a function that takes as input an |
||
113 | // immediate operand value, and returns another value. Field `FunctionMapper` is |
||
114 | // the name of the function to call on the operand value. |
||
115 | class CheckOperandBase<int Index, string Fn = ""> : MCOperandPredicate<Index> { |
||
116 | string FunctionMapper = Fn; |
||
117 | } |
||
118 | |||
119 | // Check that the machine register operand at position `Index` references |
||
120 | // register R. This predicate assumes that we already checked that the machine |
||
121 | // operand at position `Index` is a register operand. |
||
122 | class CheckRegOperand<int Index, Register R> : CheckOperandBase<Index> { |
||
123 | Register Reg = R; |
||
124 | } |
||
125 | |||
126 | // Check if register operand at index `Index` is the invalid register. |
||
127 | class CheckInvalidRegOperand<int Index> : CheckOperandBase<Index>; |
||
128 | |||
129 | // Return true if machine operand at position `Index` is a valid |
||
130 | // register operand. |
||
131 | class CheckValidRegOperand<int Index> : |
||
132 | CheckNot<CheckInvalidRegOperand<Index>>; |
||
133 | |||
134 | // Check that the operand at position `Index` is immediate `Imm`. |
||
135 | // If field `FunctionMapper` is a non-empty string, then function |
||
136 | // `FunctionMapper` is applied to the operand value, and the return value is then |
||
137 | // compared against `Imm`. |
||
138 | class CheckImmOperand<int Index, int Imm> : CheckOperandBase<Index> { |
||
139 | int ImmVal = Imm; |
||
140 | } |
||
141 | |||
142 | // Similar to CheckImmOperand, however the immediate is not a literal number. |
||
143 | // This is useful when we want to compare the value of an operand against an |
||
144 | // enum value, and we know the actual integer value of that enum. |
||
145 | class CheckImmOperand_s<int Index, string Value> : CheckOperandBase<Index> { |
||
146 | string ImmVal = Value; |
||
147 | } |
||
148 | |||
149 | // Expands to a call to `FunctionMapper` if field `FunctionMapper` is set. |
||
150 | // Otherwise, it expands to a CheckNot<CheckInvalidRegOperand<Index>>. |
||
151 | class CheckRegOperandSimple<int Index> : CheckOperandBase<Index>; |
||
152 | |||
153 | // Expands to a call to `FunctionMapper` if field `FunctionMapper` is set. |
||
154 | // Otherwise, it simply evaluates to TruePred. |
||
155 | class CheckImmOperandSimple<int Index> : CheckOperandBase<Index>; |
||
156 | |||
157 | // Check that the operand at position `Index` is immediate value zero. |
||
158 | class CheckZeroOperand<int Index> : CheckImmOperand<Index, 0>; |
||
159 | |||
160 | // Check that the instruction has exactly `Num` operands. |
||
161 | class CheckNumOperands<int Num> : MCInstPredicate { |
||
162 | int NumOps = Num; |
||
163 | } |
||
164 | |||
165 | // Check that the instruction opcode is one of the opcodes in set `Opcodes`. |
||
166 | // This is a simple set membership query. The easier way to check if an opcode |
||
167 | // is not a member of the set is by using a `CheckNot<CheckOpcode<[...]>>` |
||
168 | // sequence. |
||
169 | class CheckOpcode<list<Instruction> Opcodes> : MCInstPredicate { |
||
170 | list<Instruction> ValidOpcodes = Opcodes; |
||
171 | } |
||
172 | |||
173 | // Check that the instruction opcode is a pseudo opcode member of the set |
||
174 | // `Opcodes`. This check is always expanded to "false" if we are generating |
||
175 | // code for MCInst. |
||
176 | class CheckPseudo<list<Instruction> Opcodes> : CheckOpcode<Opcodes>; |
||
177 | |||
178 | // A non-portable predicate. Only to use as a last resort when a block of code |
||
179 | // cannot possibly be converted in a declarative way using other MCInstPredicate |
||
180 | // classes. This check is always expanded to "false" when generating code for |
||
181 | // MCInst. |
||
182 | class CheckNonPortable<string Code> : MCInstPredicate { |
||
183 | string CodeBlock = Code; |
||
184 | } |
||
185 | |||
186 | // A sequence of predicates. It is used as the base class for CheckAll, and |
||
187 | // CheckAny. It allows to describe compositions of predicates. |
||
188 | class CheckPredicateSequence<list<MCInstPredicate> Preds> : MCInstPredicate { |
||
189 | list<MCInstPredicate> Predicates = Preds; |
||
190 | } |
||
191 | |||
192 | // Check that all of the predicates in `Preds` evaluate to true. |
||
193 | class CheckAll<list<MCInstPredicate> Sequence> |
||
194 | : CheckPredicateSequence<Sequence>; |
||
195 | |||
196 | // Check that at least one of the predicates in `Preds` evaluates to true. |
||
197 | class CheckAny<list<MCInstPredicate> Sequence> |
||
198 | : CheckPredicateSequence<Sequence>; |
||
199 | |||
200 | |||
201 | // Used to expand the body of a function predicate. See the definition of |
||
202 | // TIIPredicate below. |
||
203 | class MCStatement; |
||
204 | |||
205 | // Expands to a return statement. The return expression is a boolean expression |
||
206 | // described by a MCInstPredicate. |
||
207 | class MCReturnStatement<MCInstPredicate predicate> : MCStatement { |
||
208 | MCInstPredicate Pred = predicate; |
||
209 | } |
||
210 | |||
211 | // Used to automatically construct cases of a switch statement where the switch |
||
212 | // variable is an instruction opcode. There is a 'case' for every opcode in the |
||
213 | // `opcodes` list, and each case is associated with MCStatement `caseStmt`. |
||
214 | class MCOpcodeSwitchCase<list<Instruction> opcodes, MCStatement caseStmt> { |
||
215 | list<Instruction> Opcodes = opcodes; |
||
216 | MCStatement CaseStmt = caseStmt; |
||
217 | } |
||
218 | |||
219 | // Expands to a switch statement. The switch variable is an instruction opcode. |
||
220 | // The auto-generated switch is populated by a number of cases based on the |
||
221 | // `cases` list in input. A default case is automatically generated, and it |
||
222 | // evaluates to `default`. |
||
223 | class MCOpcodeSwitchStatement<list<MCOpcodeSwitchCase> cases, |
||
224 | MCStatement default> : MCStatement { |
||
225 | list<MCOpcodeSwitchCase> Cases = cases; |
||
226 | MCStatement DefaultCase = default; |
||
227 | } |
||
228 | |||
229 | // Base class for function predicates. |
||
230 | class FunctionPredicateBase<string name, MCStatement body> { |
||
231 | string FunctionName = name; |
||
232 | MCStatement Body = body; |
||
233 | } |
||
234 | |||
235 | // Check that a call to method `Name` in class "XXXInstrInfo" (where XXX is |
||
236 | // the name of a target) returns true. |
||
237 | // |
||
238 | // TIIPredicate definitions are used to model calls to the target-specific |
||
239 | // InstrInfo. A TIIPredicate is treated specially by the InstrInfoEmitter |
||
240 | // tablegen backend, which will use it to automatically generate a definition in |
||
241 | // the target specific `InstrInfo` class. |
||
242 | // |
||
243 | // There cannot be multiple TIIPredicate definitions with the same name for the |
||
244 | // same target. |
||
245 | class TIIPredicate<string Name, MCStatement body> |
||
246 | : FunctionPredicateBase<Name, body>, MCInstPredicate; |
||
247 | |||
248 | // A function predicate that takes as input a machine instruction, and returns |
||
249 | // a boolean value. |
||
250 | // |
||
251 | // This predicate is expanded into a function call by the PredicateExpander. |
||
252 | // In particular, the PredicateExpander would either expand this predicate into |
||
253 | // a call to `MCInstFn`, or into a call to`MachineInstrFn` depending on whether |
||
254 | // it is lowering predicates for MCInst or MachineInstr. |
||
255 | // |
||
256 | // In this context, `MCInstFn` and `MachineInstrFn` are both function names. |
||
257 | class CheckFunctionPredicate<string MCInstFn, string MachineInstrFn> : MCInstPredicate { |
||
258 | string MCInstFnName = MCInstFn; |
||
259 | string MachineInstrFnName = MachineInstrFn; |
||
260 | } |
||
261 | |||
262 | // Similar to CheckFunctionPredicate. However it assumes that MachineInstrFn is |
||
263 | // a method in TargetInstrInfo, and MCInstrFn takes an extra pointer to |
||
264 | // MCInstrInfo. |
||
265 | // |
||
266 | // It Expands to: |
||
267 | // - TIIPointer->MachineInstrFn(MI) |
||
268 | // - MCInstrFn(MI, MCII); |
||
269 | class CheckFunctionPredicateWithTII<string MCInstFn, string MachineInstrFn, string |
||
270 | TIIPointer = "TII"> : MCInstPredicate { |
||
271 | string MCInstFnName = MCInstFn; |
||
272 | string TIIPtrName = TIIPointer; |
||
273 | string MachineInstrFnName = MachineInstrFn; |
||
274 | } |
||
275 | |||
276 | // Used to classify machine instructions based on a machine instruction |
||
277 | // predicate. |
||
278 | // |
||
279 | // Let IC be an InstructionEquivalenceClass definition, and MI a machine |
||
280 | // instruction. We say that MI belongs to the equivalence class described by IC |
||
281 | // if and only if the following two conditions are met: |
||
282 | // a) MI's opcode is in the `opcodes` set, and |
||
283 | // b) `Predicate` evaluates to true when applied to MI. |
||
284 | // |
||
285 | // Instances of this class can be used by processor scheduling models to |
||
286 | // describe instructions that have a property in common. For example, |
||
287 | // InstructionEquivalenceClass definitions can be used to identify the set of |
||
288 | // dependency breaking instructions for a processor model. |
||
289 | // |
||
290 | // An (optional) list of operand indices can be used to further describe |
||
291 | // properties that apply to instruction operands. For example, it can be used to |
||
292 | // identify register uses of a dependency breaking instructions that are not in |
||
293 | // a RAW dependency. |
||
294 | class InstructionEquivalenceClass<list<Instruction> opcodes, |
||
295 | MCInstPredicate pred, |
||
296 | list<int> operands = []> { |
||
297 | list<Instruction> Opcodes = opcodes; |
||
298 | MCInstPredicate Predicate = pred; |
||
299 | list<int> OperandIndices = operands; |
||
300 | } |
||
301 | |||
302 | // Used by processor models to describe dependency breaking instructions. |
||
303 | // |
||
304 | // This is mainly an alias for InstructionEquivalenceClass. Input operand |
||
305 | // `BrokenDeps` identifies the set of "broken dependencies". There is one bit |
||
306 | // per each implicit and explicit input operand. An empty set of broken |
||
307 | // dependencies means: "explicit input register operands are independent." |
||
308 | class DepBreakingClass<list<Instruction> opcodes, MCInstPredicate pred, |
||
309 | list<int> BrokenDeps = []> |
||
310 | : InstructionEquivalenceClass<opcodes, pred, BrokenDeps>; |
||
311 | |||
312 | // A function descriptor used to describe the signature of a predicate methods |
||
313 | // which will be expanded by the STIPredicateExpander into a tablegen'd |
||
314 | // XXXGenSubtargetInfo class member definition (here, XXX is a target name). |
||
315 | // |
||
316 | // It describes the signature of a TargetSubtarget hook, as well as a few extra |
||
317 | // properties. Examples of extra properties are: |
||
318 | // - The default return value for the auto-generate function hook. |
||
319 | // - A list of subtarget hooks (Delegates) that are called from this function. |
||
320 | // |
||
321 | class STIPredicateDecl<string name, MCInstPredicate default = FalsePred, |
||
322 | bit overrides = true, bit expandForMC = true, |
||
323 | bit updatesOpcodeMask = false, |
||
324 | list<STIPredicateDecl> delegates = []> { |
||
325 | string Name = name; |
||
326 | |||
327 | MCInstPredicate DefaultReturnValue = default; |
||
328 | |||
329 | // True if this method is declared as virtual in class TargetSubtargetInfo. |
||
330 | bit OverridesBaseClassMember = overrides; |
||
331 | |||
332 | // True if we need an equivalent predicate function in the MC layer. |
||
333 | bit ExpandForMC = expandForMC; |
||
334 | |||
335 | // True if the autogenerated method has a extra in/out APInt param used as a |
||
336 | // mask of operands. |
||
337 | bit UpdatesOpcodeMask = updatesOpcodeMask; |
||
338 | |||
339 | // A list of STIPredicates used by this definition to delegate part of the |
||
340 | // computation. For example, STIPredicateFunction `isDependencyBreaking()` |
||
341 | // delegates to `isZeroIdiom()` part of its computation. |
||
342 | list<STIPredicateDecl> Delegates = delegates; |
||
343 | } |
||
344 | |||
345 | // A predicate function definition member of class `XXXGenSubtargetInfo`. |
||
346 | // |
||
347 | // If `Declaration.ExpandForMC` is true, then SubtargetEmitter |
||
348 | // will also expand another definition of this method that accepts a MCInst. |
||
349 | class STIPredicate<STIPredicateDecl declaration, |
||
350 | list<InstructionEquivalenceClass> classes> { |
||
351 | STIPredicateDecl Declaration = declaration; |
||
352 | list<InstructionEquivalenceClass> Classes = classes; |
||
353 | SchedMachineModel SchedModel = ?; |
||
354 | } |
||
355 | |||
356 | // Convenience classes and definitions used by processor scheduling models to |
||
357 | // describe dependency breaking instructions and move elimination candidates. |
||
358 | let UpdatesOpcodeMask = true in { |
||
359 | |||
360 | def IsZeroIdiomDecl : STIPredicateDecl<"isZeroIdiom">; |
||
361 | |||
362 | let Delegates = [IsZeroIdiomDecl] in |
||
363 | def IsDepBreakingDecl : STIPredicateDecl<"isDependencyBreaking">; |
||
364 | |||
365 | } // UpdatesOpcodeMask |
||
366 | |||
367 | def IsOptimizableRegisterMoveDecl |
||
368 | : STIPredicateDecl<"isOptimizableRegisterMove">; |
||
369 | |||
370 | class IsZeroIdiomFunction<list<DepBreakingClass> classes> |
||
371 | : STIPredicate<IsZeroIdiomDecl, classes>; |
||
372 | |||
373 | class IsDepBreakingFunction<list<DepBreakingClass> classes> |
||
374 | : STIPredicate<IsDepBreakingDecl, classes>; |
||
375 | |||
376 | class IsOptimizableRegisterMove<list<InstructionEquivalenceClass> classes> |
||
377 | : STIPredicate<IsOptimizableRegisterMoveDecl, classes>; |