MipsPreLegalizerCombiner.cpp revision 360784
1//=== lib/CodeGen/GlobalISel/MipsPreLegalizerCombiner.cpp --------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This pass does combining of machine instructions at the generic MI level, 10// before the legalizer. 11// 12//===----------------------------------------------------------------------===// 13 14#include "MipsTargetMachine.h" 15#include "llvm/CodeGen/GlobalISel/Combiner.h" 16#include "llvm/CodeGen/GlobalISel/CombinerHelper.h" 17#include "llvm/CodeGen/GlobalISel/CombinerInfo.h" 18#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" 19#include "llvm/CodeGen/TargetPassConfig.h" 20#include "llvm/InitializePasses.h" 21 22#define DEBUG_TYPE "mips-prelegalizer-combiner" 23 24using namespace llvm; 25 26namespace { 27class MipsPreLegalizerCombinerInfo : public CombinerInfo { 28public: 29 MipsPreLegalizerCombinerInfo() 30 : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false, 31 /*LegalizerInfo*/ nullptr, /*EnableOpt*/ false, 32 /*EnableOptSize*/ false, /*EnableMinSize*/ false) {} 33 virtual bool combine(GISelChangeObserver &Observer, MachineInstr &MI, 34 MachineIRBuilder &B) const override; 35}; 36 37bool MipsPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer, 38 MachineInstr &MI, 39 MachineIRBuilder &B) const { 40 CombinerHelper Helper(Observer, B); 41 42 switch (MI.getOpcode()) { 43 default: 44 return false; 45 case TargetOpcode::G_LOAD: 46 case TargetOpcode::G_SEXTLOAD: 47 case TargetOpcode::G_ZEXTLOAD: 48 return Helper.tryCombineExtendingLoads(MI); 49 } 50 return false; 51} 52 53// Pass boilerplate 54// ================ 55 56class MipsPreLegalizerCombiner : public MachineFunctionPass { 57public: 58 static char ID; 59 60 MipsPreLegalizerCombiner(); 61 62 StringRef getPassName() const override { return "MipsPreLegalizerCombiner"; } 63 64 bool runOnMachineFunction(MachineFunction &MF) override; 65 66 void getAnalysisUsage(AnalysisUsage &AU) const override; 67}; 68} // end anonymous namespace 69 70void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const { 71 AU.addRequired<TargetPassConfig>(); 72 AU.setPreservesCFG(); 73 getSelectionDAGFallbackAnalysisUsage(AU); 74 MachineFunctionPass::getAnalysisUsage(AU); 75} 76 77MipsPreLegalizerCombiner::MipsPreLegalizerCombiner() : MachineFunctionPass(ID) { 78 initializeMipsPreLegalizerCombinerPass(*PassRegistry::getPassRegistry()); 79} 80 81bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) { 82 if (MF.getProperties().hasProperty( 83 MachineFunctionProperties::Property::FailedISel)) 84 return false; 85 auto *TPC = &getAnalysis<TargetPassConfig>(); 86 MipsPreLegalizerCombinerInfo PCInfo; 87 Combiner C(PCInfo, TPC); 88 return C.combineMachineInstrs(MF, nullptr); 89} 90 91char MipsPreLegalizerCombiner::ID = 0; 92INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE, 93 "Combine Mips machine instrs before legalization", false, 94 false) 95INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) 96INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE, 97 "Combine Mips machine instrs before legalization", false, 98 false) 99 100namespace llvm { 101FunctionPass *createMipsPreLegalizeCombiner() { 102 return new MipsPreLegalizerCombiner(); 103} 104} // end namespace llvm 105