#include "RISCVTargetMachine.h"
#include "MCTargetDesc/RISCVBaseInfo.h"
#include "RISCV.h"
#include "RISCVMachineFunctionInfo.h"
#include "RISCVTargetObjectFile.h"
#include "RISCVTargetTransformInfo.h"
#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/MIRParser/MIParser.h"
#include "llvm/CodeGen/MIRYamlMapping.h"
#include "llvm/CodeGen/MachineScheduler.h"
#include "llvm/CodeGen/MacroFusion.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegAllocRegistry.h"
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/InitializePasses.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Vectorize/LoopIdiomVectorize.h"
#include <optional>
usingnamespacellvm;
static cl::opt<bool> EnableRedundantCopyElimination(
"riscv-enable-copyelim",
cl::desc("Enable the redundant copy elimination pass"), cl::init(true),
cl::Hidden);
static cl::opt<cl::boolOrDefault>
EnableGlobalMerge("riscv-enable-global-merge", cl::Hidden,
cl::desc("Enable the global merge pass"));
static cl::opt<bool>
EnableMachineCombiner("riscv-enable-machine-combiner",
cl::desc("Enable the machine combiner pass"),
cl::init(true), cl::Hidden);
static cl::opt<unsigned> RVVVectorBitsMaxOpt(
"riscv-v-vector-bits-max",
cl::desc("Assume V extension vector registers are at most this big, "
"with zero meaning no maximum size is assumed."),
cl::init(0), cl::Hidden);
static cl::opt<int> RVVVectorBitsMinOpt(
"riscv-v-vector-bits-min",
cl::desc("Assume V extension vector registers are at least this big, "
"with zero meaning no minimum size is assumed. A value of -1 "
"means use Zvl*b extension. This is primarily used to enable "
"autovectorization with fixed width vectors."),
cl::init(-1), cl::Hidden);
static cl::opt<bool> EnableRISCVCopyPropagation(
"riscv-enable-copy-propagation",
cl::desc("Enable the copy propagation with RISC-V copy instr"),
cl::init(true), cl::Hidden);
static cl::opt<bool> EnableRISCVDeadRegisterElimination(
"riscv-enable-dead-defs", cl::Hidden,
cl::desc("Enable the pass that removes dead"
" definitons and replaces stores to"
" them with stores to x0"),
cl::init(true));
static cl::opt<bool>
EnableSinkFold("riscv-enable-sink-fold",
cl::desc("Enable sinking and folding of instruction copies"),
cl::init(true), cl::Hidden);
static cl::opt<bool>
EnableLoopDataPrefetch("riscv-enable-loop-data-prefetch", cl::Hidden,
cl::desc("Enable the loop data prefetch pass"),
cl::init(true));
static cl::opt<bool> EnableMISchedLoadClustering(
"riscv-misched-load-clustering", cl::Hidden,
cl::desc("Enable load clustering in the machine scheduler"),
cl::init(false));
static cl::opt<bool> EnableVSETVLIAfterRVVRegAlloc(
"riscv-vsetvl-after-rvv-regalloc", cl::Hidden,
cl::desc("Insert vsetvls after vector register allocation"),
cl::init(true));
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() { … }
static StringRef computeDataLayout(const Triple &TT,
const TargetOptions &Options) { … }
static Reloc::Model getEffectiveRelocModel(const Triple &TT,
std::optional<Reloc::Model> RM) { … }
RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT,
StringRef CPU, StringRef FS,
const TargetOptions &Options,
std::optional<Reloc::Model> RM,
std::optional<CodeModel::Model> CM,
CodeGenOptLevel OL, bool JIT)
: … { … }
const RISCVSubtarget *
RISCVTargetMachine::getSubtargetImpl(const Function &F) const { … }
MachineFunctionInfo *RISCVTargetMachine::createMachineFunctionInfo(
BumpPtrAllocator &Allocator, const Function &F,
const TargetSubtargetInfo *STI) const { … }
TargetTransformInfo
RISCVTargetMachine::getTargetTransformInfo(const Function &F) const { … }
bool RISCVTargetMachine::isNoopAddrSpaceCast(unsigned SrcAS,
unsigned DstAS) const { … }
namespace {
class RVVRegisterRegAlloc : public RegisterRegAllocBase<RVVRegisterRegAlloc> { … };
static bool onlyAllocateRVVReg(const TargetRegisterInfo &TRI,
const MachineRegisterInfo &MRI,
const Register Reg) { … }
static FunctionPass *useDefaultRegisterAllocator() { … }
static llvm::once_flag InitializeDefaultRVVRegisterAllocatorFlag;
static cl::opt<RVVRegisterRegAlloc::FunctionPassCtor, false,
RegisterPassParser<RVVRegisterRegAlloc>>
RVVRegAlloc("riscv-rvv-regalloc", cl::Hidden,
cl::init(&useDefaultRegisterAllocator),
cl::desc("Register allocator to use for RVV register."));
static void initializeDefaultRVVRegisterAllocatorOnce() { … }
static FunctionPass *createBasicRVVRegisterAllocator() { … }
static FunctionPass *createGreedyRVVRegisterAllocator() { … }
static FunctionPass *createFastRVVRegisterAllocator() { … }
static RVVRegisterRegAlloc basicRegAllocRVVReg("basic",
"basic register allocator",
createBasicRVVRegisterAllocator);
static RVVRegisterRegAlloc
greedyRegAllocRVVReg("greedy", "greedy register allocator",
createGreedyRVVRegisterAllocator);
static RVVRegisterRegAlloc fastRegAllocRVVReg("fast", "fast register allocator",
createFastRVVRegisterAllocator);
class RISCVPassConfig : public TargetPassConfig { … };
}
TargetPassConfig *RISCVTargetMachine::createPassConfig(PassManagerBase &PM) { … }
FunctionPass *RISCVPassConfig::createRVVRegAllocPass(bool Optimized) { … }
bool RISCVPassConfig::addRegAssignAndRewriteFast() { … }
bool RISCVPassConfig::addRegAssignAndRewriteOptimized() { … }
void RISCVPassConfig::addIRPasses() { … }
bool RISCVPassConfig::addPreISel() { … }
void RISCVPassConfig::addCodeGenPrepare() { … }
bool RISCVPassConfig::addInstSelector() { … }
bool RISCVPassConfig::addIRTranslator() { … }
void RISCVPassConfig::addPreLegalizeMachineIR() { … }
bool RISCVPassConfig::addLegalizeMachineIR() { … }
void RISCVPassConfig::addPreRegBankSelect() { … }
bool RISCVPassConfig::addRegBankSelect() { … }
bool RISCVPassConfig::addGlobalInstructionSelect() { … }
void RISCVPassConfig::addPreSched2() { … }
void RISCVPassConfig::addPreEmitPass() { … }
void RISCVPassConfig::addPreEmitPass2() { … }
void RISCVPassConfig::addMachineSSAOptimization() { … }
void RISCVPassConfig::addPreRegAlloc() { … }
void RISCVPassConfig::addFastRegAlloc() { … }
void RISCVPassConfig::addPostRegAlloc() { … }
void RISCVTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) { … }
yaml::MachineFunctionInfo *
RISCVTargetMachine::createDefaultFuncInfoYAML() const { … }
yaml::MachineFunctionInfo *
RISCVTargetMachine::convertFuncInfoToYAML(const MachineFunction &MF) const { … }
bool RISCVTargetMachine::parseMachineFunctionInfo(
const yaml::MachineFunctionInfo &MFI, PerFunctionMIParsingState &PFS,
SMDiagnostic &Error, SMRange &SourceRange) const { … }