LLVM 19.0.0git
BPFInstructionSelector.cpp
Go to the documentation of this file.
1//===- BPFInstructionSelector.cpp --------------------------------*- 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/// This file implements the targeting of the InstructionSelector class for BPF.
10//===----------------------------------------------------------------------===//
11
12#include "BPFInstrInfo.h"
13#include "BPFRegisterBankInfo.h"
14#include "BPFSubtarget.h"
15#include "BPFTargetMachine.h"
20#include "llvm/IR/IntrinsicsBPF.h"
21#include "llvm/Support/Debug.h"
22
23#define DEBUG_TYPE "bpf-gisel"
24
25using namespace llvm;
26
27namespace {
28
29#define GET_GLOBALISEL_PREDICATE_BITSET
30#include "BPFGenGlobalISel.inc"
31#undef GET_GLOBALISEL_PREDICATE_BITSET
32
33class BPFInstructionSelector : public InstructionSelector {
34public:
35 BPFInstructionSelector(const BPFTargetMachine &TM, const BPFSubtarget &STI,
36 const BPFRegisterBankInfo &RBI);
37
38 bool select(MachineInstr &I) override;
39 static const char *getName() { return DEBUG_TYPE; }
40
41private:
42 /// tblgen generated 'select' implementation that is used as the initial
43 /// selector for the patterns that do not require complex C++.
44 bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
45
46 const BPFInstrInfo &TII;
47 const BPFRegisterInfo &TRI;
48 const BPFRegisterBankInfo &RBI;
49
50#define GET_GLOBALISEL_PREDICATES_DECL
51#include "BPFGenGlobalISel.inc"
52#undef GET_GLOBALISEL_PREDICATES_DECL
53
54#define GET_GLOBALISEL_TEMPORARIES_DECL
55#include "BPFGenGlobalISel.inc"
56#undef GET_GLOBALISEL_TEMPORARIES_DECL
57};
58
59} // namespace
60
61#define GET_GLOBALISEL_IMPL
62#include "BPFGenGlobalISel.inc"
63#undef GET_GLOBALISEL_IMPL
64
65BPFInstructionSelector::BPFInstructionSelector(const BPFTargetMachine &TM,
66 const BPFSubtarget &STI,
67 const BPFRegisterBankInfo &RBI)
68 : TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), RBI(RBI),
70#include "BPFGenGlobalISel.inc"
73#include "BPFGenGlobalISel.inc"
75{
76}
77
78bool BPFInstructionSelector::select(MachineInstr &I) {
79 if (!isPreISelGenericOpcode(I.getOpcode()))
80 return true;
81 if (selectImpl(I, *CoverageInfo))
82 return true;
83 return false;
84}
85
86namespace llvm {
89 const BPFSubtarget &Subtarget,
90 const BPFRegisterBankInfo &RBI) {
91 return new BPFInstructionSelector(TM, Subtarget, RBI);
92}
93} // namespace llvm
#define GET_GLOBALISEL_PREDICATES_INIT
#define GET_GLOBALISEL_TEMPORARIES_INIT
This file declares the targeting of the RegisterBankInfo class for BPF.
#define DEBUG_TYPE
const HexagonInstrInfo * TII
#define I(x, y, z)
Definition: MD5.cpp:58
This file declares the MachineIRBuilder class.
unsigned const TargetRegisterInfo * TRI
const char LLVMTargetMachineRef TM
static StringRef getName(Value *V)
virtual bool select(MachineInstr &I)=0
Select the (possibly generic) instruction I to only use target-specific opcodes.
Representation of each machine instruction.
Definition: MachineInstr.h:69
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
bool isPreISelGenericOpcode(unsigned Opcode)
Check whether the given Opcode is a generic opcode that is not supposed to appear after ISel.
Definition: TargetOpcodes.h:30
InstructionSelector * createBPFInstructionSelector(const BPFTargetMachine &, const BPFSubtarget &, const BPFRegisterBankInfo &)