diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64TargetMachine.cpp')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index 99bcb2f4649a..ce26c62af61a 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -25,6 +25,7 @@ #include "llvm/CodeGen/GlobalISel/IRTranslator.h" #include "llvm/CodeGen/GlobalISel/InstructionSelect.h" #include "llvm/CodeGen/GlobalISel/Legalizer.h" +#include "llvm/CodeGen/GlobalISel/LoadStoreOpt.h" #include "llvm/CodeGen/GlobalISel/Localizer.h" #include "llvm/CodeGen/GlobalISel/RegBankSelect.h" #include "llvm/CodeGen/MIRParser/MIParser.h" @@ -36,10 +37,10 @@ #include "llvm/InitializePasses.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCTargetOptions.h" +#include "llvm/MC/TargetRegistry.h" #include "llvm/Pass.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/TargetRegistry.h" #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Transforms/CFGuard.h" @@ -175,6 +176,16 @@ static cl::opt<unsigned> SVEVectorBitsMinOpt( extern cl::opt<bool> EnableHomogeneousPrologEpilog; +static cl::opt<bool> EnableGISelLoadStoreOptPreLegal( + "aarch64-enable-gisel-ldst-prelegal", + cl::desc("Enable GlobalISel's pre-legalizer load/store optimization pass"), + cl::init(true), cl::Hidden); + +static cl::opt<bool> EnableGISelLoadStoreOptPostLegal( + "aarch64-enable-gisel-ldst-postlegal", + cl::desc("Enable GlobalISel's post-legalizer load/store optimization pass"), + cl::init(false), cl::Hidden); + extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAArch64Target() { // Register the target. RegisterTargetMachine<AArch64leTargetMachine> X(getTheAArch64leTarget()); @@ -195,6 +206,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAArch64Target() { initializeAArch64DeadRegisterDefinitionsPass(*PR); initializeAArch64ExpandPseudoPass(*PR); initializeAArch64LoadStoreOptPass(*PR); + initializeAArch64MIPeepholeOptPass(*PR); initializeAArch64SIMDInstrOptPass(*PR); initializeAArch64O0PreLegalizerCombinerPass(*PR); initializeAArch64PreLegalizerCombinerPass(*PR); @@ -354,10 +366,13 @@ AArch64TargetMachine::~AArch64TargetMachine() = default; const AArch64Subtarget * AArch64TargetMachine::getSubtargetImpl(const Function &F) const { Attribute CPUAttr = F.getFnAttribute("target-cpu"); + Attribute TuneAttr = F.getFnAttribute("tune-cpu"); Attribute FSAttr = F.getFnAttribute("target-features"); std::string CPU = CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU; + std::string TuneCPU = + TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU; std::string FS = FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS; @@ -398,6 +413,7 @@ AArch64TargetMachine::getSubtargetImpl(const Function &F) const { Key += "SVEMax"; Key += std::to_string(MaxSVEVectorSize); Key += CPU; + Key += TuneCPU; Key += FS; auto &I = SubtargetMap[Key]; @@ -406,8 +422,8 @@ AArch64TargetMachine::getSubtargetImpl(const Function &F) const { // creation will depend on the TM and the code generation flags on the // function that reside in TargetOptions. resetTargetOptions(F); - I = std::make_unique<AArch64Subtarget>(TargetTriple, CPU, FS, *this, - isLittle, MinSVEVectorSize, + I = std::make_unique<AArch64Subtarget>(TargetTriple, CPU, TuneCPU, FS, + *this, isLittle, MinSVEVectorSize, MaxSVEVectorSize); } return I.get(); @@ -471,6 +487,7 @@ public: void addIRPasses() override; bool addPreISel() override; + void addCodeGenPrepare() override; bool addInstSelector() override; bool addIRTranslator() override; void addPreLegalizeMachineIR() override; @@ -479,6 +496,7 @@ public: bool addRegBankSelect() override; void addPreGlobalInstructionSelect() override; bool addGlobalInstructionSelect() override; + void addMachineSSAOptimization() override; bool addILPOpts() override; void addPreRegAlloc() override; void addPostRegAlloc() override; @@ -597,6 +615,12 @@ bool AArch64PassConfig::addPreISel() { return false; } +void AArch64PassConfig::addCodeGenPrepare() { + if (getOptLevel() != CodeGenOpt::None) + addPass(createTypePromotionPass()); + TargetPassConfig::addCodeGenPrepare(); +} + bool AArch64PassConfig::addInstSelector() { addPass(createAArch64ISelDag(getAArch64TargetMachine(), getOptLevel())); @@ -617,8 +641,11 @@ bool AArch64PassConfig::addIRTranslator() { void AArch64PassConfig::addPreLegalizeMachineIR() { if (getOptLevel() == CodeGenOpt::None) addPass(createAArch64O0PreLegalizerCombiner()); - else + else { addPass(createAArch64PreLegalizerCombiner()); + if (EnableGISelLoadStoreOptPreLegal) + addPass(new LoadStoreOpt()); + } } bool AArch64PassConfig::addLegalizeMachineIR() { @@ -628,8 +655,11 @@ bool AArch64PassConfig::addLegalizeMachineIR() { void AArch64PassConfig::addPreRegBankSelect() { bool IsOptNone = getOptLevel() == CodeGenOpt::None; - if (!IsOptNone) + if (!IsOptNone) { addPass(createAArch64PostLegalizerCombiner(IsOptNone)); + if (EnableGISelLoadStoreOptPostLegal) + addPass(new LoadStoreOpt()); + } addPass(createAArch64PostLegalizerLowering()); } @@ -649,6 +679,14 @@ bool AArch64PassConfig::addGlobalInstructionSelect() { return false; } +void AArch64PassConfig::addMachineSSAOptimization() { + // Run default MachineSSAOptimization first. + TargetPassConfig::addMachineSSAOptimization(); + + if (TM->getOptLevel() != CodeGenOpt::None) + addPass(createAArch64MIPeepholeOptPass()); +} + bool AArch64PassConfig::addILPOpts() { if (EnableCondOpt) addPass(createAArch64ConditionOptimizerPass()); |
