diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Mips/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/Mips.h | 2 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp | 92 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsTargetMachine.cpp | 6 |
4 files changed, 101 insertions, 0 deletions
diff --git a/llvm/lib/Target/Mips/CMakeLists.txt b/llvm/lib/Target/Mips/CMakeLists.txt index 2cacc0a0870..b67fb46cf66 100644 --- a/llvm/lib/Target/Mips/CMakeLists.txt +++ b/llvm/lib/Target/Mips/CMakeLists.txt @@ -44,6 +44,7 @@ add_llvm_target(MipsCodeGen MipsModuleISelDAGToDAG.cpp MipsOptimizePICCall.cpp MipsOs16.cpp + MipsPreLegalizerCombiner.cpp MipsRegisterBankInfo.cpp MipsRegisterInfo.cpp MipsSEFrameLowering.cpp diff --git a/llvm/lib/Target/Mips/Mips.h b/llvm/lib/Target/Mips/Mips.h index ef3a807c764..6bb7aecc867 100644 --- a/llvm/lib/Target/Mips/Mips.h +++ b/llvm/lib/Target/Mips/Mips.h @@ -38,6 +38,7 @@ namespace llvm { FunctionPass *createMipsConstantIslandPass(); FunctionPass *createMicroMipsSizeReducePass(); FunctionPass *createMipsExpandPseudoPass(); + FunctionPass *createMipsPreLegalizeCombiner(); InstructionSelector *createMipsInstructionSelector(const MipsTargetMachine &, MipsSubtarget &, @@ -46,6 +47,7 @@ namespace llvm { void initializeMipsDelaySlotFillerPass(PassRegistry &); void initializeMipsBranchExpansionPass(PassRegistry &); void initializeMicroMipsSizeReducePass(PassRegistry &); + void initializeMipsPreLegalizerCombinerPass(PassRegistry&); } // end namespace llvm; #endif diff --git a/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp b/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp new file mode 100644 index 00000000000..c355a0e86d2 --- /dev/null +++ b/llvm/lib/Target/Mips/MipsPreLegalizerCombiner.cpp @@ -0,0 +1,92 @@ +//=== lib/CodeGen/GlobalISel/MipsPreLegalizerCombiner.cpp --------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This pass does combining of machine instructions at the generic MI level, +// before the legalizer. +// +//===----------------------------------------------------------------------===// + +#include "MipsTargetMachine.h" +#include "llvm/CodeGen/GlobalISel/Combiner.h" +#include "llvm/CodeGen/GlobalISel/CombinerInfo.h" +#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" +#include "llvm/CodeGen/TargetPassConfig.h" + +#define DEBUG_TYPE "mips-prelegalizer-combiner" + +using namespace llvm; + +namespace { +class MipsPreLegalizerCombinerInfo : public CombinerInfo { +public: + MipsPreLegalizerCombinerInfo() + : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, + /*LegalizerInfo*/ nullptr) {} + virtual bool combine(GISelChangeObserver &Observer, MachineInstr &MI, + MachineIRBuilder &B) const override; +}; + +bool MipsPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer, + MachineInstr &MI, + MachineIRBuilder &B) const { + return false; +} + +// Pass boilerplate +// ================ + +class MipsPreLegalizerCombiner : public MachineFunctionPass { +public: + static char ID; + + MipsPreLegalizerCombiner(); + + StringRef getPassName() const override { return "MipsPreLegalizerCombiner"; } + + bool runOnMachineFunction(MachineFunction &MF) override; + + void getAnalysisUsage(AnalysisUsage &AU) const override; +}; +} // end anonymous namespace + +void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired<TargetPassConfig>(); + AU.setPreservesCFG(); + getSelectionDAGFallbackAnalysisUsage(AU); + MachineFunctionPass::getAnalysisUsage(AU); +} + +MipsPreLegalizerCombiner::MipsPreLegalizerCombiner() : MachineFunctionPass(ID) { + initializeMipsPreLegalizerCombinerPass(*PassRegistry::getPassRegistry()); +} + +bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { + if (MF.getProperties().hasProperty( + MachineFunctionProperties::Property::FailedISel)) + return false; + auto *TPC = &getAnalysis<TargetPassConfig>(); + MipsPreLegalizerCombinerInfo PCInfo; + Combiner C(PCInfo, TPC); + return C.combineMachineInstrs(MF); +} + +char MipsPreLegalizerCombiner::ID = 0; +INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE, + "Combine Mips machine instrs before legalization", false, + false) +INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) +INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE, + "Combine Mips machine instrs before legalization", false, + false) + +namespace llvm { +FunctionPass *createMipsPreLegalizeCombiner() { + return new MipsPreLegalizerCombiner(); +} +} // end namespace llvm diff --git a/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/llvm/lib/Target/Mips/MipsTargetMachine.cpp index 9cc91d30289..8466298cf36 100644 --- a/llvm/lib/Target/Mips/MipsTargetMachine.cpp +++ b/llvm/lib/Target/Mips/MipsTargetMachine.cpp @@ -56,6 +56,7 @@ extern "C" void LLVMInitializeMipsTarget() { initializeMipsDelaySlotFillerPass(*PR); initializeMipsBranchExpansionPass(*PR); initializeMicroMipsSizeReducePass(*PR); + initializeMipsPreLegalizerCombinerPass(*PR); } static std::string computeDataLayout(const Triple &TT, StringRef CPU, @@ -235,6 +236,7 @@ public: void addPreEmitPass() override; void addPreRegAlloc() override; bool addIRTranslator() override; + void addPreLegalizeMachineIR() override; bool addLegalizeMachineIR() override; bool addRegBankSelect() override; bool addGlobalInstructionSelect() override; @@ -312,6 +314,10 @@ bool MipsPassConfig::addIRTranslator() { return false; } +void MipsPassConfig::addPreLegalizeMachineIR() { + addPass(createMipsPreLegalizeCombiner()); +} + bool MipsPassConfig::addLegalizeMachineIR() { addPass(new Legalizer()); return false; |