1 //===- llvm/CodeGen/GlobalISel/InstructionSelector.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 //
9 /// \file This file declares the API for the instruction selector.
10 /// This class is responsible for selecting machine instructions.
11 /// It's implemented by the target. It's used by the InstructionSelect pass.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
16 #define LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
17 
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ADT/Optional.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Analysis/BlockFrequencyInfo.h"
22 #include "llvm/Analysis/ProfileSummaryInfo.h"
23 #include "llvm/CodeGen/GlobalISel/Utils.h"
24 #include "llvm/CodeGen/MachineBasicBlock.h"
25 #include "llvm/CodeGen/MachineFunction.h"
26 #include "llvm/Support/CodeGenCoverage.h"
27 #include "llvm/Support/LowLevelTypeImpl.h"
28 #include <bitset>
29 #include <cstddef>
30 #include <cstdint>
31 #include <functional>
32 #include <initializer_list>
33 #include <vector>
34 
35 namespace llvm {
36 
37 class APInt;
38 class APFloat;
39 class GISelKnownBits;
40 class MachineInstr;
41 class MachineInstrBuilder;
42 class MachineFunction;
43 class MachineOperand;
44 class MachineRegisterInfo;
45 class RegisterBankInfo;
46 class TargetInstrInfo;
47 class TargetRegisterInfo;
48 
49 /// Container class for CodeGen predicate results.
50 /// This is convenient because std::bitset does not have a constructor
51 /// with an initializer list of set bits.
52 ///
53 /// Each InstructionSelector subclass should define a PredicateBitset class
54 /// with:
55 ///   const unsigned MAX_SUBTARGET_PREDICATES = 192;
56 ///   using PredicateBitset = PredicateBitsetImpl<MAX_SUBTARGET_PREDICATES>;
57 /// and updating the constant to suit the target. Tablegen provides a suitable
58 /// definition for the predicates in use in <Target>GenGlobalISel.inc when
59 /// GET_GLOBALISEL_PREDICATE_BITSET is defined.
60 template <std::size_t MaxPredicates>
61 class PredicateBitsetImpl : public std::bitset<MaxPredicates> {
62 public:
63   // Cannot inherit constructors because it's not supported by VC++..
64   PredicateBitsetImpl() = default;
65 
66   PredicateBitsetImpl(const std::bitset<MaxPredicates> &B)
67       : std::bitset<MaxPredicates>(B) {}
68 
69   PredicateBitsetImpl(std::initializer_list<unsigned> Init) {
70     for (auto I : Init)
71       std::bitset<MaxPredicates>::set(I);
72   }
73 };
74 
75 enum {
76   /// Begin a try-block to attempt a match and jump to OnFail if it is
77   /// unsuccessful.
78   /// - OnFail - The MatchTable entry at which to resume if the match fails.
79   ///
80   /// FIXME: This ought to take an argument indicating the number of try-blocks
81   ///        to exit on failure. It's usually one but the last match attempt of
82   ///        a block will need more. The (implemented) alternative is to tack a
83   ///        GIM_Reject on the end of each try-block which is simpler but
84   ///        requires an extra opcode and iteration in the interpreter on each
85   ///        failed match.
86   GIM_Try,
87 
88   /// Switch over the opcode on the specified instruction
89   /// - InsnID - Instruction ID
90   /// - LowerBound - numerically minimum opcode supported
91   /// - UpperBound - numerically maximum + 1 opcode supported
92   /// - Default - failure jump target
93   /// - JumpTable... - (UpperBound - LowerBound) (at least 2) jump targets
94   GIM_SwitchOpcode,
95 
96   /// Switch over the LLT on the specified instruction operand
97   /// - InsnID - Instruction ID
98   /// - OpIdx - Operand index
99   /// - LowerBound - numerically minimum Type ID supported
100   /// - UpperBound - numerically maximum + 1 Type ID supported
101   /// - Default - failure jump target
102   /// - JumpTable... - (UpperBound - LowerBound) (at least 2) jump targets
103   GIM_SwitchType,
104 
105   /// Record the specified instruction
106   /// - NewInsnID - Instruction ID to define
107   /// - InsnID - Instruction ID
108   /// - OpIdx - Operand index
109   GIM_RecordInsn,
110 
111   /// Check the feature bits
112   /// - Expected features
113   GIM_CheckFeatures,
114 
115   /// Check the opcode on the specified instruction
116   /// - InsnID - Instruction ID
117   /// - Expected opcode
118   GIM_CheckOpcode,
119 
120   /// Check the opcode on the specified instruction, checking 2 acceptable
121   /// alternatives.
122   /// - InsnID - Instruction ID
123   /// - Expected opcode
124   /// - Alternative expected opcode
125   GIM_CheckOpcodeIsEither,
126 
127   /// Check the instruction has the right number of operands
128   /// - InsnID - Instruction ID
129   /// - Expected number of operands
130   GIM_CheckNumOperands,
131   /// Check an immediate predicate on the specified instruction
132   /// - InsnID - Instruction ID
133   /// - The predicate to test
134   GIM_CheckI64ImmPredicate,
135   /// Check an immediate predicate on the specified instruction via an APInt.
136   /// - InsnID - Instruction ID
137   /// - The predicate to test
138   GIM_CheckAPIntImmPredicate,
139   /// Check a floating point immediate predicate on the specified instruction.
140   /// - InsnID - Instruction ID
141   /// - The predicate to test
142   GIM_CheckAPFloatImmPredicate,
143   /// Check an immediate predicate on the specified instruction
144   /// - InsnID - Instruction ID
145   /// - OpIdx - Operand index
146   /// - The predicate to test
147   GIM_CheckImmOperandPredicate,
148   /// Check a memory operation has the specified atomic ordering.
149   /// - InsnID - Instruction ID
150   /// - Ordering - The AtomicOrdering value
151   GIM_CheckAtomicOrdering,
152   GIM_CheckAtomicOrderingOrStrongerThan,
153   GIM_CheckAtomicOrderingWeakerThan,
154   /// Check the size of the memory access for the given machine memory operand.
155   /// - InsnID - Instruction ID
156   /// - MMOIdx - MMO index
157   /// - Size - The size in bytes of the memory access
158   GIM_CheckMemorySizeEqualTo,
159 
160   /// Check the address space of the memory access for the given machine memory
161   /// operand.
162   /// - InsnID - Instruction ID
163   /// - MMOIdx - MMO index
164   /// - NumAddrSpace - Number of valid address spaces
165   /// - AddrSpaceN - An allowed space of the memory access
166   /// - AddrSpaceN+1 ...
167   GIM_CheckMemoryAddressSpace,
168 
169   /// Check the minimum alignment of the memory access for the given machine
170   /// memory operand.
171   /// - InsnID - Instruction ID
172   /// - MMOIdx - MMO index
173   /// - MinAlign - Minimum acceptable alignment
174   GIM_CheckMemoryAlignment,
175 
176   /// Check the size of the memory access for the given machine memory operand
177   /// against the size of an operand.
178   /// - InsnID - Instruction ID
179   /// - MMOIdx - MMO index
180   /// - OpIdx - The operand index to compare the MMO against
181   GIM_CheckMemorySizeEqualToLLT,
182   GIM_CheckMemorySizeLessThanLLT,
183   GIM_CheckMemorySizeGreaterThanLLT,
184 
185   /// Check if this is a vector that can be treated as a vector splat
186   /// constant. This is valid for both G_BUILD_VECTOR as well as
187   /// G_BUILD_VECTOR_TRUNC. For AllOnes refers to individual bits, so a -1
188   /// element.
189   /// - InsnID - Instruction ID
190   GIM_CheckIsBuildVectorAllOnes,
191   GIM_CheckIsBuildVectorAllZeros,
192 
193   /// Check a generic C++ instruction predicate
194   /// - InsnID - Instruction ID
195   /// - PredicateID - The ID of the predicate function to call
196   GIM_CheckCxxInsnPredicate,
197 
198   /// Check the type for the specified operand
199   /// - InsnID - Instruction ID
200   /// - OpIdx - Operand index
201   /// - Expected type
202   GIM_CheckType,
203   /// Check the type of a pointer to any address space.
204   /// - InsnID - Instruction ID
205   /// - OpIdx - Operand index
206   /// - SizeInBits - The size of the pointer value in bits.
207   GIM_CheckPointerToAny,
208   /// Check the register bank for the specified operand
209   /// - InsnID - Instruction ID
210   /// - OpIdx - Operand index
211   /// - Expected register bank (specified as a register class)
212   GIM_CheckRegBankForClass,
213 
214   /// Check the operand matches a complex predicate
215   /// - InsnID - Instruction ID
216   /// - OpIdx - Operand index
217   /// - RendererID - The renderer to hold the result
218   /// - Complex predicate ID
219   GIM_CheckComplexPattern,
220 
221   /// Check the operand is a specific integer
222   /// - InsnID - Instruction ID
223   /// - OpIdx - Operand index
224   /// - Expected integer
225   GIM_CheckConstantInt,
226   /// Check the operand is a specific literal integer (i.e. MO.isImm() or
227   /// MO.isCImm() is true).
228   /// - InsnID - Instruction ID
229   /// - OpIdx - Operand index
230   /// - Expected integer
231   GIM_CheckLiteralInt,
232   /// Check the operand is a specific intrinsic ID
233   /// - InsnID - Instruction ID
234   /// - OpIdx - Operand index
235   /// - Expected Intrinsic ID
236   GIM_CheckIntrinsicID,
237 
238   /// Check the operand is a specific predicate
239   /// - InsnID - Instruction ID
240   /// - OpIdx - Operand index
241   /// - Expected predicate
242   GIM_CheckCmpPredicate,
243 
244   /// Check the specified operand is an MBB
245   /// - InsnID - Instruction ID
246   /// - OpIdx - Operand index
247   GIM_CheckIsMBB,
248 
249   /// Check the specified operand is an Imm
250   /// - InsnID - Instruction ID
251   /// - OpIdx - Operand index
252   GIM_CheckIsImm,
253 
254   /// Check if the specified operand is safe to fold into the current
255   /// instruction.
256   /// - InsnID - Instruction ID
257   GIM_CheckIsSafeToFold,
258 
259   /// Check the specified operands are identical.
260   /// - InsnID - Instruction ID
261   /// - OpIdx - Operand index
262   /// - OtherInsnID - Other instruction ID
263   /// - OtherOpIdx - Other operand index
264   GIM_CheckIsSameOperand,
265 
266   /// Predicates with 'let PredicateCodeUsesOperands = 1' need to examine some
267   /// named operands that will be recorded in RecordedOperands. Names of these
268   /// operands are referenced in predicate argument list. Emitter determines
269   /// StoreIdx(corresponds to the order in which names appear in argument list).
270   /// - InsnID - Instruction ID
271   /// - OpIdx - Operand index
272   /// - StoreIdx - Store location in RecordedOperands.
273   GIM_RecordNamedOperand,
274 
275   /// Fail the current try-block, or completely fail to match if there is no
276   /// current try-block.
277   GIM_Reject,
278 
279   //=== Renderers ===
280 
281   /// Mutate an instruction
282   /// - NewInsnID - Instruction ID to define
283   /// - OldInsnID - Instruction ID to mutate
284   /// - NewOpcode - The new opcode to use
285   GIR_MutateOpcode,
286 
287   /// Build a new instruction
288   /// - InsnID - Instruction ID to define
289   /// - Opcode - The new opcode to use
290   GIR_BuildMI,
291 
292   /// Copy an operand to the specified instruction
293   /// - NewInsnID - Instruction ID to modify
294   /// - OldInsnID - Instruction ID to copy from
295   /// - OpIdx - The operand to copy
296   GIR_Copy,
297 
298   /// Copy an operand to the specified instruction or add a zero register if the
299   /// operand is a zero immediate.
300   /// - NewInsnID - Instruction ID to modify
301   /// - OldInsnID - Instruction ID to copy from
302   /// - OpIdx - The operand to copy
303   /// - ZeroReg - The zero register to use
304   GIR_CopyOrAddZeroReg,
305   /// Copy an operand to the specified instruction
306   /// - NewInsnID - Instruction ID to modify
307   /// - OldInsnID - Instruction ID to copy from
308   /// - OpIdx - The operand to copy
309   /// - SubRegIdx - The subregister to copy
310   GIR_CopySubReg,
311 
312   /// Add an implicit register def to the specified instruction
313   /// - InsnID - Instruction ID to modify
314   /// - RegNum - The register to add
315   GIR_AddImplicitDef,
316   /// Add an implicit register use to the specified instruction
317   /// - InsnID - Instruction ID to modify
318   /// - RegNum - The register to add
319   GIR_AddImplicitUse,
320   /// Add an register to the specified instruction
321   /// - InsnID - Instruction ID to modify
322   /// - RegNum - The register to add
323   GIR_AddRegister,
324 
325   /// Add a temporary register to the specified instruction
326   /// - InsnID - Instruction ID to modify
327   /// - TempRegID - The temporary register ID to add
328   /// - TempRegFlags - The register flags to set
329   GIR_AddTempRegister,
330 
331   /// Add a temporary register to the specified instruction
332   /// - InsnID - Instruction ID to modify
333   /// - TempRegID - The temporary register ID to add
334   /// - TempRegFlags - The register flags to set
335   /// - SubRegIndex - The subregister index to set
336   GIR_AddTempSubRegister,
337 
338   /// Add an immediate to the specified instruction
339   /// - InsnID - Instruction ID to modify
340   /// - Imm - The immediate to add
341   GIR_AddImm,
342   /// Render complex operands to the specified instruction
343   /// - InsnID - Instruction ID to modify
344   /// - RendererID - The renderer to call
345   GIR_ComplexRenderer,
346 
347   /// Render sub-operands of complex operands to the specified instruction
348   /// - InsnID - Instruction ID to modify
349   /// - RendererID - The renderer to call
350   /// - RenderOpID - The suboperand to render.
351   GIR_ComplexSubOperandRenderer,
352   /// Render operands to the specified instruction using a custom function
353   /// - InsnID - Instruction ID to modify
354   /// - OldInsnID - Instruction ID to get the matched operand from
355   /// - RendererFnID - Custom renderer function to call
356   GIR_CustomRenderer,
357 
358   /// Render operands to the specified instruction using a custom function,
359   /// reading from a specific operand.
360   /// - InsnID - Instruction ID to modify
361   /// - OldInsnID - Instruction ID to get the matched operand from
362   /// - OpIdx - Operand index in OldInsnID the render function should read from..
363   /// - RendererFnID - Custom renderer function to call
364   GIR_CustomOperandRenderer,
365 
366   /// Render a G_CONSTANT operator as a sign-extended immediate.
367   /// - NewInsnID - Instruction ID to modify
368   /// - OldInsnID - Instruction ID to copy from
369   /// The operand index is implicitly 1.
370   GIR_CopyConstantAsSImm,
371 
372   /// Render a G_FCONSTANT operator as a sign-extended immediate.
373   /// - NewInsnID - Instruction ID to modify
374   /// - OldInsnID - Instruction ID to copy from
375   /// The operand index is implicitly 1.
376   GIR_CopyFConstantAsFPImm,
377 
378   /// Constrain an instruction operand to a register class.
379   /// - InsnID - Instruction ID to modify
380   /// - OpIdx - Operand index
381   /// - RCEnum - Register class enumeration value
382   GIR_ConstrainOperandRC,
383 
384   /// Constrain an instructions operands according to the instruction
385   /// description.
386   /// - InsnID - Instruction ID to modify
387   GIR_ConstrainSelectedInstOperands,
388 
389   /// Merge all memory operands into instruction.
390   /// - InsnID - Instruction ID to modify
391   /// - MergeInsnID... - One or more Instruction ID to merge into the result.
392   /// - GIU_MergeMemOperands_EndOfList - Terminates the list of instructions to
393   ///                                    merge.
394   GIR_MergeMemOperands,
395 
396   /// Erase from parent.
397   /// - InsnID - Instruction ID to erase
398   GIR_EraseFromParent,
399 
400   /// Create a new temporary register that's not constrained.
401   /// - TempRegID - The temporary register ID to initialize.
402   /// - Expected type
403   GIR_MakeTempReg,
404 
405   /// A successful emission
406   GIR_Done,
407 
408   /// Increment the rule coverage counter.
409   /// - RuleID - The ID of the rule that was covered.
410   GIR_Coverage,
411 
412   /// Keeping track of the number of the GI opcodes. Must be the last entry.
413   GIU_NumOpcodes,
414 };
415 
416 enum {
417   /// Indicates the end of the variable-length MergeInsnID list in a
418   /// GIR_MergeMemOperands opcode.
419   GIU_MergeMemOperands_EndOfList = -1,
420 };
421 
422 /// Provides the logic to select generic machine instructions.
423 class InstructionSelector {
424 public:
425   virtual ~InstructionSelector() = default;
426 
427   /// Select the (possibly generic) instruction \p I to only use target-specific
428   /// opcodes. It is OK to insert multiple instructions, but they cannot be
429   /// generic pre-isel instructions.
430   ///
431   /// \returns whether selection succeeded.
432   /// \pre  I.getParent() && I.getParent()->getParent()
433   /// \post
434   ///   if returns true:
435   ///     for I in all mutated/inserted instructions:
436   ///       !isPreISelGenericOpcode(I.getOpcode())
437   virtual bool select(MachineInstr &I) = 0;
438 
439   CodeGenCoverage *CoverageInfo = nullptr;
440   GISelKnownBits *KnownBits = nullptr;
441   MachineFunction *MF = nullptr;
442   ProfileSummaryInfo *PSI = nullptr;
443   BlockFrequencyInfo *BFI = nullptr;
444   // For some predicates, we need to track the current MBB.
445   MachineBasicBlock *CurMBB = nullptr;
446 
447   virtual void setupGeneratedPerFunctionState(MachineFunction &MF) {
448     llvm_unreachable("TableGen should have emitted implementation");
449   }
450 
451   /// Setup per-MF selector state.
452   virtual void setupMF(MachineFunction &mf, GISelKnownBits *KB,
453                        CodeGenCoverage &covinfo, ProfileSummaryInfo *psi,
454                        BlockFrequencyInfo *bfi) {
455     CoverageInfo = &covinfo;
456     KnownBits = KB;
457     MF = &mf;
458     PSI = psi;
459     BFI = bfi;
460     CurMBB = nullptr;
461     setupGeneratedPerFunctionState(mf);
462   }
463 
464 protected:
465   using ComplexRendererFns =
466       Optional<SmallVector<std::function<void(MachineInstrBuilder &)>, 4>>;
467   using RecordedMIVector = SmallVector<MachineInstr *, 4>;
468   using NewMIVector = SmallVector<MachineInstrBuilder, 4>;
469 
470   struct MatcherState {
471     std::vector<ComplexRendererFns::value_type> Renderers;
472     RecordedMIVector MIs;
473     DenseMap<unsigned, unsigned> TempRegisters;
474     /// Named operands that predicate with 'let PredicateCodeUsesOperands = 1'
475     /// referenced in its argument list. Operands are inserted at index set by
476     /// emitter, it corresponds to the order in which names appear in argument
477     /// list. Currently such predicates don't have more then 3 arguments.
478     std::array<const MachineOperand *, 3> RecordedOperands;
479 
480     MatcherState(unsigned MaxRenderers);
481   };
482 
483   bool shouldOptForSize(const MachineFunction *MF) const {
484     const auto &F = MF->getFunction();
485     return F.hasOptSize() || F.hasMinSize() ||
486            (PSI && BFI && CurMBB && llvm::shouldOptForSize(*CurMBB, PSI, BFI));
487   }
488 
489 public:
490   template <class PredicateBitset, class ComplexMatcherMemFn,
491             class CustomRendererFn>
492   struct ISelInfoTy {
493     ISelInfoTy(const LLT *TypeObjects, size_t NumTypeObjects,
494                const PredicateBitset *FeatureBitsets,
495                const ComplexMatcherMemFn *ComplexPredicates,
496                const CustomRendererFn *CustomRenderers)
497         : TypeObjects(TypeObjects),
498           FeatureBitsets(FeatureBitsets),
499           ComplexPredicates(ComplexPredicates),
500           CustomRenderers(CustomRenderers) {
501 
502       for (size_t I = 0; I < NumTypeObjects; ++I)
503         TypeIDMap[TypeObjects[I]] = I;
504     }
505     const LLT *TypeObjects;
506     const PredicateBitset *FeatureBitsets;
507     const ComplexMatcherMemFn *ComplexPredicates;
508     const CustomRendererFn *CustomRenderers;
509 
510     SmallDenseMap<LLT, unsigned, 64> TypeIDMap;
511   };
512 
513 protected:
514   InstructionSelector();
515 
516   /// Execute a given matcher table and return true if the match was successful
517   /// and false otherwise.
518   template <class TgtInstructionSelector, class PredicateBitset,
519             class ComplexMatcherMemFn, class CustomRendererFn>
520   bool executeMatchTable(
521       TgtInstructionSelector &ISel, NewMIVector &OutMIs, MatcherState &State,
522       const ISelInfoTy<PredicateBitset, ComplexMatcherMemFn, CustomRendererFn>
523           &ISelInfo,
524       const int64_t *MatchTable, const TargetInstrInfo &TII,
525       MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI,
526       const RegisterBankInfo &RBI, const PredicateBitset &AvailableFeatures,
527       CodeGenCoverage &CoverageInfo) const;
528 
529   virtual const int64_t *getMatchTable() const {
530     llvm_unreachable("Should have been overridden by tablegen if used");
531   }
532 
533   virtual bool testImmPredicate_I64(unsigned, int64_t) const {
534     llvm_unreachable(
535         "Subclasses must override this with a tablegen-erated function");
536   }
537   virtual bool testImmPredicate_APInt(unsigned, const APInt &) const {
538     llvm_unreachable(
539         "Subclasses must override this with a tablegen-erated function");
540   }
541   virtual bool testImmPredicate_APFloat(unsigned, const APFloat &) const {
542     llvm_unreachable(
543         "Subclasses must override this with a tablegen-erated function");
544   }
545   virtual bool testMIPredicate_MI(
546       unsigned, const MachineInstr &,
547       const std::array<const MachineOperand *, 3> &Operands) const {
548     llvm_unreachable(
549         "Subclasses must override this with a tablegen-erated function");
550   }
551 
552   bool isOperandImmEqual(const MachineOperand &MO, int64_t Value,
553                          const MachineRegisterInfo &MRI) const;
554 
555   /// Return true if the specified operand is a G_PTR_ADD with a G_CONSTANT on the
556   /// right-hand side. GlobalISel's separation of pointer and integer types
557   /// means that we don't need to worry about G_OR with equivalent semantics.
558   bool isBaseWithConstantOffset(const MachineOperand &Root,
559                                 const MachineRegisterInfo &MRI) const;
560 
561   /// Return true if MI can obviously be folded into IntoMI.
562   /// MI and IntoMI do not need to be in the same basic blocks, but MI must
563   /// preceed IntoMI.
564   bool isObviouslySafeToFold(MachineInstr &MI, MachineInstr &IntoMI) const;
565 };
566 
567 } // end namespace llvm
568 
569 #endif // LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
570