1ad8eb855SEric Wang //===- RegAllocPriorityAdvisor.cpp - live ranges priority advisor ---------===// 2ad8eb855SEric Wang // 3ad8eb855SEric Wang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ad8eb855SEric Wang // See https://llvm.org/LICENSE.txt for license information. 5ad8eb855SEric Wang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ad8eb855SEric Wang // 7ad8eb855SEric Wang //===----------------------------------------------------------------------===// 8ad8eb855SEric Wang // 9ad8eb855SEric Wang // Implementation of the default priority advisor and of the Analysis pass. 10ad8eb855SEric Wang // 11ad8eb855SEric Wang //===----------------------------------------------------------------------===// 12ad8eb855SEric Wang 13ad8eb855SEric Wang #include "RegAllocPriorityAdvisor.h" 14ad8eb855SEric Wang #include "RegAllocGreedy.h" 15ad8eb855SEric Wang #include "llvm/CodeGen/MachineFunction.h" 16ad8eb855SEric Wang #include "llvm/CodeGen/VirtRegMap.h" 17d8a2d3f7SEric Wang #include "llvm/IR/Module.h" 18ad8eb855SEric Wang #include "llvm/InitializePasses.h" 19ad8eb855SEric Wang #include "llvm/Pass.h" 20ad8eb855SEric Wang 21ad8eb855SEric Wang using namespace llvm; 22ad8eb855SEric Wang 23d8a2d3f7SEric Wang static cl::opt<RegAllocPriorityAdvisorAnalysis::AdvisorMode> Mode( 24d8a2d3f7SEric Wang "regalloc-enable-priority-advisor", cl::Hidden, 25d8a2d3f7SEric Wang cl::init(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default), 26d8a2d3f7SEric Wang cl::desc("Enable regalloc advisor mode"), 27d8a2d3f7SEric Wang cl::values( 28d8a2d3f7SEric Wang clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default, 29d8a2d3f7SEric Wang "default", "Default"), 30d8a2d3f7SEric Wang clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release, 31d8a2d3f7SEric Wang "release", "precompiled"), 32d8a2d3f7SEric Wang clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development, 33*11e482c4SMatt Arsenault "development", "for training"), 34*11e482c4SMatt Arsenault clEnumValN( 35*11e482c4SMatt Arsenault RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy, "dummy", 36*11e482c4SMatt Arsenault "prioritize low virtual register numbers for test and debug"))); 37d8a2d3f7SEric Wang 38d8a2d3f7SEric Wang char RegAllocPriorityAdvisorAnalysis::ID = 0; 39d8a2d3f7SEric Wang INITIALIZE_PASS(RegAllocPriorityAdvisorAnalysis, "regalloc-priority", 40d8a2d3f7SEric Wang "Regalloc priority policy", false, true) 41d8a2d3f7SEric Wang 42d8a2d3f7SEric Wang namespace { 43d8a2d3f7SEric Wang class DefaultPriorityAdvisorAnalysis final 44d8a2d3f7SEric Wang : public RegAllocPriorityAdvisorAnalysis { 45d8a2d3f7SEric Wang public: 46d8a2d3f7SEric Wang DefaultPriorityAdvisorAnalysis(bool NotAsRequested) 47d8a2d3f7SEric Wang : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Default), 48d8a2d3f7SEric Wang NotAsRequested(NotAsRequested) {} 49d8a2d3f7SEric Wang 50d8a2d3f7SEric Wang // support for isa<> and dyn_cast. 51d8a2d3f7SEric Wang static bool classof(const RegAllocPriorityAdvisorAnalysis *R) { 52d8a2d3f7SEric Wang return R->getAdvisorMode() == AdvisorMode::Default; 53d8a2d3f7SEric Wang } 54d8a2d3f7SEric Wang 55d8a2d3f7SEric Wang private: 56d8a2d3f7SEric Wang void getAnalysisUsage(AnalysisUsage &AU) const override { 574010f894Spaperchalice AU.addRequired<SlotIndexesWrapperPass>(); 58d8a2d3f7SEric Wang RegAllocPriorityAdvisorAnalysis::getAnalysisUsage(AU); 59d8a2d3f7SEric Wang } 60d8a2d3f7SEric Wang std::unique_ptr<RegAllocPriorityAdvisor> 61d8a2d3f7SEric Wang getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { 62d8a2d3f7SEric Wang return std::make_unique<DefaultPriorityAdvisor>( 634010f894Spaperchalice MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI()); 64d8a2d3f7SEric Wang } 65d8a2d3f7SEric Wang bool doInitialization(Module &M) override { 66d8a2d3f7SEric Wang if (NotAsRequested) 67d8a2d3f7SEric Wang M.getContext().emitError("Requested regalloc priority advisor analysis " 68d8a2d3f7SEric Wang "could be created. Using default"); 69d8a2d3f7SEric Wang return RegAllocPriorityAdvisorAnalysis::doInitialization(M); 70d8a2d3f7SEric Wang } 71d8a2d3f7SEric Wang const bool NotAsRequested; 72d8a2d3f7SEric Wang }; 73*11e482c4SMatt Arsenault 74*11e482c4SMatt Arsenault class DummyPriorityAdvisorAnalysis final 75*11e482c4SMatt Arsenault : public RegAllocPriorityAdvisorAnalysis { 76*11e482c4SMatt Arsenault public: 77*11e482c4SMatt Arsenault DummyPriorityAdvisorAnalysis() 78*11e482c4SMatt Arsenault : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Dummy) {} 79*11e482c4SMatt Arsenault 80*11e482c4SMatt Arsenault // support for isa<> and dyn_cast. 81*11e482c4SMatt Arsenault static bool classof(const RegAllocPriorityAdvisorAnalysis *R) { 82*11e482c4SMatt Arsenault return R->getAdvisorMode() == AdvisorMode::Dummy; 83*11e482c4SMatt Arsenault } 84*11e482c4SMatt Arsenault 85*11e482c4SMatt Arsenault private: 86*11e482c4SMatt Arsenault void getAnalysisUsage(AnalysisUsage &AU) const override { 87*11e482c4SMatt Arsenault AU.addRequired<SlotIndexesWrapperPass>(); 88*11e482c4SMatt Arsenault RegAllocPriorityAdvisorAnalysis::getAnalysisUsage(AU); 89*11e482c4SMatt Arsenault } 90*11e482c4SMatt Arsenault 91*11e482c4SMatt Arsenault std::unique_ptr<RegAllocPriorityAdvisor> 92*11e482c4SMatt Arsenault getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { 93*11e482c4SMatt Arsenault return std::make_unique<DummyPriorityAdvisor>( 94*11e482c4SMatt Arsenault MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI()); 95*11e482c4SMatt Arsenault } 96*11e482c4SMatt Arsenault }; 97*11e482c4SMatt Arsenault 98d8a2d3f7SEric Wang } // namespace 99d8a2d3f7SEric Wang 100d8a2d3f7SEric Wang template <> Pass *llvm::callDefaultCtor<RegAllocPriorityAdvisorAnalysis>() { 101d8a2d3f7SEric Wang Pass *Ret = nullptr; 102d8a2d3f7SEric Wang switch (Mode) { 103d8a2d3f7SEric Wang case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default: 104d8a2d3f7SEric Wang Ret = new DefaultPriorityAdvisorAnalysis(/*NotAsRequested*/ false); 105d8a2d3f7SEric Wang break; 106*11e482c4SMatt Arsenault case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy: 107*11e482c4SMatt Arsenault Ret = new DummyPriorityAdvisorAnalysis(); 108*11e482c4SMatt Arsenault break; 109d8a2d3f7SEric Wang case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development: 110edc83a15SKazu Hirata #if defined(LLVM_HAVE_TFLITE) 1115b26f4f0SEric Wang Ret = createDevelopmentModePriorityAdvisor(); 1125b26f4f0SEric Wang #endif 113d8a2d3f7SEric Wang break; 114d8a2d3f7SEric Wang case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release: 1155b26f4f0SEric Wang Ret = createReleaseModePriorityAdvisor(); 116d8a2d3f7SEric Wang break; 117d8a2d3f7SEric Wang } 118d8a2d3f7SEric Wang if (Ret) 119d8a2d3f7SEric Wang return Ret; 120d8a2d3f7SEric Wang return new DefaultPriorityAdvisorAnalysis(/*NotAsRequested*/ true); 121d8a2d3f7SEric Wang } 122d8a2d3f7SEric Wang 123d8a2d3f7SEric Wang StringRef RegAllocPriorityAdvisorAnalysis::getPassName() const { 124d8a2d3f7SEric Wang switch (getAdvisorMode()) { 125d8a2d3f7SEric Wang case AdvisorMode::Default: 126d8a2d3f7SEric Wang return "Default Regalloc Priority Advisor"; 127d8a2d3f7SEric Wang case AdvisorMode::Release: 128d8a2d3f7SEric Wang return "Release mode Regalloc Priority Advisor"; 129d8a2d3f7SEric Wang case AdvisorMode::Development: 130d8a2d3f7SEric Wang return "Development mode Regalloc Priority Advisor"; 131*11e482c4SMatt Arsenault case AdvisorMode::Dummy: 132*11e482c4SMatt Arsenault return "Dummy Regalloc Priority Advisor"; 133d8a2d3f7SEric Wang } 134d8a2d3f7SEric Wang llvm_unreachable("Unknown advisor kind"); 135d8a2d3f7SEric Wang } 136d8a2d3f7SEric Wang 137ad8eb855SEric Wang RegAllocPriorityAdvisor::RegAllocPriorityAdvisor(const MachineFunction &MF, 138d8a2d3f7SEric Wang const RAGreedy &RA, 139d8a2d3f7SEric Wang SlotIndexes *const Indexes) 140ad8eb855SEric Wang : RA(RA), LIS(RA.getLiveIntervals()), VRM(RA.getVirtRegMap()), 141ad8eb855SEric Wang MRI(&VRM->getRegInfo()), TRI(MF.getSubtarget().getRegisterInfo()), 142d8a2d3f7SEric Wang RegClassInfo(RA.getRegClassInfo()), Indexes(Indexes), 143ad8eb855SEric Wang RegClassPriorityTrumpsGlobalness( 144ad8eb855SEric Wang RA.getRegClassPriorityTrumpsGlobalness()), 145ad8eb855SEric Wang ReverseLocalAssignment(RA.getReverseLocalAssignment()) {} 146