brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 895c3db Raw
154 lines · cpp
1//=== RISCVO0PreLegalizerCombiner.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 "RISCVSubtarget.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/GIMatchTableExecutorImpl.h"19#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"20#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"21#include "llvm/CodeGen/MachineDominators.h"22#include "llvm/CodeGen/MachineFunction.h"23#include "llvm/CodeGen/MachineFunctionPass.h"24#include "llvm/CodeGen/TargetPassConfig.h"25 26#define GET_GICOMBINER_DEPS27#include "RISCVGenO0PreLegalizeGICombiner.inc"28#undef GET_GICOMBINER_DEPS29 30#define DEBUG_TYPE "riscv-O0-prelegalizer-combiner"31 32using namespace llvm;33 34namespace {35#define GET_GICOMBINER_TYPES36#include "RISCVGenO0PreLegalizeGICombiner.inc"37#undef GET_GICOMBINER_TYPES38 39class RISCVO0PreLegalizerCombinerImpl : public Combiner {40protected:41  const CombinerHelper Helper;42  const RISCVO0PreLegalizerCombinerImplRuleConfig &RuleConfig;43  const RISCVSubtarget &STI;44 45public:46  RISCVO0PreLegalizerCombinerImpl(47      MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,48      GISelValueTracking &VT, GISelCSEInfo *CSEInfo,49      const RISCVO0PreLegalizerCombinerImplRuleConfig &RuleConfig,50      const RISCVSubtarget &STI);51 52  static const char *getName() { return "RISCVO0PreLegalizerCombiner"; }53 54  bool tryCombineAll(MachineInstr &I) const override;55 56private:57#define GET_GICOMBINER_CLASS_MEMBERS58#include "RISCVGenO0PreLegalizeGICombiner.inc"59#undef GET_GICOMBINER_CLASS_MEMBERS60};61 62#define GET_GICOMBINER_IMPL63#include "RISCVGenO0PreLegalizeGICombiner.inc"64#undef GET_GICOMBINER_IMPL65 66RISCVO0PreLegalizerCombinerImpl::RISCVO0PreLegalizerCombinerImpl(67    MachineFunction &MF, CombinerInfo &CInfo, const TargetPassConfig *TPC,68    GISelValueTracking &VT, GISelCSEInfo *CSEInfo,69    const RISCVO0PreLegalizerCombinerImplRuleConfig &RuleConfig,70    const RISCVSubtarget &STI)71    : Combiner(MF, CInfo, TPC, &VT, CSEInfo),72      Helper(Observer, B, /*IsPreLegalize*/ true, &VT), RuleConfig(RuleConfig),73      STI(STI),74#define GET_GICOMBINER_CONSTRUCTOR_INITS75#include "RISCVGenO0PreLegalizeGICombiner.inc"76#undef GET_GICOMBINER_CONSTRUCTOR_INITS77{78}79 80// Pass boilerplate81// ================82 83class RISCVO0PreLegalizerCombiner : public MachineFunctionPass {84public:85  static char ID;86 87  RISCVO0PreLegalizerCombiner();88 89  StringRef getPassName() const override {90    return "RISCVO0PreLegalizerCombiner";91  }92 93  bool runOnMachineFunction(MachineFunction &MF) override;94 95  void getAnalysisUsage(AnalysisUsage &AU) const override;96 97private:98  RISCVO0PreLegalizerCombinerImplRuleConfig RuleConfig;99};100} // end anonymous namespace101 102void RISCVO0PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {103  AU.addRequired<TargetPassConfig>();104  AU.setPreservesCFG();105  getSelectionDAGFallbackAnalysisUsage(AU);106  AU.addRequired<GISelValueTrackingAnalysisLegacy>();107  AU.addPreserved<GISelValueTrackingAnalysisLegacy>();108  MachineFunctionPass::getAnalysisUsage(AU);109}110 111RISCVO0PreLegalizerCombiner::RISCVO0PreLegalizerCombiner()112    : MachineFunctionPass(ID) {113  if (!RuleConfig.parseCommandLineOption())114    report_fatal_error("Invalid rule identifier");115}116 117bool RISCVO0PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {118  if (MF.getProperties().hasFailedISel())119    return false;120  auto &TPC = getAnalysis<TargetPassConfig>();121 122  const Function &F = MF.getFunction();123  GISelValueTracking *VT =124      &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);125 126  const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>();127 128  CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,129                     /*LegalizerInfo*/ nullptr, /*EnableOpt*/ false,130                     F.hasOptSize(), F.hasMinSize());131  // Disable fixed-point iteration in the Combiner. This improves compile-time132  // at the cost of possibly missing optimizations. See PR#94291 for details.133  CInfo.MaxIterations = 1;134 135  RISCVO0PreLegalizerCombinerImpl Impl(MF, CInfo, &TPC, *VT,136                                       /*CSEInfo*/ nullptr, RuleConfig, ST);137  return Impl.combineMachineInstrs();138}139 140char RISCVO0PreLegalizerCombiner::ID = 0;141INITIALIZE_PASS_BEGIN(RISCVO0PreLegalizerCombiner, DEBUG_TYPE,142                      "Combine RISC-V machine instrs before legalization",143                      false, false)144INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)145INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)146INITIALIZE_PASS_DEPENDENCY(GISelCSEAnalysisWrapperPass)147INITIALIZE_PASS_END(RISCVO0PreLegalizerCombiner, DEBUG_TYPE,148                    "Combine RISC-V machine instrs before legalization", false,149                    false)150 151FunctionPass *llvm::createRISCVO0PreLegalizerCombiner() {152  return new RISCVO0PreLegalizerCombiner();153}154