LLVM 20.0.0git
GIMatchTableExecutor.h
Go to the documentation of this file.
1//===- llvm/CodeGen/GlobalISel/GIMatchTableExecutor.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 GIMatchTableExecutor API, the opcodes supported
10/// by the match table, and some associated data structures used by the
11/// executor's implementation (see `GIMatchTableExecutorImpl.h`).
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_GLOBALISEL_GIMATCHTABLEEXECUTOR_H
16#define LLVM_CODEGEN_GLOBALISEL_GIMATCHTABLEEXECUTOR_H
17
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/Bitset.h"
20#include "llvm/ADT/DenseMap.h"
26#include "llvm/IR/Function.h"
28#include <bitset>
29#include <cstddef>
30#include <cstdint>
31#include <functional>
32#include <initializer_list>
33#include <optional>
34#include <vector>
35
36namespace llvm {
37
38class BlockFrequencyInfo;
39class CodeGenCoverage;
40class MachineBasicBlock;
41class ProfileSummaryInfo;
42class APInt;
43class APFloat;
44class GISelKnownBits;
45class MachineInstr;
46class MachineIRBuilder;
47class MachineInstrBuilder;
48class MachineFunction;
49class MachineOperand;
50class MachineRegisterInfo;
51class RegisterBankInfo;
52class TargetInstrInfo;
53class TargetRegisterInfo;
54
55enum {
58};
59
60/// The MatchTable is encoded as an array of bytes.
61/// Thus, opcodes are expected to be <255.
62///
63/// Operands can be variable-sized, their size is always after their name
64/// in the docs, e.g. "Foo(4)" means that "Foo" takes 4 entries in the table,
65/// so 4 bytes. "Foo()"
66///
67/// As a general rule of thumb:
68/// - Instruction & Operand IDs are ULEB128
69/// - LLT IDs are 1 byte
70/// - Predicates and target opcodes, register and register class IDs are 2
71/// bytes.
72/// - Indexes into the table are 4 bytes.
73/// - Inline constants are 8 bytes
74///
75/// Design notes:
76/// - Inst/Op IDs have to be LEB128 because some targets generate
77/// extremely long patterns which need more than 255 temporaries.
78/// We could just use 2 bytes everytime, but then some targets like
79/// X86/AMDGPU that have no need for it will pay the price all the time.
80enum {
81 /// Begin a try-block to attempt a match and jump to OnFail if it is
82 /// unsuccessful.
83 /// - OnFail(4) - The MatchTable entry at which to resume if the match fails.
84 ///
85 /// FIXME: This ought to take an argument indicating the number of try-blocks
86 /// to exit on failure. It's usually one but the last match attempt of
87 /// a block will need more. The (implemented) alternative is to tack a
88 /// GIM_Reject on the end of each try-block which is simpler but
89 /// requires an extra opcode and iteration in the interpreter on each
90 /// failed match.
92
93 /// Switch over the opcode on the specified instruction
94 /// - InsnID(ULEB128) - Instruction ID
95 /// - LowerBound(2) - numerically minimum opcode supported
96 /// - UpperBound(2) - numerically maximum + 1 opcode supported
97 /// - Default(4) - failure jump target
98 /// - JumpTable(4)... - (UpperBound - LowerBound) (at least 2) jump targets
100
101 /// Switch over the LLT on the specified instruction operand
102 /// - InsnID(ULEB128) - Instruction ID
103 /// - OpIdx(ULEB128) - Operand index
104 /// - LowerBound(2) - numerically minimum Type ID supported
105 /// - UpperBound(2) - numerically maximum + 1 Type ID supported
106 /// - Default(4) - failure jump target
107 /// - JumpTable(4)... - (UpperBound - LowerBound) (at least 2) jump targets
109
110 /// Record the specified instruction.
111 /// The IgnoreCopies variant ignores COPY instructions.
112 /// - NewInsnID(ULEB128) - Instruction ID to define
113 /// - InsnID(ULEB128) - Instruction ID
114 /// - OpIdx(ULEB128) - Operand index
117
118 /// Check the feature bits
119 /// Feature(2) - Expected features
121
122 /// Check the opcode on the specified instruction
123 /// - InsnID(ULEB128) - Instruction ID
124 /// - Opc(2) - Expected opcode
126
127 /// Check the opcode on the specified instruction, checking 2 acceptable
128 /// alternatives.
129 /// - InsnID(ULEB128) - Instruction ID
130 /// - Opc(2) - Expected opcode
131 /// - Opc(2) - Alternative expected opcode
133
134 /// Check the instruction has the right number of operands
135 /// - InsnID(ULEB128) - Instruction ID
136 /// - Ops(ULEB128) - Expected number of operands
138
139 /// Check the instruction has a number of operands <= or >= than given number.
140 /// - InsnID(ULEB128) - Instruction ID
141 /// - Ops(ULEB128) - Number of operands
144
145 /// Check an immediate predicate on the specified instruction
146 /// - InsnID(ULEB128) - Instruction ID
147 /// - Pred(2) - The predicate to test
149 /// Check an immediate predicate on the specified instruction via an APInt.
150 /// - InsnID(ULEB128) - Instruction ID
151 /// - Pred(2) - The predicate to test
153 /// Check a floating point immediate predicate on the specified instruction.
154 /// - InsnID(ULEB128) - Instruction ID
155 /// - Pred(2) - The predicate to test
157 /// Check an immediate predicate on the specified instruction
158 /// - InsnID(ULEB128) - Instruction ID
159 /// - OpIdx(ULEB128) - Operand index
160 /// - Pred(2) - The predicate to test
162
163 /// Check a memory operation has the specified atomic ordering.
164 /// - InsnID(ULEB128) - Instruction ID
165 /// - Ordering(ULEB128) - The AtomicOrdering value
169
170 /// Check the size of the memory access for the given machine memory operand.
171 /// - InsnID(ULEB128) - Instruction ID
172 /// - MMOIdx(ULEB128) - MMO index
173 /// - Size(4) - The size in bytes of the memory access
175
176 /// Check the address space of the memory access for the given machine memory
177 /// operand.
178 /// - InsnID(ULEB128) - Instruction ID
179 /// - MMOIdx(ULEB128) - MMO index
180 /// - NumAddrSpace(1) - Number of valid address spaces
181 /// - AddrSpaceN(ULEB128) - An allowed space of the memory access
182 /// - AddrSpaceN+1 ...
184
185 /// Check the minimum alignment of the memory access for the given machine
186 /// memory operand.
187 /// - InsnID(ULEB128) - Instruction ID
188 /// - MMOIdx(ULEB128) - MMO index
189 /// - MinAlign(1) - Minimum acceptable alignment
191
192 /// Check the size of the memory access for the given machine memory operand
193 /// against the size of an operand.
194 /// - InsnID(ULEB128) - Instruction ID
195 /// - MMOIdx(ULEB128) - MMO index
196 /// - OpIdx(ULEB128) - The operand index to compare the MMO against
200
201 /// Check if this is a vector that can be treated as a vector splat
202 /// constant. This is valid for both G_BUILD_VECTOR as well as
203 /// G_BUILD_VECTOR_TRUNC. For AllOnes refers to individual bits, so a -1
204 /// element.
205 /// - InsnID(ULEB128) - Instruction ID
208
209 /// Check a trivial predicate which takes no arguments.
210 /// This can be used by executors to implement custom flags that don't fit in
211 /// target features.
212 /// - Pred(2) - Predicate ID to check.
214
215 /// Check a generic C++ instruction predicate
216 /// - InsnID(ULEB128) - Instruction ID
217 /// - PredicateID(2) - The ID of the predicate function to call
219
220 /// Check if there's no use of the first result.
221 /// - InsnID(ULEB128) - Instruction ID
223
224 /// Check if there's one use of the first result.
225 /// - InsnID(ULEB128) - Instruction ID
227
228 /// Check the type for the specified operand
229 /// - InsnID(ULEB128) - Instruction ID
230 /// - OpIdx(ULEB128) - Operand index
231 /// - Ty(1) - Expected type
233 /// GIM_CheckType but InsnID is omitted and defaults to zero.
235
236 /// Check the type of a pointer to any address space.
237 /// - InsnID(ULEB128) - Instruction ID
238 /// - OpIdx(ULEB128) - Operand index
239 /// - SizeInBits(ULEB128) - The size of the pointer value in bits.
241
242 /// Check the register bank for the specified operand
243 /// - InsnID(ULEB128) - Instruction ID
244 /// - OpIdx(ULEB128) - Operand index
245 /// - RC(2) - Expected register bank (specified as a register class)
247 /// GIM_CheckRegBankForClass but InsnID is omitted and defaults to zero.
249
250 /// Check the operand matches a complex predicate
251 /// - InsnID(ULEB128) - Instruction ID
252 /// - OpIdx(ULEB128) - Operand index
253 /// - RendererID(2) - The renderer to hold the result
254 /// - Pred(2) - Complex predicate ID
256
257 /// Check the operand is a specific integer
258 /// - InsnID(ULEB128) - Instruction ID
259 /// - OpIdx(ULEB128) - Operand index
260 /// - Val(8) Expected integer
262
263 /// Check the operand is a specific 8-bit signed integer
264 /// - InsnID(ULEB128) - Instruction ID
265 /// - OpIdx(ULEB128) - Operand index
266 /// - Val(1) Expected integer
268
269 /// Check the operand is a specific literal integer (i.e. MO.isImm() or
270 /// MO.isCImm() is true).
271 /// - InsnID(ULEB128) - Instruction ID
272 /// - OpIdx(ULEB128) - Operand index
273 /// - Val(8) - Expected integer
275
276 /// Check the operand is a specific intrinsic ID
277 /// - InsnID(ULEB128) - Instruction ID
278 /// - OpIdx(ULEB128) - Operand index
279 /// - IID(2) - Expected Intrinsic ID
281
282 /// Check the operand is a specific predicate
283 /// - InsnID(ULEB128) - Instruction ID
284 /// - OpIdx(ULEB128) - Operand index
285 /// - Pred(2) - Expected predicate
287
288 /// Check the specified operand is an MBB
289 /// - InsnID(ULEB128) - Instruction ID
290 /// - OpIdx(ULEB128) - Operand index
292
293 /// Check the specified operand is an Imm
294 /// - InsnID(ULEB128) - Instruction ID
295 /// - OpIdx(ULEB128) - Operand index
297
298 /// Checks if the matched instructions numbered [1, 1+N) can
299 /// be folded into the root (inst 0).
300 /// - Num(1)
302
303 /// Check the specified operands are identical.
304 /// The IgnoreCopies variant looks through COPY instructions before
305 /// comparing the operands.
306 /// The "All" variants check all operands starting from the index.
307 /// - InsnID(ULEB128) - Instruction ID
308 /// - OpIdx(ULEB128) - Operand index
309 /// - OtherInsnID(ULEB128) - Other instruction ID
310 /// - OtherOpIdx(ULEB128) - Other operand index
315
316 /// Check we can replace all uses of a register with another.
317 /// - OldInsnID(ULEB128)
318 /// - OldOpIdx(ULEB128)
319 /// - NewInsnID(ULEB128)
320 /// - NewOpIdx(ULEB128)
322
323 /// Check that a matched instruction has, or doesn't have a MIFlag.
324 ///
325 /// - InsnID(ULEB128) - Instruction to check.
326 /// - Flags(4) - (can be one or more flags OR'd together)
329
330 /// Predicates with 'let PredicateCodeUsesOperands = 1' need to examine some
331 /// named operands that will be recorded in RecordedOperands. Names of these
332 /// operands are referenced in predicate argument list. Emitter determines
333 /// StoreIdx(corresponds to the order in which names appear in argument list).
334 /// - InsnID(ULEB128) - Instruction ID
335 /// - OpIdx(ULEB128) - Operand index
336 /// - StoreIdx(ULEB128) - Store location in RecordedOperands.
338
339 /// Records an operand's register type into the set of temporary types.
340 /// - InsnID(ULEB128) - Instruction ID
341 /// - OpIdx(ULEB128) - Operand index
342 /// - TempTypeIdx(1) - Temp Type Index, always negative.
344
345 /// Fail the current try-block, or completely fail to match if there is no
346 /// current try-block.
348
349 //=== Renderers ===
350
351 /// Mutate an instruction
352 /// - NewInsnID(ULEB128) - Instruction ID to define
353 /// - OldInsnID(ULEB128) - Instruction ID to mutate
354 /// - NewOpcode(2) - The new opcode to use
356
357 /// Build a new instruction
358 /// - InsnID(ULEB128) - Instruction ID to define
359 /// - Opcode(2) - The new opcode to use
361 /// GIR_BuildMI but InsnID is omitted and defaults to zero.
363
364 /// Builds a constant and stores its result in a TempReg.
365 /// - TempRegID(ULEB128) - Temp Register to define.
366 /// - Imm(8) - The immediate to add
368
369 /// Copy an operand to the specified instruction
370 /// - NewInsnID(ULEB128) - Instruction ID to modify
371 /// - OldInsnID(ULEB128) - Instruction ID to copy from
372 /// - OpIdx(ULEB128) - The operand to copy
374 /// GIR_Copy but with both New/OldInsnIDs omitted and defaulting to zero.
376
377 /// Copies all operand starting from OpIdx in OldInsnID into the new
378 /// instruction NewInsnID.
379 /// - NewInsnID(ULEB128) - Instruction ID to modify
380 /// - OldInsnID(ULEB128) - Instruction ID to copy from
381 /// - OpIdx(ULEB128) - The first operand to copy
383
384 /// Copy an operand to the specified instruction or add a zero register if the
385 /// operand is a zero immediate.
386 /// - NewInsnID(ULEB128) - Instruction ID to modify
387 /// - OldInsnID(ULEB128) - Instruction ID to copy from
388 /// - OpIdx(ULEB128) - The operand to copy
389 /// - ZeroReg(2) - The zero register to use
391 /// Copy an operand to the specified instruction
392 /// - NewInsnID(ULEB128) - Instruction ID to modify
393 /// - OldInsnID(ULEB128) - Instruction ID to copy from
394 /// - OpIdx(ULEB128) - The operand to copy
395 /// - SubRegIdx(2) - The subregister to copy
397
398 /// Add an implicit register def to the specified instruction
399 /// - InsnID(ULEB128) - Instruction ID to modify
400 /// - RegNum(2) - The register to add
401 /// - Flags(2) - Register Flags
403 /// Add an implicit register use to the specified instruction
404 /// - InsnID(ULEB128) - Instruction ID to modify
405 /// - RegNum(2) - The register to add
407 /// Add an register to the specified instruction
408 /// - InsnID(ULEB128) - Instruction ID to modify
409 /// - RegNum(2) - The register to add
410 /// - Flags(2) - Register Flags
412
413 /// Adds an intrinsic ID to the specified instruction.
414 /// - InsnID(ULEB128) - Instruction ID to modify
415 /// - IID(2) - Intrinsic ID
417
418 /// Marks the implicit def of a register as dead.
419 /// - InsnID(ULEB128) - Instruction ID to modify
420 /// - OpIdx(ULEB128) - The implicit def operand index
421 ///
422 /// OpIdx starts at 0 for the first implicit def.
424
425 /// Set or unset a MIFlag on an instruction.
426 ///
427 /// - InsnID(ULEB128) - Instruction to modify.
428 /// - Flags(4) - (can be one or more flags OR'd together)
431
432 /// Copy the MIFlags of a matched instruction into an
433 /// output instruction. The flags are OR'd together.
434 ///
435 /// - InsnID(ULEB128) - Instruction to modify.
436 /// - OldInsnID(ULEB128) - Matched instruction to copy flags from.
438
439 /// Add a temporary register to the specified instruction
440 /// - InsnID(ULEB128) - Instruction ID to modify
441 /// - TempRegID(ULEB128) - The temporary register ID to add
442 /// - TempRegFlags(2) - The register flags to set
444
445 /// Add a temporary register to the specified instruction without
446 /// setting any flags.
447 /// - InsnID(ULEB128) - Instruction ID to modify
448 /// - TempRegID(ULEB128) - The temporary register ID to add
450
451 /// Add a temporary register to the specified instruction
452 /// - InsnID(ULEB128) - Instruction ID to modify
453 /// - TempRegID(ULEB128) - The temporary register ID to add
454 /// - TempRegFlags(2) - The register flags to set
455 /// - SubRegIndex(2) - The subregister index to set
457
458 /// Add an immediate to the specified instruction
459 /// - InsnID(ULEB128) - Instruction ID to modify
460 /// - Imm(8) - The immediate to add
462
463 /// Add signed 8 bit immediate to the specified instruction
464 /// - InsnID(ULEB128) - Instruction ID to modify
465 /// - Imm(1) - The immediate to add
467
468 /// Add an CImm to the specified instruction
469 /// - InsnID(ULEB128) - Instruction ID to modify
470 /// - Ty(1) - Type of the constant immediate.
471 /// - Imm(8) - The immediate to add
473
474 /// Render complex operands to the specified instruction
475 /// - InsnID(ULEB128) - Instruction ID to modify
476 /// - RendererID(2) - The renderer to call
478 /// Render sub-operands of complex operands to the specified instruction
479 /// - InsnID(ULEB128) - Instruction ID to modify
480 /// - RendererID(2) - The renderer to call
481 /// - RenderOpID(ULEB128) - The suboperand to render.
483 /// Render subregisters of suboperands of complex operands to the
484 /// specified instruction
485 /// - InsnID(ULEB128) - Instruction ID to modify
486 /// - RendererID(2) - The renderer to call
487 /// - RenderOpID(ULEB128) - The suboperand to render
488 /// - SubRegIdx(2) - The subregister to extract
490
491 /// Render operands to the specified instruction using a custom function
492 /// - InsnID(ULEB128) - Instruction ID to modify
493 /// - OldInsnID(ULEB128) - Instruction ID to get the matched operand from
494 /// - RendererFnID(2) - Custom renderer function to call
496
497 /// Calls a C++ function that concludes the current match.
498 /// The C++ function is free to return false and reject the match, or
499 /// return true and mutate the instruction(s) (or do nothing, even).
500 /// - FnID(2) - The function to call.
502
503 /// Render operands to the specified instruction using a custom function,
504 /// reading from a specific operand.
505 /// - InsnID(ULEB128) - Instruction ID to modify
506 /// - OldInsnID(ULEB128) - Instruction ID to get the matched operand from
507 /// - OpIdx(ULEB128) - Operand index in OldInsnID the render function should
508 /// read
509 /// from..
510 /// - RendererFnID(2) - Custom renderer function to call
512
513 /// Render a G_CONSTANT operator as a sign-extended immediate.
514 /// - NewInsnID(ULEB128) - Instruction ID to modify
515 /// - OldInsnID(ULEB128) - Instruction ID to copy from
516 /// The operand index is implicitly 1.
518
519 /// Render a G_FCONSTANT operator as a sign-extended immediate.
520 /// - NewInsnID(ULEB128) - Instruction ID to modify
521 /// - OldInsnID(ULEB128) - Instruction ID to copy from
522 /// The operand index is implicitly 1.
524
525 /// Constrain an instruction operand to a register class.
526 /// - InsnID(ULEB128) - Instruction ID to modify
527 /// - OpIdx(ULEB128) - Operand index
528 /// - RCEnum(2) - Register class enumeration value
530
531 /// Constrain an instructions operands according to the instruction
532 /// description.
533 /// - InsnID(ULEB128) - Instruction ID to modify
535 /// GIR_ConstrainSelectedInstOperands but InsnID is omitted and defaults to
536 /// zero.
538
539 /// Merge all memory operands into instruction.
540 /// - InsnID(ULEB128) - Instruction ID to modify
541 /// - NumInsnID(1) - Number of instruction IDs following this argument
542 /// - MergeInsnID(ULEB128)... - One or more Instruction ID to merge into the
543 /// result.
545
546 /// Erase from parent.
547 /// - InsnID(ULEB128) - Instruction ID to erase
549
550 /// Combines both a GIR_EraseFromParent 0 + GIR_Done
552
553 /// Create a new temporary register that's not constrained.
554 /// - TempRegID(ULEB128) - The temporary register ID to initialize.
555 /// - Ty(1) - Expected type
557
558 /// Replaces all references to a register from an instruction
559 /// with another register from another instruction.
560 /// - OldInsnID(ULEB128)
561 /// - OldOpIdx(ULEB128)
562 /// - NewInsnID(ULEB128)
563 /// - NewOpIdx(ULEB128)
565
566 /// Replaces all references to a register with a temporary register.
567 /// - OldInsnID(ULEB128)
568 /// - OldOpIdx(ULEB128)
569 /// - TempRegIdx(ULEB128)
571
572 /// A successful emission
574
575 /// Increment the rule coverage counter.
576 /// - RuleID(4) - The ID of the rule that was covered.
578
579 /// Keeping track of the number of the GI opcodes. Must be the last entry.
581};
582
583/// Provides the logic to execute GlobalISel match tables, which are used by the
584/// instruction selector and instruction combiners as their engine to match and
585/// apply MIR patterns.
587public:
588 virtual ~GIMatchTableExecutor() = default;
589
591 GISelKnownBits *KB = nullptr;
592 MachineFunction *MF = nullptr;
595 // For some predicates, we need to track the current MBB.
597
599
600 /// Setup per-MF executor state.
602 CodeGenCoverage *covinfo = nullptr,
603 ProfileSummaryInfo *psi = nullptr,
604 BlockFrequencyInfo *bfi = nullptr) {
605 CoverageInfo = covinfo;
606 KB = kb;
607 MF = &mf;
608 PSI = psi;
609 BFI = bfi;
610 CurMBB = nullptr;
612 }
613
614protected:
616 std::optional<SmallVector<std::function<void(MachineInstrBuilder &)>, 4>>;
619
621 std::vector<ComplexRendererFns::value_type> Renderers;
624 /// Named operands that predicate with 'let PredicateCodeUsesOperands = 1'
625 /// referenced in its argument list. Operands are inserted at index set by
626 /// emitter, it corresponds to the order in which names appear in argument
627 /// list. Currently such predicates don't have more then 3 arguments.
628 std::array<const MachineOperand *, 3> RecordedOperands;
629
630 /// Types extracted from an instruction's operand.
631 /// Whenever a type index is negative, we look here instead.
633
634 MatcherState(unsigned MaxRenderers);
635 };
636
638 const auto &F = MF->getFunction();
639 if (F.hasOptSize())
640 return true;
641 if (CurMBB)
642 if (auto *BB = CurMBB->getBasicBlock())
644 return false;
645 }
646
647public:
648 template <class PredicateBitset, class ComplexMatcherMemFn,
649 class CustomRendererFn>
650 struct ExecInfoTy {
651 ExecInfoTy(const LLT *TypeObjects, size_t NumTypeObjects,
652 const PredicateBitset *FeatureBitsets,
653 const ComplexMatcherMemFn *ComplexPredicates,
654 const CustomRendererFn *CustomRenderers)
658
659 for (size_t I = 0; I < NumTypeObjects; ++I)
661 }
663 const PredicateBitset *FeatureBitsets;
664 const ComplexMatcherMemFn *ComplexPredicates;
665 const CustomRendererFn *CustomRenderers;
666
668 };
669
670protected:
672
673 /// Execute a given matcher table and return true if the match was successful
674 /// and false otherwise.
675 template <class TgtExecutor, class PredicateBitset, class ComplexMatcherMemFn,
676 class CustomRendererFn>
677 bool executeMatchTable(TgtExecutor &Exec, MatcherState &State,
678 const ExecInfoTy<PredicateBitset, ComplexMatcherMemFn,
679 CustomRendererFn> &ExecInfo,
680 MachineIRBuilder &Builder, const uint8_t *MatchTable,
682 const TargetRegisterInfo &TRI,
683 const RegisterBankInfo &RBI,
684 const PredicateBitset &AvailableFeatures,
686
687 virtual const uint8_t *getMatchTable() const {
688 llvm_unreachable("Should have been overridden by tablegen if used");
689 }
690
691 virtual bool testImmPredicate_I64(unsigned, int64_t) const {
693 "Subclasses must override this with a tablegen-erated function");
694 }
695 virtual bool testImmPredicate_APInt(unsigned, const APInt &) const {
697 "Subclasses must override this with a tablegen-erated function");
698 }
699 virtual bool testImmPredicate_APFloat(unsigned, const APFloat &) const {
701 "Subclasses must override this with a tablegen-erated function");
702 }
703 virtual bool testMIPredicate_MI(unsigned, const MachineInstr &,
704 const MatcherState &State) const {
706 "Subclasses must override this with a tablegen-erated function");
707 }
708
709 virtual bool testSimplePredicate(unsigned) const {
710 llvm_unreachable("Subclass does not implement testSimplePredicate!");
711 }
712
713 virtual bool runCustomAction(unsigned, const MatcherState &State,
714 NewMIVector &OutMIs) const {
715 llvm_unreachable("Subclass does not implement runCustomAction!");
716 }
717
718 bool isOperandImmEqual(const MachineOperand &MO, int64_t Value,
720 bool Splat = false) const;
721
722 /// Return true if the specified operand is a G_PTR_ADD with a G_CONSTANT on
723 /// the right-hand side. GlobalISel's separation of pointer and integer types
724 /// means that we don't need to worry about G_OR with equivalent semantics.
726 const MachineRegisterInfo &MRI) const;
727
728 /// Return true if MI can obviously be folded into IntoMI.
729 /// MI and IntoMI do not need to be in the same basic blocks, but MI must
730 /// preceed IntoMI.
732
733 template <typename Ty> static Ty readBytesAs(const uint8_t *MatchTable) {
734 Ty Ret;
735 memcpy(&Ret, MatchTable, sizeof(Ret));
736 return Ret;
737 }
738
740 unsigned FirstVarOp) {
741 auto Operands = drop_begin(MI.operands(), FirstVarOp);
742 return {Operands.begin(), Operands.end()};
743 }
744
745public:
746 // Faster ULEB128 decoder tailored for the Match Table Executor.
747 //
748 // - Arguments are fixed to avoid mid-function checks.
749 // - Unchecked execution, assumes no error.
750 // - Fast common case handling (1 byte values).
753 uint64_t &CurrentIdx) {
754 uint64_t Value = MatchTable[CurrentIdx++];
755 if (LLVM_UNLIKELY(Value >= 128)) {
756 Value &= 0x7f;
757 unsigned Shift = 7;
758 do {
759 uint64_t Slice = MatchTable[CurrentIdx] & 0x7f;
760 Value += Slice << Shift;
761 Shift += 7;
762 } while (MatchTable[CurrentIdx++] >= 128);
763 }
764 return Value;
765 }
766};
767
768} // end namespace llvm
769
770#endif // LLVM_CODEGEN_GLOBALISEL_GIMATCHTABLEEXECUTOR_H
unsigned const MachineRegisterInfo * MRI
#define LLVM_UNLIKELY(EXPR)
Definition: Compiler.h:320
#define LLVM_ATTRIBUTE_ALWAYS_INLINE
LLVM_ATTRIBUTE_ALWAYS_INLINE - On compilers where we have a directive to do so, mark a method "always...
Definition: Compiler.h:340
#define LLVM_ATTRIBUTE_RESTRICT
LLVM_ATTRIBUTE_RESTRICT - Annotates a pointer to tell the compiler that it is not aliased in the curr...
Definition: Compiler.h:365
This file defines the DenseMap class.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
Implement a low-level type suitable for MachineInstr level instruction selection.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
unsigned const TargetRegisterInfo * TRI
This file defines the SmallVector class.
Class for arbitrary precision integers.
Definition: APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Provides the logic to execute GlobalISel match tables, which are used by the instruction selector and...
virtual bool testSimplePredicate(unsigned) const
bool executeMatchTable(TgtExecutor &Exec, MatcherState &State, const ExecInfoTy< PredicateBitset, ComplexMatcherMemFn, CustomRendererFn > &ExecInfo, MachineIRBuilder &Builder, const uint8_t *MatchTable, const TargetInstrInfo &TII, MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, const RegisterBankInfo &RBI, const PredicateBitset &AvailableFeatures, CodeGenCoverage *CoverageInfo) const
Execute a given matcher table and return true if the match was successful and false otherwise.
virtual bool testImmPredicate_APFloat(unsigned, const APFloat &) const
virtual const uint8_t * getMatchTable() const
virtual bool testImmPredicate_APInt(unsigned, const APInt &) const
virtual bool testMIPredicate_MI(unsigned, const MachineInstr &, const MatcherState &State) const
bool isBaseWithConstantOffset(const MachineOperand &Root, const MachineRegisterInfo &MRI) const
Return true if the specified operand is a G_PTR_ADD with a G_CONSTANT on the right-hand side.
virtual bool testImmPredicate_I64(unsigned, int64_t) const
static Ty readBytesAs(const uint8_t *MatchTable)
std::optional< SmallVector< std::function< void(MachineInstrBuilder &)>, 4 > > ComplexRendererFns
bool shouldOptForSize(const MachineFunction *MF) const
static LLVM_ATTRIBUTE_ALWAYS_INLINE uint64_t fastDecodeULEB128(const uint8_t *LLVM_ATTRIBUTE_RESTRICT MatchTable, uint64_t &CurrentIdx)
bool isOperandImmEqual(const MachineOperand &MO, int64_t Value, const MachineRegisterInfo &MRI, bool Splat=false) const
virtual ~GIMatchTableExecutor()=default
virtual void setupMF(MachineFunction &mf, GISelKnownBits *kb, CodeGenCoverage *covinfo=nullptr, ProfileSummaryInfo *psi=nullptr, BlockFrequencyInfo *bfi=nullptr)
Setup per-MF executor state.
bool isObviouslySafeToFold(MachineInstr &MI, MachineInstr &IntoMI) const
Return true if MI can obviously be folded into IntoMI.
virtual bool runCustomAction(unsigned, const MatcherState &State, NewMIVector &OutMIs) const
static ArrayRef< MachineOperand > getRemainingOperands(const MachineInstr &MI, unsigned FirstVarOp)
virtual void setupGeneratedPerFunctionState(MachineFunction &MF)=0
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
Function & getFunction()
Return the LLVM function that this machine code represents.
Helper class to build MachineInstr.
Representation of each machine instruction.
Definition: MachineInstr.h:69
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Analysis providing profile information.
Holds all the information related to register banks.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LLVM Value Representation.
Definition: Value.h:74
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition: STLExtras.h:329
@ GIR_AddIntrinsicID
Adds an intrinsic ID to the specified instruction.
@ GIR_ComplexRenderer
Render complex operands to the specified instruction.
@ GIR_ReplaceRegWithTempReg
Replaces all references to a register with a temporary register.
@ GIR_ComplexSubOperandRenderer
Render sub-operands of complex operands to the specified instruction.
@ GIR_MakeTempReg
Create a new temporary register that's not constrained.
@ GIM_CheckMemorySizeEqualTo
Check the size of the memory access for the given machine memory operand.
@ GIM_RootCheckType
GIM_CheckType but InsnID is omitted and defaults to zero.
@ GIM_RootCheckRegBankForClass
GIM_CheckRegBankForClass but InsnID is omitted and defaults to zero.
@ GIR_Done
A successful emission.
@ GIM_RecordNamedOperand
Predicates with 'let PredicateCodeUsesOperands = 1' need to examine some named operands that will be ...
@ GIM_Try
Begin a try-block to attempt a match and jump to OnFail if it is unsuccessful.
@ GIR_RootConstrainSelectedInstOperands
GIR_ConstrainSelectedInstOperands but InsnID is omitted and defaults to zero.
@ GIM_CheckIsBuildVectorAllOnes
Check if this is a vector that can be treated as a vector splat constant.
@ GIM_CheckNumOperands
Check the instruction has the right number of operands.
@ GIR_AddCImm
Add an CImm to the specified instruction.
@ GIR_ConstrainOperandRC
Constrain an instruction operand to a register class.
@ GIM_CheckI64ImmPredicate
Check an immediate predicate on the specified instruction.
@ GIR_AddImplicitDef
Add an implicit register def to the specified instruction.
@ GIM_CheckAPIntImmPredicate
Check an immediate predicate on the specified instruction via an APInt.
@ GIM_CheckHasNoUse
Check if there's no use of the first result.
@ GIM_CheckPointerToAny
Check the type of a pointer to any address space.
@ GIM_CheckMemorySizeEqualToLLT
Check the size of the memory access for the given machine memory operand against the size of an opera...
@ GIM_CheckComplexPattern
Check the operand matches a complex predicate.
@ GIR_CopyConstantAsSImm
Render a G_CONSTANT operator as a sign-extended immediate.
@ GIR_EraseFromParent
Erase from parent.
@ GIM_SwitchType
Switch over the LLT on the specified instruction operand.
@ GIR_CopySubReg
Copy an operand to the specified instruction.
@ GIR_MutateOpcode
Mutate an instruction.
@ GIM_CheckIsBuildVectorAllZeros
@ GIM_CheckAtomicOrderingOrStrongerThan
@ GIR_AddRegister
Add an register to the specified instruction.
@ GIR_AddTempSubRegister
Add a temporary register to the specified instruction.
@ GIM_CheckIsSafeToFold
Checks if the matched instructions numbered [1, 1+N) can be folded into the root (inst 0).
@ GIM_CheckOpcode
Check the opcode on the specified instruction.
@ GIR_ReplaceReg
Replaces all references to a register from an instruction with another register from another instruct...
@ GIM_SwitchOpcode
Switch over the opcode on the specified instruction.
@ GIM_CheckAPFloatImmPredicate
Check a floating point immediate predicate on the specified instruction.
@ GIM_CheckAllSameOperandIgnoreCopies
@ GIM_Reject
Fail the current try-block, or completely fail to match if there is no current try-block.
@ GIR_AddSimpleTempRegister
Add a temporary register to the specified instruction without setting any flags.
@ GIR_AddTempRegister
Add a temporary register to the specified instruction.
@ GIR_Copy
Copy an operand to the specified instruction.
@ GIR_AddImm
Add an immediate to the specified instruction.
@ GIR_CopyFConstantAsFPImm
Render a G_FCONSTANT operator as a sign-extended immediate.
@ GIU_NumOpcodes
Keeping track of the number of the GI opcodes. Must be the last entry.
@ GIR_CopyRemaining
Copies all operand starting from OpIdx in OldInsnID into the new instruction NewInsnID.
@ GIM_MIFlags
Check that a matched instruction has, or doesn't have a MIFlag.
@ GIR_CopyOrAddZeroReg
Copy an operand to the specified instruction or add a zero register if the operand is a zero immediat...
@ GIM_CheckMemoryAlignment
Check the minimum alignment of the memory access for the given machine memory operand.
@ GIM_CheckIsSameOperand
Check the specified operands are identical.
@ GIR_AddImm8
Add signed 8 bit immediate to the specified instruction.
@ GIM_CheckIsSameOperandIgnoreCopies
@ GIM_CheckIsMBB
Check the specified operand is an MBB.
@ GIM_CheckNumOperandsLE
Check the instruction has a number of operands <= or >= than given number.
@ GIM_CheckMemorySizeGreaterThanLLT
@ GIM_CheckRegBankForClass
Check the register bank for the specified operand.
@ GIM_CheckNumOperandsGE
@ GIM_CheckLiteralInt
Check the operand is a specific literal integer (i.e.
@ GIM_CheckMemorySizeLessThanLLT
@ GIM_RecordRegType
Records an operand's register type into the set of temporary types.
@ GIM_CheckHasOneUse
Check if there's one use of the first result.
@ GIM_CheckAllSameOperand
@ GIR_EraseRootFromParent_Done
Combines both a GIR_EraseFromParent 0 + GIR_Done.
@ GIR_CopyMIFlags
Copy the MIFlags of a matched instruction into an output instruction.
@ GIR_DoneWithCustomAction
Calls a C++ function that concludes the current match.
@ GIR_BuildMI
Build a new instruction.
@ GIM_RecordInsn
Record the specified instruction.
@ GIM_CheckIsImm
Check the specified operand is an Imm.
@ GIR_BuildRootMI
GIR_BuildMI but InsnID is omitted and defaults to zero.
@ GIM_CheckFeatures
Check the feature bits Feature(2) - Expected features.
@ GIM_CheckCanReplaceReg
Check we can replace all uses of a register with another.
@ GIM_CheckMemoryAddressSpace
Check the address space of the memory access for the given machine memory operand.
@ GIR_CustomRenderer
Render operands to the specified instruction using a custom function.
@ GIM_CheckAtomicOrdering
Check a memory operation has the specified atomic ordering.
@ GIM_CheckType
Check the type for the specified operand.
@ GIM_CheckConstantInt8
Check the operand is a specific 8-bit signed integer.
@ GIM_CheckCmpPredicate
Check the operand is a specific predicate.
@ GIM_CheckOpcodeIsEither
Check the opcode on the specified instruction, checking 2 acceptable alternatives.
@ GIR_SetImplicitDefDead
Marks the implicit def of a register as dead.
@ GIR_BuildConstant
Builds a constant and stores its result in a TempReg.
@ GIR_AddImplicitUse
Add an implicit register use to the specified instruction.
@ GIR_Coverage
Increment the rule coverage counter.
@ GIR_MergeMemOperands
Merge all memory operands into instruction.
@ GIM_CheckImmOperandPredicate
Check an immediate predicate on the specified instruction.
@ GIM_CheckAtomicOrderingWeakerThan
@ GIR_SetMIFlags
Set or unset a MIFlag on an instruction.
@ GIM_CheckIntrinsicID
Check the operand is a specific intrinsic ID.
@ GIM_CheckConstantInt
Check the operand is a specific integer.
@ GIR_RootToRootCopy
GIR_Copy but with both New/OldInsnIDs omitted and defaulting to zero.
@ GIR_ComplexSubOperandSubRegRenderer
Render subregisters of suboperands of complex operands to the specified instruction.
@ GIM_RecordInsnIgnoreCopies
@ GIR_CustomOperandRenderer
Render operands to the specified instruction using a custom function, reading from a specific operand...
@ GIR_ConstrainSelectedInstOperands
Constrain an instructions operands according to the instruction description.
@ GIM_CheckCxxInsnPredicate
Check a generic C++ instruction predicate.
@ GIM_CheckSimplePredicate
Check a trivial predicate which takes no arguments.
@ GICXXCustomAction_Invalid
bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
ExecInfoTy(const LLT *TypeObjects, size_t NumTypeObjects, const PredicateBitset *FeatureBitsets, const ComplexMatcherMemFn *ComplexPredicates, const CustomRendererFn *CustomRenderers)
SmallDenseMap< LLT, unsigned, 64 > TypeIDMap
const ComplexMatcherMemFn * ComplexPredicates
std::array< const MachineOperand *, 3 > RecordedOperands
Named operands that predicate with 'let PredicateCodeUsesOperands = 1' referenced in its argument lis...
SmallVector< LLT, 4 > RecordedTypes
Types extracted from an instruction's operand.
DenseMap< unsigned, unsigned > TempRegisters
std::vector< ComplexRendererFns::value_type > Renderers