brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · d281296 Raw
161 lines · cpp
1//=== lib/CodeGen/GlobalISel/MipsPostLegalizerCombiner.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// after the legalizer.11//12//===----------------------------------------------------------------------===//13 14#include "MCTargetDesc/MipsMCTargetDesc.h"15#include "Mips.h"16#include "MipsLegalizerInfo.h"17#include "MipsSubtarget.h"18#include "llvm/CodeGen/GlobalISel/Combiner.h"19#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"20#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"21#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"22#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"23#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"24#include "llvm/CodeGen/MachineDominators.h"25#include "llvm/CodeGen/TargetPassConfig.h"26#include "llvm/Target/TargetMachine.h"27 28#define GET_GICOMBINER_DEPS29#include "MipsGenPostLegalizeGICombiner.inc"30#undef GET_GICOMBINER_DEPS31 32#define DEBUG_TYPE "mips-postlegalizer-combiner"33 34using namespace llvm;35using namespace MIPatternMatch;36 37namespace {38#define GET_GICOMBINER_TYPES39#include "MipsGenPostLegalizeGICombiner.inc"40#undef GET_GICOMBINER_TYPES41 42class MipsPostLegalizerCombinerImpl : public Combiner {43protected:44  const MipsPostLegalizerCombinerImplRuleConfig &RuleConfig;45  const MipsSubtarget &STI;46  const CombinerHelper Helper;47 48public:49  MipsPostLegalizerCombinerImpl(50      MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,51      GISelValueTracking &VT, GISelCSEInfo *CSEInfo,52      const MipsPostLegalizerCombinerImplRuleConfig &RuleConfig,53      const MipsSubtarget &STI, MachineDominatorTree *MDT,54      const LegalizerInfo *LI);55 56  static const char *getName() { return "MipsPostLegalizerCombiner"; }57 58  bool tryCombineAll(MachineInstr &I) const override;59 60private:61#define GET_GICOMBINER_CLASS_MEMBERS62#include "MipsGenPostLegalizeGICombiner.inc"63#undef GET_GICOMBINER_CLASS_MEMBERS64};65 66#define GET_GICOMBINER_IMPL67#include "MipsGenPostLegalizeGICombiner.inc"68#undef GET_GICOMBINER_IMPL69 70MipsPostLegalizerCombinerImpl::MipsPostLegalizerCombinerImpl(71    MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,72    GISelValueTracking &VT, GISelCSEInfo *CSEInfo,73    const MipsPostLegalizerCombinerImplRuleConfig &RuleConfig,74    const MipsSubtarget &STI, MachineDominatorTree *MDT,75    const LegalizerInfo *LI)76    : Combiner(MF, CInfo, TPC, &VT, CSEInfo), RuleConfig(RuleConfig), STI(STI),77      Helper(Observer, B, /*IsPreLegalize*/ false, &VT, MDT, LI),78#define GET_GICOMBINER_CONSTRUCTOR_INITS79#include "MipsGenPostLegalizeGICombiner.inc"80#undef GET_GICOMBINER_CONSTRUCTOR_INITS81{82}83 84// Pass boilerplate85// ================86 87class MipsPostLegalizerCombiner : public MachineFunctionPass {88public:89  static char ID;90 91  MipsPostLegalizerCombiner(bool IsOptNone = false);92 93  StringRef getPassName() const override { return "MipsPostLegalizerCombiner"; }94 95  bool runOnMachineFunction(MachineFunction &MF) override;96 97  void getAnalysisUsage(AnalysisUsage &AU) const override;98 99private:100  bool IsOptNone;101  MipsPostLegalizerCombinerImplRuleConfig RuleConfig;102};103} // end anonymous namespace104 105void MipsPostLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {106  AU.addRequired<TargetPassConfig>();107  AU.setPreservesCFG();108  getSelectionDAGFallbackAnalysisUsage(AU);109  AU.addRequired<GISelValueTrackingAnalysisLegacy>();110  AU.addPreserved<GISelValueTrackingAnalysisLegacy>();111  if (!IsOptNone) {112    AU.addRequired<MachineDominatorTreeWrapperPass>();113    AU.addPreserved<MachineDominatorTreeWrapperPass>();114  }115  MachineFunctionPass::getAnalysisUsage(AU);116}117 118MipsPostLegalizerCombiner::MipsPostLegalizerCombiner(bool IsOptNone)119    : MachineFunctionPass(ID), IsOptNone(IsOptNone) {120  if (!RuleConfig.parseCommandLineOption())121    report_fatal_error("Invalid rule identifier");122}123 124bool MipsPostLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {125  if (MF.getProperties().hasFailedISel())126    return false;127  auto *TPC = &getAnalysis<TargetPassConfig>();128  const Function &F = MF.getFunction();129  bool EnableOpt =130      MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);131 132  const MipsSubtarget &ST = MF.getSubtarget<MipsSubtarget>();133  const MipsLegalizerInfo *LI =134      static_cast<const MipsLegalizerInfo *>(ST.getLegalizerInfo());135 136  GISelValueTracking *VT =137      &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);138  MachineDominatorTree *MDT =139      IsOptNone ? nullptr140                : &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();141  CombinerInfo CInfo(/*AllowIllegalOps*/ false, /*ShouldLegalizeIllegal*/ true,142                     LI, EnableOpt, F.hasOptSize(), F.hasMinSize());143  MipsPostLegalizerCombinerImpl Impl(MF, CInfo, TPC, *VT, /*CSEInfo*/ nullptr,144                                     RuleConfig, ST, MDT, LI);145  return Impl.combineMachineInstrs();146}147 148char MipsPostLegalizerCombiner::ID = 0;149INITIALIZE_PASS_BEGIN(MipsPostLegalizerCombiner, DEBUG_TYPE,150                      "Combine Mips machine instrs after legalization", false,151                      false)152INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)153INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)154INITIALIZE_PASS_END(MipsPostLegalizerCombiner, DEBUG_TYPE,155                    "Combine Mips machine instrs after legalization", false,156                    false)157 158FunctionPass *llvm::createMipsPostLegalizeCombiner(bool IsOptNone) {159  return new MipsPostLegalizerCombiner(IsOptNone);160}161