aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-09-02 21:17:18 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-12-08 17:34:50 +0000
commit06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e (patch)
tree62f873df87c7c675557a179e0c4c83fe9f3087bc /contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
parentcf037972ea8863e2bab7461d77345367d2c1e054 (diff)
parent7fa27ce4a07f19b07799a767fc29416f3b625afb (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp70
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() {