LiveVariables.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. #pragma once
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic push
  4. #pragma GCC diagnostic ignored "-Wunused-parameter"
  5. #endif
  6. //===-- llvm/CodeGen/LiveVariables.h - Live Variable Analysis ---*- C++ -*-===//
  7. //
  8. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  9. // See https://llvm.org/LICENSE.txt for license information.
  10. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  11. //
  12. //===----------------------------------------------------------------------===//
  13. //
  14. // This file implements the LiveVariables analysis pass. For each machine
  15. // instruction in the function, this pass calculates the set of registers that
  16. // are immediately dead after the instruction (i.e., the instruction calculates
  17. // the value, but it is never used) and the set of registers that are used by
  18. // the instruction, but are never used after the instruction (i.e., they are
  19. // killed).
  20. //
  21. // This class computes live variables using a sparse implementation based on
  22. // the machine code SSA form. This class computes live variable information for
  23. // each virtual and _register allocatable_ physical register in a function. It
  24. // uses the dominance properties of SSA form to efficiently compute live
  25. // variables for virtual registers, and assumes that physical registers are only
  26. // live within a single basic block (allowing it to do a single local analysis
  27. // to resolve physical register lifetimes in each basic block). If a physical
  28. // register is not register allocatable, it is not tracked. This is useful for
  29. // things like the stack pointer and condition codes.
  30. //
  31. //===----------------------------------------------------------------------===//
  32. #ifndef LLVM_CODEGEN_LIVEVARIABLES_H
  33. #define LLVM_CODEGEN_LIVEVARIABLES_H
  34. #include "llvm/ADT/DenseMap.h"
  35. #include "llvm/ADT/IndexedMap.h"
  36. #include "llvm/ADT/SmallSet.h"
  37. #include "llvm/ADT/SmallVector.h"
  38. #include "llvm/ADT/SparseBitVector.h"
  39. #include "llvm/CodeGen/MachineFunctionPass.h"
  40. #include "llvm/CodeGen/MachineInstr.h"
  41. #include "llvm/CodeGen/TargetRegisterInfo.h"
  42. #include "llvm/InitializePasses.h"
  43. namespace llvm {
  44. class MachineBasicBlock;
  45. class MachineRegisterInfo;
  46. class LiveVariables : public MachineFunctionPass {
  47. public:
  48. static char ID; // Pass identification, replacement for typeid
  49. LiveVariables() : MachineFunctionPass(ID) {
  50. initializeLiveVariablesPass(*PassRegistry::getPassRegistry());
  51. }
  52. /// VarInfo - This represents the regions where a virtual register is live in
  53. /// the program. We represent this with three different pieces of
  54. /// information: the set of blocks in which the instruction is live
  55. /// throughout, the set of blocks in which the instruction is actually used,
  56. /// and the set of non-phi instructions that are the last users of the value.
  57. ///
  58. /// In the common case where a value is defined and killed in the same block,
  59. /// There is one killing instruction, and AliveBlocks is empty.
  60. ///
  61. /// Otherwise, the value is live out of the block. If the value is live
  62. /// throughout any blocks, these blocks are listed in AliveBlocks. Blocks
  63. /// where the liveness range ends are not included in AliveBlocks, instead
  64. /// being captured by the Kills set. In these blocks, the value is live into
  65. /// the block (unless the value is defined and killed in the same block) and
  66. /// lives until the specified instruction. Note that there cannot ever be a
  67. /// value whose Kills set contains two instructions from the same basic block.
  68. ///
  69. /// PHI nodes complicate things a bit. If a PHI node is the last user of a
  70. /// value in one of its predecessor blocks, it is not listed in the kills set,
  71. /// but does include the predecessor block in the AliveBlocks set (unless that
  72. /// block also defines the value). This leads to the (perfectly sensical)
  73. /// situation where a value is defined in a block, and the last use is a phi
  74. /// node in the successor. In this case, AliveBlocks is empty (the value is
  75. /// not live across any blocks) and Kills is empty (phi nodes are not
  76. /// included). This is sensical because the value must be live to the end of
  77. /// the block, but is not live in any successor blocks.
  78. struct VarInfo {
  79. /// AliveBlocks - Set of blocks in which this value is alive completely
  80. /// through. This is a bit set which uses the basic block number as an
  81. /// index.
  82. ///
  83. SparseBitVector<> AliveBlocks;
  84. /// Kills - List of MachineInstruction's which are the last use of this
  85. /// virtual register (kill it) in their basic block.
  86. ///
  87. std::vector<MachineInstr*> Kills;
  88. /// removeKill - Delete a kill corresponding to the specified
  89. /// machine instruction. Returns true if there was a kill
  90. /// corresponding to this instruction, false otherwise.
  91. bool removeKill(MachineInstr &MI) {
  92. std::vector<MachineInstr *>::iterator I = find(Kills, &MI);
  93. if (I == Kills.end())
  94. return false;
  95. Kills.erase(I);
  96. return true;
  97. }
  98. /// findKill - Find a kill instruction in MBB. Return NULL if none is found.
  99. MachineInstr *findKill(const MachineBasicBlock *MBB) const;
  100. /// isLiveIn - Is Reg live in to MBB? This means that Reg is live through
  101. /// MBB, or it is killed in MBB. If Reg is only used by PHI instructions in
  102. /// MBB, it is not considered live in.
  103. bool isLiveIn(const MachineBasicBlock &MBB, Register Reg,
  104. MachineRegisterInfo &MRI);
  105. void dump() const;
  106. };
  107. private:
  108. /// VirtRegInfo - This list is a mapping from virtual register number to
  109. /// variable information.
  110. ///
  111. IndexedMap<VarInfo, VirtReg2IndexFunctor> VirtRegInfo;
  112. /// PHIJoins - list of virtual registers that are PHI joins. These registers
  113. /// may have multiple definitions, and they require special handling when
  114. /// building live intervals.
  115. SparseBitVector<> PHIJoins;
  116. private: // Intermediate data structures
  117. MachineFunction *MF;
  118. MachineRegisterInfo* MRI;
  119. const TargetRegisterInfo *TRI;
  120. // PhysRegInfo - Keep track of which instruction was the last def of a
  121. // physical register. This is a purely local property, because all physical
  122. // register references are presumed dead across basic blocks.
  123. std::vector<MachineInstr *> PhysRegDef;
  124. // PhysRegInfo - Keep track of which instruction was the last use of a
  125. // physical register. This is a purely local property, because all physical
  126. // register references are presumed dead across basic blocks.
  127. std::vector<MachineInstr *> PhysRegUse;
  128. std::vector<SmallVector<unsigned, 4>> PHIVarInfo;
  129. // DistanceMap - Keep track the distance of a MI from the start of the
  130. // current basic block.
  131. DenseMap<MachineInstr*, unsigned> DistanceMap;
  132. /// HandlePhysRegKill - Add kills of Reg and its sub-registers to the
  133. /// uses. Pay special attention to the sub-register uses which may come below
  134. /// the last use of the whole register.
  135. bool HandlePhysRegKill(Register Reg, MachineInstr *MI);
  136. /// HandleRegMask - Call HandlePhysRegKill for all registers clobbered by Mask.
  137. void HandleRegMask(const MachineOperand&);
  138. void HandlePhysRegUse(Register Reg, MachineInstr &MI);
  139. void HandlePhysRegDef(Register Reg, MachineInstr *MI,
  140. SmallVectorImpl<unsigned> &Defs);
  141. void UpdatePhysRegDefs(MachineInstr &MI, SmallVectorImpl<unsigned> &Defs);
  142. /// FindLastRefOrPartRef - Return the last reference or partial reference of
  143. /// the specified register.
  144. MachineInstr *FindLastRefOrPartRef(Register Reg);
  145. /// FindLastPartialDef - Return the last partial def of the specified
  146. /// register. Also returns the sub-registers that're defined by the
  147. /// instruction.
  148. MachineInstr *FindLastPartialDef(Register Reg,
  149. SmallSet<unsigned, 4> &PartDefRegs);
  150. /// analyzePHINodes - Gather information about the PHI nodes in here. In
  151. /// particular, we want to map the variable information of a virtual
  152. /// register which is used in a PHI node. We map that to the BB the vreg
  153. /// is coming from.
  154. void analyzePHINodes(const MachineFunction& Fn);
  155. void runOnInstr(MachineInstr &MI, SmallVectorImpl<unsigned> &Defs);
  156. void runOnBlock(MachineBasicBlock *MBB, unsigned NumRegs);
  157. public:
  158. bool runOnMachineFunction(MachineFunction &MF) override;
  159. /// RegisterDefIsDead - Return true if the specified instruction defines the
  160. /// specified register, but that definition is dead.
  161. bool RegisterDefIsDead(MachineInstr &MI, Register Reg) const;
  162. //===--------------------------------------------------------------------===//
  163. // API to update live variable information
  164. /// Recompute liveness from scratch for a virtual register \p Reg that is
  165. /// known to have a single def that dominates all uses. This can be useful
  166. /// after removing some uses of \p Reg. It is not necessary for the whole
  167. /// machine function to be in SSA form.
  168. void recomputeForSingleDefVirtReg(Register Reg);
  169. /// replaceKillInstruction - Update register kill info by replacing a kill
  170. /// instruction with a new one.
  171. void replaceKillInstruction(Register Reg, MachineInstr &OldMI,
  172. MachineInstr &NewMI);
  173. /// addVirtualRegisterKilled - Add information about the fact that the
  174. /// specified register is killed after being used by the specified
  175. /// instruction. If AddIfNotFound is true, add a implicit operand if it's
  176. /// not found.
  177. void addVirtualRegisterKilled(Register IncomingReg, MachineInstr &MI,
  178. bool AddIfNotFound = false) {
  179. if (MI.addRegisterKilled(IncomingReg, TRI, AddIfNotFound))
  180. getVarInfo(IncomingReg).Kills.push_back(&MI);
  181. }
  182. /// removeVirtualRegisterKilled - Remove the specified kill of the virtual
  183. /// register from the live variable information. Returns true if the
  184. /// variable was marked as killed by the specified instruction,
  185. /// false otherwise.
  186. bool removeVirtualRegisterKilled(Register Reg, MachineInstr &MI) {
  187. if (!getVarInfo(Reg).removeKill(MI))
  188. return false;
  189. bool Removed = false;
  190. for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
  191. MachineOperand &MO = MI.getOperand(i);
  192. if (MO.isReg() && MO.isKill() && MO.getReg() == Reg) {
  193. MO.setIsKill(false);
  194. Removed = true;
  195. break;
  196. }
  197. }
  198. assert(Removed && "Register is not used by this instruction!");
  199. (void)Removed;
  200. return true;
  201. }
  202. /// removeVirtualRegistersKilled - Remove all killed info for the specified
  203. /// instruction.
  204. void removeVirtualRegistersKilled(MachineInstr &MI);
  205. /// addVirtualRegisterDead - Add information about the fact that the specified
  206. /// register is dead after being used by the specified instruction. If
  207. /// AddIfNotFound is true, add a implicit operand if it's not found.
  208. void addVirtualRegisterDead(Register IncomingReg, MachineInstr &MI,
  209. bool AddIfNotFound = false) {
  210. if (MI.addRegisterDead(IncomingReg, TRI, AddIfNotFound))
  211. getVarInfo(IncomingReg).Kills.push_back(&MI);
  212. }
  213. /// removeVirtualRegisterDead - Remove the specified kill of the virtual
  214. /// register from the live variable information. Returns true if the
  215. /// variable was marked dead at the specified instruction, false
  216. /// otherwise.
  217. bool removeVirtualRegisterDead(Register Reg, MachineInstr &MI) {
  218. if (!getVarInfo(Reg).removeKill(MI))
  219. return false;
  220. bool Removed = false;
  221. for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
  222. MachineOperand &MO = MI.getOperand(i);
  223. if (MO.isReg() && MO.isDef() && MO.getReg() == Reg) {
  224. MO.setIsDead(false);
  225. Removed = true;
  226. break;
  227. }
  228. }
  229. assert(Removed && "Register is not defined by this instruction!");
  230. (void)Removed;
  231. return true;
  232. }
  233. void getAnalysisUsage(AnalysisUsage &AU) const override;
  234. void releaseMemory() override {
  235. VirtRegInfo.clear();
  236. }
  237. /// getVarInfo - Return the VarInfo structure for the specified VIRTUAL
  238. /// register.
  239. VarInfo &getVarInfo(Register Reg);
  240. void MarkVirtRegAliveInBlock(VarInfo& VRInfo, MachineBasicBlock* DefBlock,
  241. MachineBasicBlock *BB);
  242. void MarkVirtRegAliveInBlock(VarInfo &VRInfo, MachineBasicBlock *DefBlock,
  243. MachineBasicBlock *BB,
  244. SmallVectorImpl<MachineBasicBlock *> &WorkList);
  245. void HandleVirtRegDef(Register reg, MachineInstr &MI);
  246. void HandleVirtRegUse(Register reg, MachineBasicBlock *MBB, MachineInstr &MI);
  247. bool isLiveIn(Register Reg, const MachineBasicBlock &MBB) {
  248. return getVarInfo(Reg).isLiveIn(MBB, Reg, *MRI);
  249. }
  250. /// isLiveOut - Determine if Reg is live out from MBB, when not considering
  251. /// PHI nodes. This means that Reg is either killed by a successor block or
  252. /// passed through one.
  253. bool isLiveOut(Register Reg, const MachineBasicBlock &MBB);
  254. /// addNewBlock - Add a new basic block BB between DomBB and SuccBB. All
  255. /// variables that are live out of DomBB and live into SuccBB will be marked
  256. /// as passing live through BB. This method assumes that the machine code is
  257. /// still in SSA form.
  258. void addNewBlock(MachineBasicBlock *BB,
  259. MachineBasicBlock *DomBB,
  260. MachineBasicBlock *SuccBB);
  261. void addNewBlock(MachineBasicBlock *BB,
  262. MachineBasicBlock *DomBB,
  263. MachineBasicBlock *SuccBB,
  264. std::vector<SparseBitVector<>> &LiveInSets);
  265. /// isPHIJoin - Return true if Reg is a phi join register.
  266. bool isPHIJoin(Register Reg) { return PHIJoins.test(Reg.id()); }
  267. /// setPHIJoin - Mark Reg as a phi join register.
  268. void setPHIJoin(Register Reg) { PHIJoins.set(Reg.id()); }
  269. };
  270. } // End llvm namespace
  271. #endif
  272. #ifdef __GNUC__
  273. #pragma GCC diagnostic pop
  274. #endif