14f0dad16SChad Rosier //===-- RegUsageInfoCollector.cpp - Register Usage Information Collector --===//
2bbacddfeSMehdi Amini //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bbacddfeSMehdi Amini //
7bbacddfeSMehdi Amini //===----------------------------------------------------------------------===//
8bbacddfeSMehdi Amini ///
9bbacddfeSMehdi Amini /// This pass is required to take advantage of the interprocedural register
10bbacddfeSMehdi Amini /// allocation infrastructure.
11bbacddfeSMehdi Amini ///
12bbacddfeSMehdi Amini /// This pass is simple MachineFunction pass which collects register usage
13bbacddfeSMehdi Amini /// details by iterating through each physical registers and checking
14bbacddfeSMehdi Amini /// MRI::isPhysRegUsed() then creates a RegMask based on this details.
15bbacddfeSMehdi Amini /// The pass then stores this RegMask in PhysicalRegisterUsageInfo.cpp
16bbacddfeSMehdi Amini ///
17bbacddfeSMehdi Amini //===----------------------------------------------------------------------===//
18bbacddfeSMehdi Amini 
194beea662SMehdi Amini #include "llvm/ADT/Statistic.h"
20bbacddfeSMehdi Amini #include "llvm/CodeGen/MachineFunctionPass.h"
21bbacddfeSMehdi Amini #include "llvm/CodeGen/MachineOperand.h"
22bbacddfeSMehdi Amini #include "llvm/CodeGen/MachineRegisterInfo.h"
23bbacddfeSMehdi Amini #include "llvm/CodeGen/Passes.h"
24bbacddfeSMehdi Amini #include "llvm/CodeGen/RegisterUsageInfo.h"
25*989f1c72Sserge-sans-paille #include "llvm/CodeGen/TargetFrameLowering.h"
26*989f1c72Sserge-sans-paille #include "llvm/IR/Function.h"
27bbacddfeSMehdi Amini #include "llvm/Support/Debug.h"
28bbacddfeSMehdi Amini #include "llvm/Support/raw_ostream.h"
29bbacddfeSMehdi Amini 
30bbacddfeSMehdi Amini using namespace llvm;
31bbacddfeSMehdi Amini 
32bbacddfeSMehdi Amini #define DEBUG_TYPE "ip-regalloc"
33bbacddfeSMehdi Amini 
344beea662SMehdi Amini STATISTIC(NumCSROpt,
354beea662SMehdi Amini           "Number of functions optimized for callee saved registers");
364beea662SMehdi Amini 
37bbacddfeSMehdi Amini namespace {
385c1e23b2SMatthias Braun 
39bbacddfeSMehdi Amini class RegUsageInfoCollector : public MachineFunctionPass {
40bbacddfeSMehdi Amini public:
RegUsageInfoCollector()41bbacddfeSMehdi Amini   RegUsageInfoCollector() : MachineFunctionPass(ID) {
42bbacddfeSMehdi Amini     PassRegistry &Registry = *PassRegistry::getPassRegistry();
43bbacddfeSMehdi Amini     initializeRegUsageInfoCollectorPass(Registry);
44bbacddfeSMehdi Amini   }
45bbacddfeSMehdi Amini 
getPassName() const46117296c0SMehdi Amini   StringRef getPassName() const override {
47bbacddfeSMehdi Amini     return "Register Usage Information Collector Pass";
48bbacddfeSMehdi Amini   }
49bbacddfeSMehdi Amini 
getAnalysisUsage(AnalysisUsage & AU) const505c1e23b2SMatthias Braun   void getAnalysisUsage(AnalysisUsage &AU) const override {
515c1e23b2SMatthias Braun     AU.addRequired<PhysicalRegisterUsageInfo>();
525c1e23b2SMatthias Braun     AU.setPreservesAll();
535c1e23b2SMatthias Braun     MachineFunctionPass::getAnalysisUsage(AU);
545c1e23b2SMatthias Braun   }
55bbacddfeSMehdi Amini 
56bbacddfeSMehdi Amini   bool runOnMachineFunction(MachineFunction &MF) override;
57bbacddfeSMehdi Amini 
58d6a7da80SSander de Smalen   // Call getCalleeSaves and then also set the bits for subregs and
597d484faeSJonas Paulsson   // fully saved superregs.
607d484faeSJonas Paulsson   static void computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF);
617d484faeSJonas Paulsson 
62bbacddfeSMehdi Amini   static char ID;
63bbacddfeSMehdi Amini };
645c1e23b2SMatthias Braun 
65bbacddfeSMehdi Amini } // end of anonymous namespace
66bbacddfeSMehdi Amini 
67bbacddfeSMehdi Amini char RegUsageInfoCollector::ID = 0;
68bbacddfeSMehdi Amini 
69bbacddfeSMehdi Amini INITIALIZE_PASS_BEGIN(RegUsageInfoCollector, "RegUsageInfoCollector",
70bbacddfeSMehdi Amini                       "Register Usage Information Collector", false, false)
INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfo)71bbacddfeSMehdi Amini INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfo)
72bbacddfeSMehdi Amini INITIALIZE_PASS_END(RegUsageInfoCollector, "RegUsageInfoCollector",
73bbacddfeSMehdi Amini                     "Register Usage Information Collector", false, false)
74bbacddfeSMehdi Amini 
75bbacddfeSMehdi Amini FunctionPass *llvm::createRegUsageInfoCollector() {
76bbacddfeSMehdi Amini   return new RegUsageInfoCollector();
77bbacddfeSMehdi Amini }
78bbacddfeSMehdi Amini 
79705e46f4SMatt Arsenault // TODO: Move to hook somwehere?
80705e46f4SMatt Arsenault 
81705e46f4SMatt Arsenault // Return true if it is useful to track the used registers for IPRA / no CSR
82705e46f4SMatt Arsenault // optimizations. This is not useful for entry points, and computing the
83705e46f4SMatt Arsenault // register usage information is expensive.
isCallableFunction(const MachineFunction & MF)84705e46f4SMatt Arsenault static bool isCallableFunction(const MachineFunction &MF) {
85705e46f4SMatt Arsenault   switch (MF.getFunction().getCallingConv()) {
86705e46f4SMatt Arsenault   case CallingConv::AMDGPU_VS:
87705e46f4SMatt Arsenault   case CallingConv::AMDGPU_GS:
88705e46f4SMatt Arsenault   case CallingConv::AMDGPU_PS:
89705e46f4SMatt Arsenault   case CallingConv::AMDGPU_CS:
906eb8ae8fSMatt Arsenault   case CallingConv::AMDGPU_HS:
916eb8ae8fSMatt Arsenault   case CallingConv::AMDGPU_ES:
926eb8ae8fSMatt Arsenault   case CallingConv::AMDGPU_LS:
93705e46f4SMatt Arsenault   case CallingConv::AMDGPU_KERNEL:
94705e46f4SMatt Arsenault     return false;
95705e46f4SMatt Arsenault   default:
96705e46f4SMatt Arsenault     return true;
97705e46f4SMatt Arsenault   }
98705e46f4SMatt Arsenault }
99705e46f4SMatt Arsenault 
runOnMachineFunction(MachineFunction & MF)100bbacddfeSMehdi Amini bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) {
101bbacddfeSMehdi Amini   MachineRegisterInfo *MRI = &MF.getRegInfo();
102bc2f4fb6SBenjamin Kramer   const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
1037a75a91bSMatthias Braun   const LLVMTargetMachine &TM = MF.getTarget();
104bbacddfeSMehdi Amini 
105d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << " -------------------- " << getPassName()
106705e46f4SMatt Arsenault                     << " -------------------- \nFunction Name : "
107705e46f4SMatt Arsenault                     << MF.getName() << '\n');
108705e46f4SMatt Arsenault 
109705e46f4SMatt Arsenault   // Analyzing the register usage may be expensive on some targets.
110705e46f4SMatt Arsenault   if (!isCallableFunction(MF)) {
111705e46f4SMatt Arsenault     LLVM_DEBUG(dbgs() << "Not analyzing non-callable function\n");
112705e46f4SMatt Arsenault     return false;
113705e46f4SMatt Arsenault   }
114705e46f4SMatt Arsenault 
115705e46f4SMatt Arsenault   // If there are no callers, there's no point in computing more precise
116705e46f4SMatt Arsenault   // register usage here.
117705e46f4SMatt Arsenault   if (MF.getFunction().use_empty()) {
118705e46f4SMatt Arsenault     LLVM_DEBUG(dbgs() << "Not analyzing function with no callers\n");
119705e46f4SMatt Arsenault     return false;
120705e46f4SMatt Arsenault   }
121bbacddfeSMehdi Amini 
122bbacddfeSMehdi Amini   std::vector<uint32_t> RegMask;
123bbacddfeSMehdi Amini 
124bbacddfeSMehdi Amini   // Compute the size of the bit vector to represent all the registers.
125bbacddfeSMehdi Amini   // The bit vector is broken into 32-bit chunks, thus takes the ceil of
126bbacddfeSMehdi Amini   // the number of registers divided by 32 for the size.
12757dd5b3dSMatthias Braun   unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs());
1285c1e23b2SMatthias Braun   RegMask.resize(RegMaskSize, ~((uint32_t)0));
129bbacddfeSMehdi Amini 
130f1caa283SMatthias Braun   const Function &F = MF.getFunction();
1314beea662SMehdi Amini 
1325c1e23b2SMatthias Braun   PhysicalRegisterUsageInfo &PRUI = getAnalysis<PhysicalRegisterUsageInfo>();
1335c1e23b2SMatthias Braun   PRUI.setTargetMachine(TM);
134bbacddfeSMehdi Amini 
135d34e60caSNicola Zaghen   LLVM_DEBUG(dbgs() << "Clobbered Registers: ");
1364f0dad16SChad Rosier 
1377d484faeSJonas Paulsson   BitVector SavedRegs;
1387d484faeSJonas Paulsson   computeCalleeSavedRegs(SavedRegs, MF);
1397d484faeSJonas Paulsson 
140598d89a3SMarcello Maggioni   const BitVector &UsedPhysRegsMask = MRI->getUsedPhysRegsMask();
141598d89a3SMarcello Maggioni   auto SetRegAsDefined = [&RegMask] (unsigned Reg) {
142598d89a3SMarcello Maggioni     RegMask[Reg / 32] &= ~(1u << Reg % 32);
143598d89a3SMarcello Maggioni   };
1448ed8353fSOliver Stannard 
1458ed8353fSOliver Stannard   // Some targets can clobber registers "inside" a call, typically in
1468ed8353fSOliver Stannard   // linker-generated code.
1478ed8353fSOliver Stannard   for (const MCPhysReg Reg : TRI->getIntraCallClobberedRegs(&MF))
1488ed8353fSOliver Stannard     for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
1498ed8353fSOliver Stannard       SetRegAsDefined(*AI);
1508ed8353fSOliver Stannard 
151598d89a3SMarcello Maggioni   // Scan all the physical registers. When a register is defined in the current
152598d89a3SMarcello Maggioni   // function set it and all the aliasing registers as defined in the regmask.
153705e46f4SMatt Arsenault   // FIXME: Rewrite to use regunits.
154598d89a3SMarcello Maggioni   for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) {
1557d484faeSJonas Paulsson     // Don't count registers that are saved and restored.
1567d484faeSJonas Paulsson     if (SavedRegs.test(PReg))
1577d484faeSJonas Paulsson       continue;
158598d89a3SMarcello Maggioni     // If a register is defined by an instruction mark it as defined together
1597d484faeSJonas Paulsson     // with all it's unsaved aliases.
160598d89a3SMarcello Maggioni     if (!MRI->def_empty(PReg)) {
161598d89a3SMarcello Maggioni       for (MCRegAliasIterator AI(PReg, TRI, true); AI.isValid(); ++AI)
1627d484faeSJonas Paulsson         if (!SavedRegs.test(*AI))
163598d89a3SMarcello Maggioni           SetRegAsDefined(*AI);
16472fe7605SJonas Paulsson       continue;
165598d89a3SMarcello Maggioni     }
16672fe7605SJonas Paulsson     // If a register is in the UsedPhysRegsMask set then mark it as defined.
16772fe7605SJonas Paulsson     // All clobbered aliases will also be in the set, so we can skip setting
16872fe7605SJonas Paulsson     // as defined all the aliases here.
16972fe7605SJonas Paulsson     if (UsedPhysRegsMask.test(PReg))
17072fe7605SJonas Paulsson       SetRegAsDefined(PReg);
171598d89a3SMarcello Maggioni   }
172bbacddfeSMehdi Amini 
1734b7239ebSOliver Stannard   if (TargetFrameLowering::isSafeForNoCSROpt(F) &&
1744b7239ebSOliver Stannard       MF.getSubtarget().getFrameLowering()->isProfitableForNoCSROpt(F)) {
1754beea662SMehdi Amini     ++NumCSROpt;
176d34e60caSNicola Zaghen     LLVM_DEBUG(dbgs() << MF.getName()
1774beea662SMehdi Amini                       << " function optimized for not having CSR.\n");
1784beea662SMehdi Amini   }
17920e4d9e2SChad Rosier 
180705e46f4SMatt Arsenault   LLVM_DEBUG(
181705e46f4SMatt Arsenault     for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) {
182bbacddfeSMehdi Amini       if (MachineOperand::clobbersPhysReg(&(RegMask[0]), PReg))
183705e46f4SMatt Arsenault         dbgs() << printReg(PReg, TRI) << " ";
184705e46f4SMatt Arsenault     }
185bbacddfeSMehdi Amini 
186705e46f4SMatt Arsenault     dbgs() << " \n----------------------------------------\n";
187705e46f4SMatt Arsenault   );
188bbacddfeSMehdi Amini 
1895c1e23b2SMatthias Braun   PRUI.storeUpdateRegUsageInfo(F, RegMask);
190bbacddfeSMehdi Amini 
191bbacddfeSMehdi Amini   return false;
192bbacddfeSMehdi Amini }
1937d484faeSJonas Paulsson 
1947d484faeSJonas Paulsson void RegUsageInfoCollector::
computeCalleeSavedRegs(BitVector & SavedRegs,MachineFunction & MF)1957d484faeSJonas Paulsson computeCalleeSavedRegs(BitVector &SavedRegs, MachineFunction &MF) {
1965c1e23b2SMatthias Braun   const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering();
1975c1e23b2SMatthias Braun   const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
1987d484faeSJonas Paulsson 
1997d484faeSJonas Paulsson   // Target will return the set of registers that it saves/restores as needed.
2007d484faeSJonas Paulsson   SavedRegs.clear();
201d6a7da80SSander de Smalen   TFI.getCalleeSaves(MF, SavedRegs);
2025630e3a1SMatt Arsenault   if (SavedRegs.none())
2035630e3a1SMatt Arsenault     return;
2047d484faeSJonas Paulsson 
2057d484faeSJonas Paulsson   // Insert subregs.
2065c1e23b2SMatthias Braun   const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(&MF);
2077d484faeSJonas Paulsson   for (unsigned i = 0; CSRegs[i]; ++i) {
2085630e3a1SMatt Arsenault     MCPhysReg Reg = CSRegs[i];
2095630e3a1SMatt Arsenault     if (SavedRegs.test(Reg)) {
2105630e3a1SMatt Arsenault       // Save subregisters
2115630e3a1SMatt Arsenault       for (MCSubRegIterator SR(Reg, &TRI); SR.isValid(); ++SR)
2127d484faeSJonas Paulsson         SavedRegs.set(*SR);
2137d484faeSJonas Paulsson     }
2147d484faeSJonas Paulsson   }
215b7b58606SMatthias Braun }
216