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