diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-09-02 21:17:18 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-08 17:34:50 +0000 |
commit | 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e (patch) | |
tree | 62f873df87c7c675557a179e0c4c83fe9f3087bc /contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | |
parent | cf037972ea8863e2bab7461d77345367d2c1e054 (diff) | |
parent | 7fa27ce4a07f19b07799a767fc29416f3b625afb (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp index cc881406666c..59dac5c7b57d 100644 --- a/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -1,4 +1,4 @@ -//===-- RISCVTargetMachine.cpp - Define TargetMachine for RISCV -----------===// +//===-- RISCVTargetMachine.cpp - Define TargetMachine for RISC-V ----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// Implements the info about RISCV target spec. +// Implements the info about RISC-V target spec. // //===----------------------------------------------------------------------===// @@ -29,7 +29,6 @@ #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" #include "llvm/CodeGen/TargetPassConfig.h" -#include "llvm/IR/LegacyPassManager.h" #include "llvm/InitializePasses.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/FormattedStream.h" @@ -67,21 +66,30 @@ static cl::opt<int> RVVVectorBitsMinOpt( "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); + extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() { RegisterTargetMachine<RISCVTargetMachine> X(getTheRISCV32Target()); RegisterTargetMachine<RISCVTargetMachine> Y(getTheRISCV64Target()); auto *PR = PassRegistry::getPassRegistry(); initializeGlobalISel(*PR); + initializeKCFIPass(*PR); initializeRISCVMakeCompressibleOptPass(*PR); initializeRISCVGatherScatterLoweringPass(*PR); initializeRISCVCodeGenPreparePass(*PR); initializeRISCVMergeBaseOffsetOptPass(*PR); - initializeRISCVSExtWRemovalPass(*PR); - initializeRISCVStripWSuffixPass(*PR); + initializeRISCVOptWInstrsPass(*PR); initializeRISCVPreRAExpandPseudoPass(*PR); initializeRISCVExpandPseudoPass(*PR); initializeRISCVInsertVSETVLIPass(*PR); + initializeRISCVInsertReadWriteCSRPass(*PR); initializeRISCVDAGToDAGISelPass(*PR); + initializeRISCVInitUndefPass(*PR); + initializeRISCVMoveMergePass(*PR); + initializeRISCVPushPopOptPass(*PR); } static StringRef computeDataLayout(const Triple &TT) { @@ -111,6 +119,9 @@ RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT, // RISC-V supports the MachineOutliner. setMachineOutliner(true); setSupportsDefaultOutlining(true); + + if (TT.isOSFuchsia() && !TT.isArch64Bit()) + report_fatal_error("Fuchsia is only supported for 64-bit"); } const RISCVSubtarget * @@ -159,11 +170,11 @@ RISCVTargetMachine::getSubtargetImpl(const Function &F) const { RVVBitsMax = std::max(RVVBitsMin, RVVBitsMax); } - RVVBitsMin = - PowerOf2Floor((RVVBitsMin < 64 || RVVBitsMin > 65536) ? 0 : RVVBitsMin); + RVVBitsMin = llvm::bit_floor( + (RVVBitsMin < 64 || RVVBitsMin > 65536) ? 0 : RVVBitsMin); } RVVBitsMax = - PowerOf2Floor((RVVBitsMax < 64 || RVVBitsMax > 65536) ? 0 : RVVBitsMax); + llvm::bit_floor((RVVBitsMax < 64 || RVVBitsMax > 65536) ? 0 : RVVBitsMax); SmallString<512> Key; Key += "RVVMin"; @@ -261,6 +272,7 @@ public: void addMachineSSAOptimization() override; void addPreRegAlloc() override; void addPostRegAlloc() override; + void addOptimizedRegAlloc() override; }; } // namespace @@ -271,11 +283,11 @@ TargetPassConfig *RISCVTargetMachine::createPassConfig(PassManagerBase &PM) { void RISCVPassConfig::addIRPasses() { addPass(createAtomicExpandPass()); - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOpt::None) { addPass(createRISCVGatherScatterLoweringPass()); - - if (getOptLevel() != CodeGenOpt::None) + addPass(createInterleavedAccessPass()); addPass(createRISCVCodeGenPreparePass()); + } TargetPassConfig::addIRPasses(); } @@ -323,19 +335,42 @@ bool RISCVPassConfig::addGlobalInstructionSelect() { return false; } -void RISCVPassConfig::addPreSched2() {} +void RISCVPassConfig::addPreSched2() { + // Emit KCFI checks for indirect calls. + addPass(createKCFIPass()); +} void RISCVPassConfig::addPreEmitPass() { addPass(&BranchRelaxationPassID); addPass(createRISCVMakeCompressibleOptPass()); + + // TODO: It would potentially be better to schedule copy propagation after + // expanding pseudos (in addPreEmitPass2). However, performing copy + // propagation after the machine outliner (which runs after addPreEmitPass) + // currently leads to incorrect code-gen, where copies to registers within + // outlined functions are removed erroneously. + if (TM->getOptLevel() >= CodeGenOpt::Default && EnableRISCVCopyPropagation) + addPass(createMachineCopyPropagationPass(true)); } void RISCVPassConfig::addPreEmitPass2() { + if (TM->getOptLevel() != CodeGenOpt::None) { + addPass(createRISCVMoveMergePass()); + // Schedule PushPop Optimization before expansion of Pseudo instruction, + // ensuring return instruction is detected correctly. + addPass(createRISCVPushPopOptimizationPass()); + } addPass(createRISCVExpandPseudoPass()); + // Schedule the expansion of AMOs at the last possible moment, avoiding the // possibility for other passes to break the requirements for forward // progress in the LR/SC block. addPass(createRISCVExpandAtomicPseudoPass()); + + // KCFI indirect call checks are lowered to a bundle. + addPass(createUnpackMachineBundles([&](const MachineFunction &MF) { + return MF.getFunction().getParent()->getModuleFlag("kcfi"); + })); } void RISCVPassConfig::addMachineSSAOptimization() { @@ -344,8 +379,7 @@ void RISCVPassConfig::addMachineSSAOptimization() { addPass(&MachineCombinerID); if (TM->getTargetTriple().getArch() == Triple::riscv64) { - addPass(createRISCVSExtWRemovalPass()); - addPass(createRISCVStripWSuffixPass()); + addPass(createRISCVOptWInstrsPass()); } } @@ -354,6 +388,14 @@ void RISCVPassConfig::addPreRegAlloc() { if (TM->getOptLevel() != CodeGenOpt::None) addPass(createRISCVMergeBaseOffsetOptPass()); addPass(createRISCVInsertVSETVLIPass()); + addPass(createRISCVInsertReadWriteCSRPass()); +} + +void RISCVPassConfig::addOptimizedRegAlloc() { + if (getOptimizeRegAlloc()) + insertPass(&DetectDeadLanesID, &RISCVInitUndefID); + + TargetPassConfig::addOptimizedRegAlloc(); } void RISCVPassConfig::addPostRegAlloc() { |