LiveVariables.h revision ea61c358720aa6c7a159d51658b34276316aa841
10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch//===-- llvm/CodeGen/LiveVariables.h - Live Variable Analysis ---*- C++ -*-===// 2d0825bca7fe65beaee391d30da42e937db621564Steve Block// 3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// The LLVM Compiler Infrastructure 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This file was developed by the LLVM research group and is distributed under 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// the University of Illinois Open Source License. See LICENSE.TXT for details. 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch//===----------------------------------------------------------------------===// 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This file implements the LiveVariable analysis pass. For each machine 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// instruction in the function, this pass calculates the set of registers that 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// are immediately dead after the instruction (i.e., the instruction calculates 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// the value, but it is never used) and the set of registers that are used by 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// the instruction, but are never used after the instruction (i.e., they are 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// killed). 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This class computes live variables using are sparse implementation based on 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// the machine code SSA form. This class computes live variable information for 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// each virtual and _register allocatable_ physical register in a function. It 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// uses the dominance properties of SSA form to efficiently compute live 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// variables for virtual registers, and assumes that physical registers are only 22d0825bca7fe65beaee391d30da42e937db621564Steve Block// live within a single basic block (allowing it to do a single local analysis 23d0825bca7fe65beaee391d30da42e937db621564Steve Block// to resolve physical register lifetimes in each basic block). If a physical 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// register is not register allocatable, it is not tracked. This is useful for 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// things like the stack pointer and condition codes. 26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch//===----------------------------------------------------------------------===// 28d0825bca7fe65beaee391d30da42e937db621564Steve Block 29d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef LLVM_CODEGEN_LIVEVARIABLES_H 30d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LLVM_CODEGEN_LIVEVARIABLES_H 31d0825bca7fe65beaee391d30da42e937db621564Steve Block 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "llvm/CodeGen/MachineFunctionPass.h" 33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <map> 34d0825bca7fe65beaee391d30da42e937db621564Steve Block 35d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace llvm { 36d0825bca7fe65beaee391d30da42e937db621564Steve Block 37d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass MRegisterInfo; 38d0825bca7fe65beaee391d30da42e937db621564Steve Block 39d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass LiveVariables : public MachineFunctionPass { 40d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 41d0825bca7fe65beaee391d30da42e937db621564Steve Block struct VarInfo { 42d0825bca7fe65beaee391d30da42e937db621564Steve Block /// DefInst - The machine instruction that defines this register. 43d0825bca7fe65beaee391d30da42e937db621564Steve Block MachineInstr *DefInst; 44d0825bca7fe65beaee391d30da42e937db621564Steve Block 45d0825bca7fe65beaee391d30da42e937db621564Steve Block /// AliveBlocks - Set of blocks of which this value is alive completely 46d0825bca7fe65beaee391d30da42e937db621564Steve Block /// through. This is a bit set which uses the basic block number as an 47d0825bca7fe65beaee391d30da42e937db621564Steve Block /// index. 48d0825bca7fe65beaee391d30da42e937db621564Steve Block /// 49d0825bca7fe65beaee391d30da42e937db621564Steve Block std::vector<bool> AliveBlocks; 50d0825bca7fe65beaee391d30da42e937db621564Steve Block 51d0825bca7fe65beaee391d30da42e937db621564Steve Block /// Kills - List of MachineInstruction's which are the last use of this 52d0825bca7fe65beaee391d30da42e937db621564Steve Block /// virtual register (kill it) in their basic block. 53d0825bca7fe65beaee391d30da42e937db621564Steve Block /// 54d0825bca7fe65beaee391d30da42e937db621564Steve Block std::vector<MachineInstr*> Kills; 55d0825bca7fe65beaee391d30da42e937db621564Steve Block 56d0825bca7fe65beaee391d30da42e937db621564Steve Block VarInfo() : DefInst(0) {} 57d0825bca7fe65beaee391d30da42e937db621564Steve Block 58d0825bca7fe65beaee391d30da42e937db621564Steve Block /// removeKill - Delete a kill corresponding to the specified 59d0825bca7fe65beaee391d30da42e937db621564Steve Block /// machine instruction. Returns true if there was a kill 60d0825bca7fe65beaee391d30da42e937db621564Steve Block /// corresponding to this instruction, false otherwise. 61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool removeKill(MachineInstr *MI) { 62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (std::vector<MachineInstr*>::iterator i = Kills.begin(), 63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block e = Kills.end(); i != e; ++i) 64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (*i == MI) { 65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Kills.erase(i); 66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block }; 71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprivate: 73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// VirtRegInfo - This list is a mapping from virtual register number to 74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// variable information. FirstVirtualRegister is subtracted from the virtual 75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// register number before indexing into this list. 76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// 77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block std::vector<VarInfo> VirtRegInfo; 78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// RegistersKilled - This multimap keeps track of all of the registers that 80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// are dead immediately after an instruction reads its operands. If an 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// instruction does not have an entry in this map, it kills no registers. 82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// 83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block std::multimap<MachineInstr*, unsigned> RegistersKilled; 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// RegistersDead - This multimap keeps track of all of the registers that are 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// dead immediately after an instruction executes, which are not dead after 87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// the operands are evaluated. In practice, this only contains registers 88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// which are defined by an instruction, but never used. 89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// 900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch std::multimap<MachineInstr*, unsigned> RegistersDead; 91d0825bca7fe65beaee391d30da42e937db621564Steve Block 92d0825bca7fe65beaee391d30da42e937db621564Steve Block /// AllocatablePhysicalRegisters - This vector keeps track of which registers 93d0825bca7fe65beaee391d30da42e937db621564Steve Block /// are actually register allocatable by the target machine. We can not track 94d0825bca7fe65beaee391d30da42e937db621564Steve Block /// liveness for values that are not in this set. 95d0825bca7fe65beaee391d30da42e937db621564Steve Block /// 96d0825bca7fe65beaee391d30da42e937db621564Steve Block std::vector<bool> AllocatablePhysicalRegisters; 97d0825bca7fe65beaee391d30da42e937db621564Steve Block 98d0825bca7fe65beaee391d30da42e937db621564Steve Blockprivate: // Intermediate data structures 99d0825bca7fe65beaee391d30da42e937db621564Steve Block const MRegisterInfo *RegInfo; 100d0825bca7fe65beaee391d30da42e937db621564Steve Block 101d0825bca7fe65beaee391d30da42e937db621564Steve Block MachineInstr **PhysRegInfo; 102d0825bca7fe65beaee391d30da42e937db621564Steve Block bool *PhysRegUsed; 103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void HandlePhysRegUse(unsigned Reg, MachineInstr *MI); 105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void HandlePhysRegDef(unsigned Reg, MachineInstr *MI); 106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockpublic: 1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool runOnMachineFunction(MachineFunction &MF); 1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// killed_iterator - Iterate over registers killed by a machine instruction 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// 113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block typedef std::multimap<MachineInstr*, unsigned>::iterator killed_iterator; 1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// killed_begin/end - Get access to the range of registers killed by a 1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// machine instruction. 1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch killed_iterator killed_begin(MachineInstr *MI) { 1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return RegistersKilled.lower_bound(MI); 119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block killed_iterator killed_end(MachineInstr *MI) { 121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return RegistersKilled.upper_bound(MI); 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch std::pair<killed_iterator, killed_iterator> 1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch killed_range(MachineInstr *MI) { 125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return RegistersKilled.equal_range(MI); 126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// KillsRegister - Return true if the specified instruction kills the 1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// specified register. 1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool KillsRegister(MachineInstr *MI, unsigned Reg) { 131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block std::pair<killed_iterator, killed_iterator> KIP = killed_range(MI); 132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (; KIP.first != KIP.second; ++KIP.first) 133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (KIP.first->second == Reg) 134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block killed_iterator dead_begin(MachineInstr *MI) { 139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return RegistersDead.lower_bound(MI); 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch killed_iterator dead_end(MachineInstr *MI) { 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return RegistersDead.upper_bound(MI); 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch std::pair<killed_iterator, killed_iterator> 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch dead_range(MachineInstr *MI) { 146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return RegistersDead.equal_range(MI); 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 148d0825bca7fe65beaee391d30da42e937db621564Steve Block 149d0825bca7fe65beaee391d30da42e937db621564Steve Block //===--------------------------------------------------------------------===// 150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // API to update live variable information 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// instructionChanged - When the address of an instruction changes, this 153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// method should be called so that live variables can update its internal 154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// data structures. This removes the records for OldMI, transfering them to 1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// the records for NewMI. 1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void instructionChanged(MachineInstr *OldMI, MachineInstr *NewMI); 157d0825bca7fe65beaee391d30da42e937db621564Steve Block 158d0825bca7fe65beaee391d30da42e937db621564Steve Block /// addVirtualRegisterKilled - Add information about the fact that the 1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// specified register is killed after being used by the specified 1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// instruction. 1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /// 162d0825bca7fe65beaee391d30da42e937db621564Steve Block void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI) { 163d0825bca7fe65beaee391d30da42e937db621564Steve Block RegistersKilled.insert(std::make_pair(MI, IncomingReg)); 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block getVarInfo(IncomingReg).Kills.push_back(MI); 165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// removeVirtualRegisterKilled - Remove the specified virtual 168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// register from the live variable information. Returns true if the 169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// variable was marked as killed by the specified instruction, 170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// false otherwise. 171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool removeVirtualRegisterKilled(unsigned reg, 172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block MachineBasicBlock *MBB, 173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block MachineInstr *MI) { 174d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!getVarInfo(reg).removeKill(MI)) 175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (killed_iterator i = killed_begin(MI), e = killed_end(MI); i != e; ) { 177d0825bca7fe65beaee391d30da42e937db621564Steve Block if (i->second == reg) 178d0825bca7fe65beaee391d30da42e937db621564Steve Block RegistersKilled.erase(i++); 179d0825bca7fe65beaee391d30da42e937db621564Steve Block else 180d0825bca7fe65beaee391d30da42e937db621564Steve Block ++i; 181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// removeVirtualRegistersKilled - Remove all of the specified killed 186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// registers from the live variable information. 187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void removeVirtualRegistersKilled(killed_iterator B, killed_iterator E) { 188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (killed_iterator I = B; I != E; ++I) { // Remove VarInfo entries... 189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool removed = getVarInfo(I->second).removeKill(I->first); 190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block assert(removed && "kill not in register's VarInfo?"); 191d0825bca7fe65beaee391d30da42e937db621564Steve Block } 192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RegistersKilled.erase(B, E); 193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// addVirtualRegisterDead - Add information about the fact that the specified 196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// register is dead after being used by the specified instruction. 197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// 198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI) { 199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RegistersDead.insert(std::make_pair(MI, IncomingReg)); 200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block getVarInfo(IncomingReg).Kills.push_back(MI); 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// removeVirtualRegisterDead - Remove the specified virtual 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// register from the live variable information. Returns true if the 205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// variable was marked dead at the specified instruction, false 206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// otherwise. 207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool removeVirtualRegisterDead(unsigned reg, 208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block MachineBasicBlock *MBB, 209d0825bca7fe65beaee391d30da42e937db621564Steve Block MachineInstr *MI) { 210d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!getVarInfo(reg).removeKill(MI)) 211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (killed_iterator i = killed_begin(MI), e = killed_end(MI); i != e; ) { 214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (i->second == reg) 215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RegistersKilled.erase(i++); 216d0825bca7fe65beaee391d30da42e937db621564Steve Block else 217d0825bca7fe65beaee391d30da42e937db621564Steve Block ++i; 218d0825bca7fe65beaee391d30da42e937db621564Steve Block } 219d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 221d0825bca7fe65beaee391d30da42e937db621564Steve Block 222d0825bca7fe65beaee391d30da42e937db621564Steve Block /// removeVirtualRegistersDead - Remove all of the specified dead 223d0825bca7fe65beaee391d30da42e937db621564Steve Block /// registers from the live variable information. 224d0825bca7fe65beaee391d30da42e937db621564Steve Block void removeVirtualRegistersDead(killed_iterator B, killed_iterator E) { 225d0825bca7fe65beaee391d30da42e937db621564Steve Block for (killed_iterator I = B; I != E; ++I) // Remove VarInfo entries... 226d0825bca7fe65beaee391d30da42e937db621564Steve Block getVarInfo(I->second).removeKill(I->first); 227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RegistersDead.erase(B, E); 228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void getAnalysisUsage(AnalysisUsage &AU) const { 231231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block AU.setPreservesAll(); 232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 234231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void releaseMemory() { 235231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block VirtRegInfo.clear(); 236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RegistersKilled.clear(); 237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RegistersDead.clear(); 238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// getVarInfo - Return the VarInfo structure for the specified VIRTUAL 241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block /// register. 242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block VarInfo &getVarInfo(unsigned RegIdx); 243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void MarkVirtRegAliveInBlock(VarInfo &VRInfo, MachineBasicBlock *BB); 245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void HandleVirtRegUse(VarInfo &VRInfo, MachineBasicBlock *MBB, 246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block MachineInstr *MI); 247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}; 248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // End llvm namespace 250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block