From 2460bf2facd1c0208ecda68c427a256710246dbb Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Mon, 11 Dec 2023 19:58:34 +0800 Subject: [PATCH] [BPF][GlobalISel] add initial gisel support for BPF (#74999) This adds initial codegen support for BPF backend. Only implemented ir-translator for "RET" (but not support isel). Depends on: #74998 --- llvm/lib/Target/BPF/BPF.h | 7 ++ llvm/lib/Target/BPF/BPF.td | 1 + llvm/lib/Target/BPF/BPFSubtarget.cpp | 28 ++++++ llvm/lib/Target/BPF/BPFSubtarget.h | 17 +++- llvm/lib/Target/BPF/BPFTargetMachine.cpp | 31 +++++++ llvm/lib/Target/BPF/CMakeLists.txt | 7 ++ llvm/lib/Target/BPF/GISel/BPFCallLowering.cpp | 46 ++++++++++ llvm/lib/Target/BPF/GISel/BPFCallLowering.h | 39 ++++++++ .../BPF/GISel/BPFInstructionSelector.cpp | 91 +++++++++++++++++++ .../lib/Target/BPF/GISel/BPFLegalizerInfo.cpp | 22 +++++ llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.h | 28 ++++++ .../Target/BPF/GISel/BPFRegisterBankInfo.cpp | 25 +++++ .../Target/BPF/GISel/BPFRegisterBankInfo.h | 39 ++++++++ llvm/lib/Target/BPF/GISel/BPFRegisterBanks.td | 15 +++ .../Target/BPF/MCTargetDesc/BPFMCTargetDesc.h | 5 +- .../BPF/GlobalISel/ir-translator-ret.ll | 7 ++ 16 files changed, 404 insertions(+), 4 deletions(-) create mode 100644 llvm/lib/Target/BPF/GISel/BPFCallLowering.cpp create mode 100644 llvm/lib/Target/BPF/GISel/BPFCallLowering.h create mode 100644 llvm/lib/Target/BPF/GISel/BPFInstructionSelector.cpp create mode 100644 llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.cpp create mode 100644 llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.h create mode 100644 llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.cpp create mode 100644 llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.h create mode 100644 llvm/lib/Target/BPF/GISel/BPFRegisterBanks.td create mode 100644 llvm/test/CodeGen/BPF/GlobalISel/ir-translator-ret.ll diff --git a/llvm/lib/Target/BPF/BPF.h b/llvm/lib/Target/BPF/BPF.h index 436cd62c25813..5c77d183e1ef3 100644 --- a/llvm/lib/Target/BPF/BPF.h +++ b/llvm/lib/Target/BPF/BPF.h @@ -16,7 +16,10 @@ #include "llvm/Target/TargetMachine.h" namespace llvm { +class BPFRegisterBankInfo; +class BPFSubtarget; class BPFTargetMachine; +class InstructionSelector; class PassRegistry; ModulePass *createBPFCheckAndAdjustIR(); @@ -27,6 +30,10 @@ FunctionPass *createBPFMIPeepholePass(); FunctionPass *createBPFMIPreEmitPeepholePass(); FunctionPass *createBPFMIPreEmitCheckingPass(); +InstructionSelector *createBPFInstructionSelector(const BPFTargetMachine &, + const BPFSubtarget &, + const BPFRegisterBankInfo &); + void initializeBPFCheckAndAdjustIRPass(PassRegistry&); void initializeBPFDAGToDAGISelPass(PassRegistry &); void initializeBPFMIPeepholePass(PassRegistry &); diff --git a/llvm/lib/Target/BPF/BPF.td b/llvm/lib/Target/BPF/BPF.td index 7f38fbdd8c5c1..dff76ca07af51 100644 --- a/llvm/lib/Target/BPF/BPF.td +++ b/llvm/lib/Target/BPF/BPF.td @@ -11,6 +11,7 @@ include "llvm/Target/Target.td" include "BPFRegisterInfo.td" include "BPFCallingConv.td" include "BPFInstrInfo.td" +include "GISel/BPFRegisterBanks.td" def BPFInstrInfo : InstrInfo; diff --git a/llvm/lib/Target/BPF/BPFSubtarget.cpp b/llvm/lib/Target/BPF/BPFSubtarget.cpp index 5e79142ea9e1c..9a8e42f323711 100644 --- a/llvm/lib/Target/BPF/BPFSubtarget.cpp +++ b/llvm/lib/Target/BPF/BPFSubtarget.cpp @@ -12,6 +12,10 @@ #include "BPFSubtarget.h" #include "BPF.h" +#include "BPFTargetMachine.h" +#include "GISel/BPFCallLowering.h" +#include "GISel/BPFLegalizerInfo.h" +#include "GISel/BPFRegisterBankInfo.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/TargetParser/Host.h" @@ -95,4 +99,28 @@ BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU, FrameLowering(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) { IsLittleEndian = TT.isLittleEndian(); + + CallLoweringInfo.reset(new BPFCallLowering(*getTargetLowering())); + Legalizer.reset(new BPFLegalizerInfo(*this)); + auto *RBI = new BPFRegisterBankInfo(*getRegisterInfo()); + RegBankInfo.reset(RBI); + + InstSelector.reset(createBPFInstructionSelector( + *static_cast(&TM), *this, *RBI)); +} + +const CallLowering *BPFSubtarget::getCallLowering() const { + return CallLoweringInfo.get(); +} + +InstructionSelector *BPFSubtarget::getInstructionSelector() const { + return InstSelector.get(); +} + +const LegalizerInfo *BPFSubtarget::getLegalizerInfo() const { + return Legalizer.get(); +} + +const RegisterBankInfo *BPFSubtarget::getRegBankInfo() const { + return RegBankInfo.get(); } diff --git a/llvm/lib/Target/BPF/BPFSubtarget.h b/llvm/lib/Target/BPF/BPFSubtarget.h index a55ae618f4d1d..33747546eadc3 100644 --- a/llvm/lib/Target/BPF/BPFSubtarget.h +++ b/llvm/lib/Target/BPF/BPFSubtarget.h @@ -16,7 +16,12 @@ #include "BPFFrameLowering.h" #include "BPFISelLowering.h" #include "BPFInstrInfo.h" +#include "BPFRegisterInfo.h" #include "BPFSelectionDAGInfo.h" +#include "llvm/CodeGen/GlobalISel/CallLowering.h" +#include "llvm/CodeGen/GlobalISel/InstructionSelector.h" +#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" +#include "llvm/CodeGen/RegisterBankInfo.h" #include "llvm/CodeGen/SelectionDAGTargetInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DataLayout.h" @@ -61,6 +66,11 @@ class BPFSubtarget : public BPFGenSubtargetInfo { // whether cpu v4 insns are enabled. bool HasLdsx, HasMovsx, HasBswap, HasSdivSmod, HasGotol, HasStoreImm; + std::unique_ptr CallLoweringInfo; + std::unique_ptr InstSelector; + std::unique_ptr Legalizer; + std::unique_ptr RegBankInfo; + public: // This constructor initializes the data members to match that // of the specified triple. @@ -95,9 +105,14 @@ class BPFSubtarget : public BPFGenSubtargetInfo { const BPFSelectionDAGInfo *getSelectionDAGInfo() const override { return &TSInfo; } - const TargetRegisterInfo *getRegisterInfo() const override { + const BPFRegisterInfo *getRegisterInfo() const override { return &InstrInfo.getRegisterInfo(); } + + const CallLowering *getCallLowering() const override; + InstructionSelector *getInstructionSelector() const override; + const LegalizerInfo *getLegalizerInfo() const override; + const RegisterBankInfo *getRegBankInfo() const override; }; } // End llvm namespace diff --git a/llvm/lib/Target/BPF/BPFTargetMachine.cpp b/llvm/lib/Target/BPF/BPFTargetMachine.cpp index 65286c822c4b5..ab0db576f7f72 100644 --- a/llvm/lib/Target/BPF/BPFTargetMachine.cpp +++ b/llvm/lib/Target/BPF/BPFTargetMachine.cpp @@ -15,10 +15,15 @@ #include "BPFTargetTransformInfo.h" #include "MCTargetDesc/BPFMCAsmInfo.h" #include "TargetInfo/BPFTargetInfo.h" +#include "llvm/CodeGen/GlobalISel/IRTranslator.h" +#include "llvm/CodeGen/GlobalISel/InstructionSelect.h" +#include "llvm/CodeGen/GlobalISel/Legalizer.h" +#include "llvm/CodeGen/GlobalISel/RegBankSelect.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/IR/PassManager.h" +#include "llvm/InitializePasses.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Passes/PassBuilder.h" #include "llvm/Support/FormattedStream.h" @@ -40,6 +45,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTarget() { RegisterTargetMachine Z(getTheBPFTarget()); PassRegistry &PR = *PassRegistry::getPassRegistry(); + initializeGlobalISel(PR); initializeBPFCheckAndAdjustIRPass(PR); initializeBPFMIPeepholePass(PR); initializeBPFDAGToDAGISelPass(PR); @@ -90,6 +96,11 @@ class BPFPassConfig : public TargetPassConfig { bool addInstSelector() override; void addMachineSSAOptimization() override; void addPreEmitPass() override; + + bool addIRTranslator() override; + bool addLegalizeMachineIR() override; + bool addRegBankSelect() override; + bool addGlobalInstructionSelect() override; }; } @@ -174,3 +185,23 @@ void BPFPassConfig::addPreEmitPass() { if (!DisableMIPeephole) addPass(createBPFMIPreEmitPeepholePass()); } + +bool BPFPassConfig::addIRTranslator() { + addPass(new IRTranslator()); + return false; +} + +bool BPFPassConfig::addLegalizeMachineIR() { + addPass(new Legalizer()); + return false; +} + +bool BPFPassConfig::addRegBankSelect() { + addPass(new RegBankSelect()); + return false; +} + +bool BPFPassConfig::addGlobalInstructionSelect() { + addPass(new InstructionSelect(getOptLevel())); + return false; +} diff --git a/llvm/lib/Target/BPF/CMakeLists.txt b/llvm/lib/Target/BPF/CMakeLists.txt index 6a96394a6aee3..d88e7ade40b9a 100644 --- a/llvm/lib/Target/BPF/CMakeLists.txt +++ b/llvm/lib/Target/BPF/CMakeLists.txt @@ -11,10 +11,16 @@ tablegen(LLVM BPFGenInstrInfo.inc -gen-instr-info) tablegen(LLVM BPFGenMCCodeEmitter.inc -gen-emitter) tablegen(LLVM BPFGenRegisterInfo.inc -gen-register-info) tablegen(LLVM BPFGenSubtargetInfo.inc -gen-subtarget) +tablegen(LLVM BPFGenGlobalISel.inc -gen-global-isel) +tablegen(LLVM BPFGenRegisterBank.inc -gen-register-bank) add_public_tablegen_target(BPFCommonTableGen) add_llvm_target(BPFCodeGen + GISel/BPFCallLowering.cpp + GISel/BPFInstructionSelector.cpp + GISel/BPFRegisterBankInfo.cpp + GISel/BPFLegalizerInfo.cpp BPFAbstractMemberAccess.cpp BPFAdjustOpt.cpp BPFAsmPrinter.cpp @@ -44,6 +50,7 @@ add_llvm_target(BPFCodeGen CodeGen CodeGenTypes Core + GlobalISel IPO MC Scalar diff --git a/llvm/lib/Target/BPF/GISel/BPFCallLowering.cpp b/llvm/lib/Target/BPF/GISel/BPFCallLowering.cpp new file mode 100644 index 0000000000000..3829a1a3151f3 --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFCallLowering.cpp @@ -0,0 +1,46 @@ +//===-- BPFCallLowering.cpp - Call lowering for GlobalISel ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file implements the lowering of LLVM calls to machine code calls for +/// GlobalISel. +/// +//===----------------------------------------------------------------------===// + +#include "BPFCallLowering.h" +#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" +#include "llvm/Support/Debug.h" + +#define DEBUG_TYPE "bpf-call-lowering" + +using namespace llvm; + +BPFCallLowering::BPFCallLowering(const BPFTargetLowering &TLI) + : CallLowering(&TLI) {} + +bool BPFCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder, + const Value *Val, ArrayRef VRegs, + FunctionLoweringInfo &FLI, + Register SwiftErrorVReg) const { + if (!VRegs.empty()) + return false; + MIRBuilder.buildInstr(BPF::RET); + return true; +} + +bool BPFCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, + const Function &F, + ArrayRef> VRegs, + FunctionLoweringInfo &FLI) const { + return VRegs.empty(); +} + +bool BPFCallLowering::lowerCall(MachineIRBuilder &MIRBuilder, + CallLoweringInfo &Info) const { + return false; +} diff --git a/llvm/lib/Target/BPF/GISel/BPFCallLowering.h b/llvm/lib/Target/BPF/GISel/BPFCallLowering.h new file mode 100644 index 0000000000000..0099d2048fe52 --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFCallLowering.h @@ -0,0 +1,39 @@ +//===-- BPFCallLowering.h - Call lowering for GlobalISel --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file describes how to lower LLVM calls to machine code calls. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_BPF_GISEL_BPFCALLLOWERING_H +#define LLVM_LIB_TARGET_BPF_GISEL_BPFCALLLOWERING_H + +#include "BPFISelLowering.h" +#include "llvm/CodeGen/GlobalISel/CallLowering.h" +#include "llvm/IR/CallingConv.h" + +namespace llvm { + +class BPFTargetLowering; + +class BPFCallLowering : public CallLowering { +public: + BPFCallLowering(const BPFTargetLowering &TLI); + bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, + ArrayRef VRegs, FunctionLoweringInfo &FLI, + Register SwiftErrorVReg) const override; + bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, + ArrayRef> VRegs, + FunctionLoweringInfo &FLI) const override; + bool lowerCall(MachineIRBuilder &MIRBuilder, + CallLoweringInfo &Info) const override; +}; +} // namespace llvm + +#endif diff --git a/llvm/lib/Target/BPF/GISel/BPFInstructionSelector.cpp b/llvm/lib/Target/BPF/GISel/BPFInstructionSelector.cpp new file mode 100644 index 0000000000000..1effeb7a57b13 --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFInstructionSelector.cpp @@ -0,0 +1,91 @@ +//===- BPFInstructionSelector.cpp --------------------------------*- C++ -*-==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// This file implements the targeting of the InstructionSelector class for BPF. +//===----------------------------------------------------------------------===// + +#include "BPFInstrInfo.h" +#include "BPFRegisterBankInfo.h" +#include "BPFSubtarget.h" +#include "BPFTargetMachine.h" +#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h" +#include "llvm/CodeGen/GlobalISel/InstructionSelector.h" +#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/IR/IntrinsicsBPF.h" +#include "llvm/Support/Debug.h" + +#define DEBUG_TYPE "bpf-gisel" + +using namespace llvm; + +namespace { + +#define GET_GLOBALISEL_PREDICATE_BITSET +#include "BPFGenGlobalISel.inc" +#undef GET_GLOBALISEL_PREDICATE_BITSET + +class BPFInstructionSelector : public InstructionSelector { +public: + BPFInstructionSelector(const BPFTargetMachine &TM, const BPFSubtarget &STI, + const BPFRegisterBankInfo &RBI); + + bool select(MachineInstr &I) override; + static const char *getName() { return DEBUG_TYPE; } + +private: + /// tblgen generated 'select' implementation that is used as the initial + /// selector for the patterns that do not require complex C++. + bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; + + const BPFInstrInfo &TII; + const BPFRegisterInfo &TRI; + const BPFRegisterBankInfo &RBI; + +#define GET_GLOBALISEL_PREDICATES_DECL +#include "BPFGenGlobalISel.inc" +#undef GET_GLOBALISEL_PREDICATES_DECL + +#define GET_GLOBALISEL_TEMPORARIES_DECL +#include "BPFGenGlobalISel.inc" +#undef GET_GLOBALISEL_TEMPORARIES_DECL +}; + +} // namespace + +#define GET_GLOBALISEL_IMPL +#include "BPFGenGlobalISel.inc" +#undef GET_GLOBALISEL_IMPL + +BPFInstructionSelector::BPFInstructionSelector(const BPFTargetMachine &TM, + const BPFSubtarget &STI, + const BPFRegisterBankInfo &RBI) + : TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), RBI(RBI), +#define GET_GLOBALISEL_PREDICATES_INIT +#include "BPFGenGlobalISel.inc" +#undef GET_GLOBALISEL_PREDICATES_INIT +#define GET_GLOBALISEL_TEMPORARIES_INIT +#include "BPFGenGlobalISel.inc" +#undef GET_GLOBALISEL_TEMPORARIES_INIT +{ +} + +bool BPFInstructionSelector::select(MachineInstr &I) { + if (selectImpl(I, *CoverageInfo)) + return true; + return false; +} + +namespace llvm { +InstructionSelector * +createBPFInstructionSelector(const BPFTargetMachine &TM, + const BPFSubtarget &Subtarget, + const BPFRegisterBankInfo &RBI) { + return new BPFInstructionSelector(TM, Subtarget, RBI); +} +} // namespace llvm diff --git a/llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.cpp b/llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.cpp new file mode 100644 index 0000000000000..04220c176376d --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.cpp @@ -0,0 +1,22 @@ +//===- BPFLegalizerInfo.h ----------------------------------------*- C++ -*-==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// This file implements the targeting of the Machinelegalizer class for BPF +//===----------------------------------------------------------------------===// + +#include "BPFLegalizerInfo.h" +#include "llvm/Support/Debug.h" + +#define DEBUG_TYPE "bpf-legalinfo" + +using namespace llvm; +using namespace LegalizeActions; + +BPFLegalizerInfo::BPFLegalizerInfo(const BPFSubtarget &ST) { + getLegacyLegalizerInfo().computeTables(); +} diff --git a/llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.h b/llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.h new file mode 100644 index 0000000000000..1704bc03144c6 --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFLegalizerInfo.h @@ -0,0 +1,28 @@ +//===- BPFLegalizerInfo.h ----------------------------------------*- C++ -*-==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// This file declares the targeting of the Machinelegalizer class for BPF +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_BPF_GISEL_BPFMACHINELEGALIZER_H +#define LLVM_LIB_TARGET_BPF_GISEL_BPFMACHINELEGALIZER_H + +#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" + +namespace llvm { + +class BPFSubtarget; + +/// This class provides the information for the BPF target legalizer for +/// GlobalISel. +class BPFLegalizerInfo : public LegalizerInfo { +public: + BPFLegalizerInfo(const BPFSubtarget &ST); +}; +} // namespace llvm +#endif diff --git a/llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.cpp b/llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.cpp new file mode 100644 index 0000000000000..f50e8f524a872 --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.cpp @@ -0,0 +1,25 @@ +//===- BPFRegisterBankInfo.cpp --------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// This file implements the targeting of the RegisterBankInfo class for BPF +//===----------------------------------------------------------------------===// + +#include "BPFRegisterBankInfo.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/Support/Debug.h" + +#define DEBUG_TYPE "bpf-reg-bank-info" + +#define GET_TARGET_REGBANK_IMPL +#include "BPFGenRegisterBank.inc" + +using namespace llvm; + +BPFRegisterBankInfo::BPFRegisterBankInfo(const TargetRegisterInfo &TRI) + : BPFGenRegisterBankInfo() {} diff --git a/llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.h b/llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.h new file mode 100644 index 0000000000000..82421916ca5ed --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFRegisterBankInfo.h @@ -0,0 +1,39 @@ +//===-- BPFRegisterBankInfo.h -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file declares the targeting of the RegisterBankInfo class for BPF. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_BPF_GISEL_BPFREGISTERBANKINFO_H +#define LLVM_LIB_TARGET_BPF_GISEL_BPFREGISTERBANKINFO_H + +#include "MCTargetDesc/BPFMCTargetDesc.h" +#include "llvm/CodeGen/RegisterBankInfo.h" +#include "llvm/CodeGen/TargetRegisterInfo.h" + +#define GET_REGBANK_DECLARATIONS +#include "BPFGenRegisterBank.inc" + +namespace llvm { +class TargetRegisterInfo; + +class BPFGenRegisterBankInfo : public RegisterBankInfo { +protected: +#define GET_TARGET_REGBANK_CLASS +#include "BPFGenRegisterBank.inc" +}; + +class BPFRegisterBankInfo final : public BPFGenRegisterBankInfo { +public: + BPFRegisterBankInfo(const TargetRegisterInfo &TRI); +}; +} // namespace llvm + +#endif diff --git a/llvm/lib/Target/BPF/GISel/BPFRegisterBanks.td b/llvm/lib/Target/BPF/GISel/BPFRegisterBanks.td new file mode 100644 index 0000000000000..af4af40a25376 --- /dev/null +++ b/llvm/lib/Target/BPF/GISel/BPFRegisterBanks.td @@ -0,0 +1,15 @@ +//===-- BPFRegisterBanks.td - Describe the BPF Banks -------*- tablegen -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// Define the BPF register banks used for GlobalISel. +/// +//===----------------------------------------------------------------------===// + +/// General Purpose Registers +def GPRRegBank : RegisterBank<"GPRB", [GPR]>; diff --git a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h index ea30e714a5b75..f12b79586bafe 100644 --- a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h +++ b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h @@ -30,8 +30,7 @@ class MCSubtargetInfo; class MCTargetOptions; class Target; -MCCodeEmitter *createBPFMCCodeEmitter(const MCInstrInfo &MCII, - MCContext &Ctx); +MCCodeEmitter *createBPFMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx); MCCodeEmitter *createBPFbeMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx); @@ -43,7 +42,7 @@ MCAsmBackend *createBPFbeAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCTargetOptions &Options); std::unique_ptr createBPFELFObjectWriter(uint8_t OSABI); -} +} // namespace llvm // Defines symbolic names for BPF registers. This defines a mapping from // register name to register number. diff --git a/llvm/test/CodeGen/BPF/GlobalISel/ir-translator-ret.ll b/llvm/test/CodeGen/BPF/GlobalISel/ir-translator-ret.ll new file mode 100644 index 0000000000000..7a014f7841fc8 --- /dev/null +++ b/llvm/test/CodeGen/BPF/GlobalISel/ir-translator-ret.ll @@ -0,0 +1,7 @@ +; RUN: llc -mtriple=bpfel -global-isel -verify-machineinstrs -stop-after=irtranslator < %s | FileCheck %s + +; CHECK: name: f +; CHECK: RET +define void @f() { + ret void +}