109 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //=== lib/CodeGen/GlobalISel/AArch64PreLegalizerCombiner.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 "AArch64TargetMachine.h"
 | |
| #include "llvm/CodeGen/GlobalISel/Combiner.h"
 | |
| #include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
 | |
| #include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
 | |
| #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
 | |
| #include "llvm/CodeGen/MachineFunctionPass.h"
 | |
| #include "llvm/CodeGen/TargetPassConfig.h"
 | |
| #include "llvm/Support/Debug.h"
 | |
| 
 | |
| #define DEBUG_TYPE "aarch64-prelegalizer-combiner"
 | |
| 
 | |
| using namespace llvm;
 | |
| using namespace MIPatternMatch;
 | |
| 
 | |
| namespace {
 | |
| class AArch64PreLegalizerCombinerInfo : public CombinerInfo {
 | |
| public:
 | |
|   AArch64PreLegalizerCombinerInfo()
 | |
|       : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
 | |
|                      /*LegalizerInfo*/ nullptr) {}
 | |
|   virtual bool combine(CombinerChangeObserver &Observer, MachineInstr &MI,
 | |
|                        MachineIRBuilder &B) const override;
 | |
| };
 | |
| 
 | |
| bool AArch64PreLegalizerCombinerInfo::combine(CombinerChangeObserver &Observer,
 | |
|                                               MachineInstr &MI,
 | |
|                                               MachineIRBuilder &B) const {
 | |
|   CombinerHelper Helper(Observer, B);
 | |
| 
 | |
|   switch (MI.getOpcode()) {
 | |
|   default:
 | |
|     return false;
 | |
|   case TargetOpcode::G_LOAD:
 | |
|   case TargetOpcode::G_SEXTLOAD:
 | |
|   case TargetOpcode::G_ZEXTLOAD:
 | |
|     return Helper.tryCombineExtendingLoads(MI);
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| // Pass boilerplate
 | |
| // ================
 | |
| 
 | |
| class AArch64PreLegalizerCombiner : public MachineFunctionPass {
 | |
| public:
 | |
|   static char ID;
 | |
| 
 | |
|   AArch64PreLegalizerCombiner();
 | |
| 
 | |
|   StringRef getPassName() const override { return "AArch64PreLegalizerCombiner"; }
 | |
| 
 | |
|   bool runOnMachineFunction(MachineFunction &MF) override;
 | |
| 
 | |
|   void getAnalysisUsage(AnalysisUsage &AU) const override;
 | |
| };
 | |
| }
 | |
| 
 | |
| void AArch64PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
 | |
|   AU.addRequired<TargetPassConfig>();
 | |
|   AU.setPreservesCFG();
 | |
|   getSelectionDAGFallbackAnalysisUsage(AU);
 | |
|   MachineFunctionPass::getAnalysisUsage(AU);
 | |
| }
 | |
| 
 | |
| AArch64PreLegalizerCombiner::AArch64PreLegalizerCombiner() : MachineFunctionPass(ID) {
 | |
|   initializeAArch64PreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
 | |
| }
 | |
| 
 | |
| bool AArch64PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
 | |
|   if (MF.getProperties().hasProperty(
 | |
|           MachineFunctionProperties::Property::FailedISel))
 | |
|     return false;
 | |
|   auto *TPC = &getAnalysis<TargetPassConfig>();
 | |
|   AArch64PreLegalizerCombinerInfo PCInfo;
 | |
|   Combiner C(PCInfo, TPC);
 | |
|   return C.combineMachineInstrs(MF);
 | |
| }
 | |
| 
 | |
| char AArch64PreLegalizerCombiner::ID = 0;
 | |
| INITIALIZE_PASS_BEGIN(AArch64PreLegalizerCombiner, DEBUG_TYPE,
 | |
|                       "Combine AArch64 machine instrs before legalization",
 | |
|                       false, false)
 | |
| INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
 | |
| INITIALIZE_PASS_END(AArch64PreLegalizerCombiner, DEBUG_TYPE,
 | |
|                     "Combine AArch64 machine instrs before legalization", false,
 | |
|                     false)
 | |
| 
 | |
| 
 | |
| namespace llvm {
 | |
| FunctionPass *createAArch64PreLegalizeCombiner() {
 | |
|   return new AArch64PreLegalizerCombiner();
 | |
| }
 | |
| } // end namespace llvm
 |