brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · c3a2668 Raw
144 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This pass does combining of machine instructions at the generic MI level,10// before the legalizer.11//12//===----------------------------------------------------------------------===//13 14#include "MipsLegalizerInfo.h"15#include "MipsTargetMachine.h"16#include "llvm/CodeGen/GlobalISel/Combiner.h"17#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"18#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"19#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"20#include "llvm/CodeGen/MachineFunctionPass.h"21#include "llvm/CodeGen/TargetPassConfig.h"22 23#define DEBUG_TYPE "mips-prelegalizer-combiner"24 25using namespace llvm;26 27namespace {28struct MipsPreLegalizerCombinerInfo : public CombinerInfo {29public:30  MipsPreLegalizerCombinerInfo()31      : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,32                     /*LegalizerInfo*/ nullptr, /*EnableOpt*/ false,33                     /*EnableOptSize*/ false, /*EnableMinSize*/ false) {}34};35 36class MipsPreLegalizerCombinerImpl : public Combiner {37protected:38  const MipsSubtarget &STI;39  const CombinerHelper Helper;40 41public:42  MipsPreLegalizerCombinerImpl(MachineFunction &MF, CombinerInfo &CInfo,43                               const TargetPassConfig *TPC,44                               GISelValueTracking &VT, GISelCSEInfo *CSEInfo,45                               const MipsSubtarget &STI,46                               MachineDominatorTree *MDT,47                               const LegalizerInfo *LI)48      : Combiner(MF, CInfo, TPC, &VT, CSEInfo), STI(STI),49        Helper(Observer, B, /*IsPreLegalize*/ true, &VT, MDT, LI) {}50 51  static const char *getName() { return "MipsPreLegalizerCombiner"; }52 53  void setupGeneratedPerFunctionState(MachineFunction &MF) override {54    // TODO: TableGen-erate this class' impl.55  }56 57  bool tryCombineAll(MachineInstr &MI) const override {58    switch (MI.getOpcode()) {59    default:60      return false;61    case TargetOpcode::G_MEMCPY_INLINE:62      return Helper.tryEmitMemcpyInline(MI);63    case TargetOpcode::G_LOAD:64    case TargetOpcode::G_SEXTLOAD:65    case TargetOpcode::G_ZEXTLOAD: {66      // Don't attempt to combine non power of 2 loads or unaligned loads when67      // subtarget doesn't support them.68      auto MMO = *MI.memoperands_begin();69      const MipsSubtarget &STI = MI.getMF()->getSubtarget<MipsSubtarget>();70      if (!MMO->getSize().hasValue() ||71          !isPowerOf2_64(MMO->getSize().getValue()))72        return false;73      bool isUnaligned = MMO->getAlign() < MMO->getSize().getValue();74      if (!STI.systemSupportsUnalignedAccess() && isUnaligned)75        return false;76 77      return Helper.tryCombineExtendingLoads(MI);78    }79    }80 81    return false;82  }83};84 85// Pass boilerplate86// ================87 88class MipsPreLegalizerCombiner : public MachineFunctionPass {89public:90  static char ID;91 92  MipsPreLegalizerCombiner();93 94  StringRef getPassName() const override { return "MipsPreLegalizerCombiner"; }95 96  bool runOnMachineFunction(MachineFunction &MF) override;97 98  void getAnalysisUsage(AnalysisUsage &AU) const override;99};100} // end anonymous namespace101 102void MipsPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {103  AU.addRequired<TargetPassConfig>();104  AU.addRequired<GISelValueTrackingAnalysisLegacy>();105  AU.addPreserved<GISelValueTrackingAnalysisLegacy>();106  AU.setPreservesCFG();107  getSelectionDAGFallbackAnalysisUsage(AU);108  MachineFunctionPass::getAnalysisUsage(AU);109}110 111MipsPreLegalizerCombiner::MipsPreLegalizerCombiner()112    : MachineFunctionPass(ID) {}113 114bool MipsPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {115  if (MF.getProperties().hasFailedISel())116    return false;117 118  auto *TPC = &getAnalysis<TargetPassConfig>();119  const MipsSubtarget &ST = MF.getSubtarget<MipsSubtarget>();120  const MipsLegalizerInfo *LI =121      static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo());122 123  GISelValueTracking *VT =124      &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);125  MipsPreLegalizerCombinerInfo PCInfo;126  MipsPreLegalizerCombinerImpl Impl(MF, PCInfo, TPC, *VT, /*CSEInfo*/ nullptr,127                                    ST, /*MDT*/ nullptr, LI);128  return Impl.combineMachineInstrs();129}130 131char MipsPreLegalizerCombiner::ID = 0;132INITIALIZE_PASS_BEGIN(MipsPreLegalizerCombiner, DEBUG_TYPE,133                      "Combine Mips machine instrs before legalization", false,134                      false)135INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)136INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)137INITIALIZE_PASS_END(MipsPreLegalizerCombiner, DEBUG_TYPE,138                    "Combine Mips machine instrs before legalization", false,139                    false)140 141FunctionPass *llvm::createMipsPreLegalizeCombiner() {142  return new MipsPreLegalizerCombiner();143}144