mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[RISCV GlobalISel] Adding initial GlobalISel infrastructure
Summary: Add an initial GlobalISel skeleton for RISCV. It can only run ir translator for `ret void`. Patch by Andrew Wei Reviewers: asb, sabuasal, apazos, lenary, simoncook, lewis-revill, edward-jones, rogfer01, xiangzhai, rovka, Petar.Avramovic, mgorny, dsanders Reviewed By: dsanders Subscribers: pzheng, s.egerton, dsanders, hiraditya, rbar, johnrusso, niosHD, kito-cheng, shiva0217, jrtc27, MaskRay, zzheng, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, psnobl, benna, Jim, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D65219 llvm-svn: 369467
This commit is contained in:
parent
ef6d06c374
commit
f46165f928
@ -5,9 +5,11 @@ tablegen(LLVM RISCVGenAsmWriter.inc -gen-asm-writer)
|
||||
tablegen(LLVM RISCVGenCompressInstEmitter.inc -gen-compress-inst-emitter)
|
||||
tablegen(LLVM RISCVGenDAGISel.inc -gen-dag-isel)
|
||||
tablegen(LLVM RISCVGenDisassemblerTables.inc -gen-disassembler)
|
||||
tablegen(LLVM RISCVGenGlobalISel.inc -gen-global-isel)
|
||||
tablegen(LLVM RISCVGenInstrInfo.inc -gen-instr-info)
|
||||
tablegen(LLVM RISCVGenMCCodeEmitter.inc -gen-emitter)
|
||||
tablegen(LLVM RISCVGenMCPseudoLowering.inc -gen-pseudo-lowering)
|
||||
tablegen(LLVM RISCVGenRegisterBank.inc -gen-register-bank)
|
||||
tablegen(LLVM RISCVGenRegisterInfo.inc -gen-register-info)
|
||||
tablegen(LLVM RISCVGenSubtargetInfo.inc -gen-subtarget)
|
||||
tablegen(LLVM RISCVGenSystemOperands.inc -gen-searchable-tables)
|
||||
@ -16,13 +18,17 @@ add_public_tablegen_target(RISCVCommonTableGen)
|
||||
|
||||
add_llvm_target(RISCVCodeGen
|
||||
RISCVAsmPrinter.cpp
|
||||
RISCVCallLowering.cpp
|
||||
RISCVExpandPseudoInsts.cpp
|
||||
RISCVFrameLowering.cpp
|
||||
RISCVInstrInfo.cpp
|
||||
RISCVInstructionSelector.cpp
|
||||
RISCVISelDAGToDAG.cpp
|
||||
RISCVISelLowering.cpp
|
||||
RISCVLegalizerInfo.cpp
|
||||
RISCVMCInstLower.cpp
|
||||
RISCVMergeBaseOffset.cpp
|
||||
RISCVRegisterBankInfo.cpp
|
||||
RISCVRegisterInfo.cpp
|
||||
RISCVSubtarget.cpp
|
||||
RISCVTargetMachine.cpp
|
||||
|
@ -30,5 +30,5 @@ type = Library
|
||||
name = RISCVCodeGen
|
||||
parent = RISCV
|
||||
required_libraries = Analysis AsmPrinter Core CodeGen MC RISCVDesc
|
||||
RISCVInfo RISCVUtils SelectionDAG Support Target
|
||||
RISCVInfo RISCVUtils SelectionDAG Support Target GlobalISel
|
||||
add_to_library_groups = RISCV
|
||||
|
@ -18,9 +18,12 @@
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
|
||||
namespace llvm {
|
||||
class RISCVRegisterBankInfo;
|
||||
class RISCVSubtarget;
|
||||
class RISCVTargetMachine;
|
||||
class AsmPrinter;
|
||||
class FunctionPass;
|
||||
class InstructionSelector;
|
||||
class MCInst;
|
||||
class MCOperand;
|
||||
class MachineInstr;
|
||||
@ -39,6 +42,10 @@ void initializeRISCVMergeBaseOffsetOptPass(PassRegistry &);
|
||||
|
||||
FunctionPass *createRISCVExpandPseudoPass();
|
||||
void initializeRISCVExpandPseudoPass(PassRegistry &);
|
||||
|
||||
InstructionSelector *createRISCVInstructionSelector(const RISCVTargetMachine &,
|
||||
RISCVSubtarget &,
|
||||
RISCVRegisterBankInfo &);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -77,6 +77,7 @@ include "RISCVSystemOperands.td"
|
||||
include "RISCVRegisterInfo.td"
|
||||
include "RISCVCallingConv.td"
|
||||
include "RISCVInstrInfo.td"
|
||||
include "RISCVRegisterBanks.td"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// RISC-V processors supported.
|
||||
|
50
lib/Target/RISCV/RISCVCallLowering.cpp
Normal file
50
lib/Target/RISCV/RISCVCallLowering.cpp
Normal file
@ -0,0 +1,50 @@
|
||||
//===-- RISCVCallLowering.cpp - Call lowering -------------------*- 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 "RISCVCallLowering.h"
|
||||
#include "RISCVISelLowering.h"
|
||||
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
RISCVCallLowering::RISCVCallLowering(const RISCVTargetLowering &TLI)
|
||||
: CallLowering(&TLI) {}
|
||||
|
||||
bool RISCVCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
|
||||
const Value *Val,
|
||||
ArrayRef<Register> VRegs) const {
|
||||
|
||||
MachineInstrBuilder Ret = MIRBuilder.buildInstrNoInsert(RISCV::PseudoRET);
|
||||
|
||||
if (Val != nullptr) {
|
||||
return false;
|
||||
}
|
||||
MIRBuilder.insertInstr(Ret);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RISCVCallLowering::lowerFormalArguments(
|
||||
MachineIRBuilder &MIRBuilder, const Function &F,
|
||||
ArrayRef<ArrayRef<Register>> VRegs) const {
|
||||
|
||||
if (F.arg_empty())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
|
||||
CallLoweringInfo &Info) const {
|
||||
return false;
|
||||
}
|
42
lib/Target/RISCV/RISCVCallLowering.h
Normal file
42
lib/Target/RISCV/RISCVCallLowering.h
Normal file
@ -0,0 +1,42 @@
|
||||
//===-- RISCVCallLowering.h - Call lowering ---------------------*- 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_RISCV_RISCVCALLLOWERING_H
|
||||
#define LLVM_LIB_TARGET_RISCV_RISCVCALLLOWERING_H
|
||||
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class RISCVTargetLowering;
|
||||
|
||||
class RISCVCallLowering : public CallLowering {
|
||||
|
||||
public:
|
||||
RISCVCallLowering(const RISCVTargetLowering &TLI);
|
||||
|
||||
bool lowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val,
|
||||
ArrayRef<Register> VRegs) const override;
|
||||
|
||||
bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
|
||||
ArrayRef<ArrayRef<Register>> VRegs) const override;
|
||||
|
||||
bool lowerCall(MachineIRBuilder &MIRBuilder,
|
||||
CallLoweringInfo &Info) const override;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_LIB_TARGET_RISCV_RISCVCALLLOWERING_H
|
103
lib/Target/RISCV/RISCVInstructionSelector.cpp
Normal file
103
lib/Target/RISCV/RISCVInstructionSelector.cpp
Normal file
@ -0,0 +1,103 @@
|
||||
//===-- RISCVInstructionSelector.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
|
||||
/// RISCV.
|
||||
/// \todo This should be generated by TableGen.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "RISCVRegisterBankInfo.h"
|
||||
#include "RISCVSubtarget.h"
|
||||
#include "RISCVTargetMachine.h"
|
||||
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
|
||||
#include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
||||
#define DEBUG_TYPE "riscv-isel"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define GET_GLOBALISEL_PREDICATE_BITSET
|
||||
#include "RISCVGenGlobalISel.inc"
|
||||
#undef GET_GLOBALISEL_PREDICATE_BITSET
|
||||
|
||||
namespace {
|
||||
|
||||
class RISCVInstructionSelector : public InstructionSelector {
|
||||
public:
|
||||
RISCVInstructionSelector(const RISCVTargetMachine &TM,
|
||||
const RISCVSubtarget &STI,
|
||||
const RISCVRegisterBankInfo &RBI);
|
||||
|
||||
bool select(MachineInstr &I) override;
|
||||
static const char *getName() { return DEBUG_TYPE; }
|
||||
|
||||
private:
|
||||
bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
|
||||
|
||||
const RISCVSubtarget &STI;
|
||||
const RISCVInstrInfo &TII;
|
||||
const RISCVRegisterInfo &TRI;
|
||||
const RISCVRegisterBankInfo &RBI;
|
||||
|
||||
// FIXME: This is necessary because DAGISel uses "Subtarget->" and GlobalISel
|
||||
// uses "STI." in the code generated by TableGen. We need to unify the name of
|
||||
// Subtarget variable.
|
||||
const RISCVSubtarget *Subtarget = &STI;
|
||||
|
||||
#define GET_GLOBALISEL_PREDICATES_DECL
|
||||
#include "RISCVGenGlobalISel.inc"
|
||||
#undef GET_GLOBALISEL_PREDICATES_DECL
|
||||
|
||||
#define GET_GLOBALISEL_TEMPORARIES_DECL
|
||||
#include "RISCVGenGlobalISel.inc"
|
||||
#undef GET_GLOBALISEL_TEMPORARIES_DECL
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
#define GET_GLOBALISEL_IMPL
|
||||
#include "RISCVGenGlobalISel.inc"
|
||||
#undef GET_GLOBALISEL_IMPL
|
||||
|
||||
RISCVInstructionSelector::RISCVInstructionSelector(
|
||||
const RISCVTargetMachine &TM, const RISCVSubtarget &STI,
|
||||
const RISCVRegisterBankInfo &RBI)
|
||||
: InstructionSelector(), STI(STI), TII(*STI.getInstrInfo()),
|
||||
TRI(*STI.getRegisterInfo()), RBI(RBI),
|
||||
|
||||
#define GET_GLOBALISEL_PREDICATES_INIT
|
||||
#include "RISCVGenGlobalISel.inc"
|
||||
#undef GET_GLOBALISEL_PREDICATES_INIT
|
||||
#define GET_GLOBALISEL_TEMPORARIES_INIT
|
||||
#include "RISCVGenGlobalISel.inc"
|
||||
#undef GET_GLOBALISEL_TEMPORARIES_INIT
|
||||
{
|
||||
}
|
||||
|
||||
bool RISCVInstructionSelector::select(MachineInstr &I) {
|
||||
|
||||
if (!isPreISelGenericOpcode(I.getOpcode())) {
|
||||
// Certain non-generic instructions also need some special handling.
|
||||
return true;
|
||||
}
|
||||
|
||||
if (selectImpl(I, *CoverageInfo))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
InstructionSelector *
|
||||
createRISCVInstructionSelector(const RISCVTargetMachine &TM,
|
||||
RISCVSubtarget &Subtarget,
|
||||
RISCVRegisterBankInfo &RBI) {
|
||||
return new RISCVInstructionSelector(TM, Subtarget, RBI);
|
||||
}
|
||||
} // end namespace llvm
|
23
lib/Target/RISCV/RISCVLegalizerInfo.cpp
Normal file
23
lib/Target/RISCV/RISCVLegalizerInfo.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
//===-- RISCVLegalizerInfo.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 Machinelegalizer class for RISCV.
|
||||
/// \todo This should be generated by TableGen.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "RISCVLegalizerInfo.h"
|
||||
#include "llvm/CodeGen/TargetOpcodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
|
||||
computeTables();
|
||||
}
|
28
lib/Target/RISCV/RISCVLegalizerInfo.h
Normal file
28
lib/Target/RISCV/RISCVLegalizerInfo.h
Normal file
@ -0,0 +1,28 @@
|
||||
//===-- RISCVLegalizerInfo.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 RISCV.
|
||||
/// \todo This should be generated by TableGen.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_RISCV_RISCVMACHINELEGALIZER_H
|
||||
#define LLVM_LIB_TARGET_RISCV_RISCVMACHINELEGALIZER_H
|
||||
|
||||
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class RISCVSubtarget;
|
||||
|
||||
/// This class provides the information for the target register banks.
|
||||
class RISCVLegalizerInfo : public LegalizerInfo {
|
||||
public:
|
||||
RISCVLegalizerInfo(const RISCVSubtarget &ST);
|
||||
};
|
||||
} // end namespace llvm
|
||||
#endif
|
26
lib/Target/RISCV/RISCVRegisterBankInfo.cpp
Normal file
26
lib/Target/RISCV/RISCVRegisterBankInfo.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
//===-- RISCVRegisterBankInfo.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 RegisterBankInfo class for RISCV.
|
||||
/// \todo This should be generated by TableGen.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "RISCVRegisterBankInfo.h"
|
||||
#include "MCTargetDesc/RISCVMCTargetDesc.h"
|
||||
#include "llvm/CodeGen/GlobalISel/RegisterBank.h"
|
||||
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/TargetRegisterInfo.h"
|
||||
|
||||
#define GET_TARGET_REGBANK_IMPL
|
||||
#include "RISCVGenRegisterBank.inc"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
RISCVRegisterBankInfo::RISCVRegisterBankInfo(const TargetRegisterInfo &TRI)
|
||||
: RISCVGenRegisterBankInfo() {}
|
37
lib/Target/RISCV/RISCVRegisterBankInfo.h
Normal file
37
lib/Target/RISCV/RISCVRegisterBankInfo.h
Normal file
@ -0,0 +1,37 @@
|
||||
//===-- RISCVRegisterBankInfo.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 RISCV.
|
||||
/// \todo This should be generated by TableGen.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_RISCV_RISCVREGISTERBANKINFO_H
|
||||
#define LLVM_LIB_TARGET_RISCV_RISCVREGISTERBANKINFO_H
|
||||
|
||||
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
|
||||
|
||||
#define GET_REGBANK_DECLARATIONS
|
||||
#include "RISCVGenRegisterBank.inc"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class TargetRegisterInfo;
|
||||
|
||||
class RISCVGenRegisterBankInfo : public RegisterBankInfo {
|
||||
protected:
|
||||
#define GET_TARGET_REGBANK_CLASS
|
||||
#include "RISCVGenRegisterBank.inc"
|
||||
};
|
||||
|
||||
/// This class provides the information for the target register banks.
|
||||
class RISCVRegisterBankInfo final : public RISCVGenRegisterBankInfo {
|
||||
public:
|
||||
RISCVRegisterBankInfo(const TargetRegisterInfo &TRI);
|
||||
};
|
||||
} // end namespace llvm
|
||||
#endif
|
13
lib/Target/RISCV/RISCVRegisterBanks.td
Normal file
13
lib/Target/RISCV/RISCVRegisterBanks.td
Normal file
@ -0,0 +1,13 @@
|
||||
//=-- RISCVRegisterBank.td - Describe the RISCV 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// General Purpose Registers: X.
|
||||
def GPRRegBank : RegisterBank<"GPRB", [GPR]>;
|
@ -12,7 +12,11 @@
|
||||
|
||||
#include "RISCVSubtarget.h"
|
||||
#include "RISCV.h"
|
||||
#include "RISCVCallLowering.h"
|
||||
#include "RISCVFrameLowering.h"
|
||||
#include "RISCVLegalizerInfo.h"
|
||||
#include "RISCVRegisterBankInfo.h"
|
||||
#include "RISCVTargetMachine.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -47,4 +51,28 @@ RISCVSubtarget::RISCVSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
|
||||
StringRef ABIName, const TargetMachine &TM)
|
||||
: RISCVGenSubtargetInfo(TT, CPU, FS),
|
||||
FrameLowering(initializeSubtargetDependencies(TT, CPU, FS, ABIName)),
|
||||
InstrInfo(), RegInfo(getHwMode()), TLInfo(TM, *this) {}
|
||||
InstrInfo(), RegInfo(getHwMode()), TLInfo(TM, *this) {
|
||||
CallLoweringInfo.reset(new RISCVCallLowering(*getTargetLowering()));
|
||||
Legalizer.reset(new RISCVLegalizerInfo(*this));
|
||||
|
||||
auto *RBI = new RISCVRegisterBankInfo(*getRegisterInfo());
|
||||
RegBankInfo.reset(RBI);
|
||||
InstSelector.reset(createRISCVInstructionSelector(
|
||||
*static_cast<const RISCVTargetMachine *>(&TM), *this, *RBI));
|
||||
}
|
||||
|
||||
const CallLowering *RISCVSubtarget::getCallLowering() const {
|
||||
return CallLoweringInfo.get();
|
||||
}
|
||||
|
||||
InstructionSelector *RISCVSubtarget::getInstructionSelector() const {
|
||||
return InstSelector.get();
|
||||
}
|
||||
|
||||
const LegalizerInfo *RISCVSubtarget::getLegalizerInfo() const {
|
||||
return Legalizer.get();
|
||||
}
|
||||
|
||||
const RegisterBankInfo *RISCVSubtarget::getRegBankInfo() const {
|
||||
return RegBankInfo.get();
|
||||
}
|
||||
|
@ -17,6 +17,10 @@
|
||||
#include "RISCVISelLowering.h"
|
||||
#include "RISCVInstrInfo.h"
|
||||
#include "Utils/RISCVBaseInfo.h"
|
||||
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
|
||||
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
|
||||
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
|
||||
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
|
||||
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
@ -86,6 +90,19 @@ public:
|
||||
MVT getXLenVT() const { return XLenVT; }
|
||||
unsigned getXLen() const { return XLen; }
|
||||
RISCVABI::ABI getTargetABI() const { return TargetABI; }
|
||||
|
||||
protected:
|
||||
// GlobalISel related APIs.
|
||||
std::unique_ptr<CallLowering> CallLoweringInfo;
|
||||
std::unique_ptr<InstructionSelector> InstSelector;
|
||||
std::unique_ptr<LegalizerInfo> Legalizer;
|
||||
std::unique_ptr<RegisterBankInfo> RegBankInfo;
|
||||
|
||||
public:
|
||||
const CallLowering *getCallLowering() const override;
|
||||
InstructionSelector *getInstructionSelector() const override;
|
||||
const LegalizerInfo *getLegalizerInfo() const override;
|
||||
const RegisterBankInfo *getRegBankInfo() const override;
|
||||
};
|
||||
} // End llvm namespace
|
||||
|
||||
|
@ -17,6 +17,10 @@
|
||||
#include "TargetInfo/RISCVTargetInfo.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Analysis/TargetTransformInfo.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"
|
||||
@ -30,6 +34,7 @@ extern "C" void LLVMInitializeRISCVTarget() {
|
||||
RegisterTargetMachine<RISCVTargetMachine> X(getTheRISCV32Target());
|
||||
RegisterTargetMachine<RISCVTargetMachine> Y(getTheRISCV64Target());
|
||||
auto PR = PassRegistry::getPassRegistry();
|
||||
initializeGlobalISel(*PR);
|
||||
initializeRISCVExpandPseudoPass(*PR);
|
||||
}
|
||||
|
||||
@ -80,6 +85,10 @@ public:
|
||||
|
||||
void addIRPasses() override;
|
||||
bool addInstSelector() override;
|
||||
bool addIRTranslator() override;
|
||||
bool addLegalizeMachineIR() override;
|
||||
bool addRegBankSelect() override;
|
||||
bool addGlobalInstructionSelect() override;
|
||||
void addPreEmitPass() override;
|
||||
void addPreEmitPass2() override;
|
||||
void addPreRegAlloc() override;
|
||||
@ -101,6 +110,26 @@ bool RISCVPassConfig::addInstSelector() {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RISCVPassConfig::addIRTranslator() {
|
||||
addPass(new IRTranslator());
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RISCVPassConfig::addLegalizeMachineIR() {
|
||||
addPass(new Legalizer());
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RISCVPassConfig::addRegBankSelect() {
|
||||
addPass(new RegBankSelect());
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RISCVPassConfig::addGlobalInstructionSelect() {
|
||||
addPass(new InstructionSelect());
|
||||
return false;
|
||||
}
|
||||
|
||||
void RISCVPassConfig::addPreEmitPass() { addPass(&BranchRelaxationPassID); }
|
||||
|
||||
void RISCVPassConfig::addPreEmitPass2() {
|
||||
|
17
test/CodeGen/RISCV/GlobalISel/calllowering-ret.ll
Normal file
17
test/CodeGen/RISCV/GlobalISel/calllowering-ret.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=riscv32 -global-isel -verify-machineinstrs < %s \
|
||||
; RUN: | FileCheck -check-prefix=RV32I %s
|
||||
; RUN: llc -mtriple=riscv64 -global-isel -verify-machineinstrs < %s \
|
||||
; RUN: | FileCheck -check-prefix=RV64I %s
|
||||
|
||||
define void @foo() {
|
||||
; RV32I-LABEL: foo
|
||||
; RV32I: # %bb.0: # %entry
|
||||
; RV32I: ret
|
||||
|
||||
; RV64I-LABEL: foo
|
||||
; RV64I: # %bb.0: # %entry
|
||||
; RV64I: ret
|
||||
entry:
|
||||
ret void
|
||||
}
|
17
test/CodeGen/RISCV/GlobalISel/irtranslator-calllowering.ll
Normal file
17
test/CodeGen/RISCV/GlobalISel/irtranslator-calllowering.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=riscv32 -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \
|
||||
; RUN: | FileCheck -check-prefix=RV32I %s
|
||||
; RUN: llc -mtriple=riscv64 -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \
|
||||
; RUN: | FileCheck -check-prefix=RV64I %s
|
||||
|
||||
define void @foo() {
|
||||
; RV32I-LABEL: name: foo
|
||||
; RV32I: bb.1.entry:
|
||||
; RV32I-NEXT: PseudoRET
|
||||
|
||||
; RV64I-LABEL: name: foo
|
||||
; RV64I: bb.1.entry:
|
||||
; RV64I-NEXT: PseudoRET
|
||||
entry:
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user