diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-19 18:28:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-19 18:28:02 +0000 |
commit | afa9d7eb8598abb2f8de756307ed89e576c5c5a3 (patch) | |
tree | 299a4d580b8189629e49e566f48a85b350a966cf /llvm/lib/CodeGen/LiveVariables.cpp | |
parent | 5e9868a77b1c6dda3212cb6ef19896de7530586b (diff) | |
download | bcm5719-llvm-afa9d7eb8598abb2f8de756307ed89e576c5c5a3.tar.gz bcm5719-llvm-afa9d7eb8598abb2f8de756307ed89e576c5c5a3.zip |
Add method to update livevar when an instruction moves
llvm-svn: 11625
Diffstat (limited to 'llvm/lib/CodeGen/LiveVariables.cpp')
-rw-r--r-- | llvm/lib/CodeGen/LiveVariables.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp index 0554bae87be..c4c8d639292 100644 --- a/llvm/lib/CodeGen/LiveVariables.cpp +++ b/llvm/lib/CodeGen/LiveVariables.cpp @@ -33,6 +33,7 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Support/CFG.h" #include "Support/DepthFirstIterator.h" +#include "Support/STLExtras.h" using namespace llvm; static RegisterAnalysis<LiveVariables> X("livevars", "Live Variable Analysis"); @@ -313,3 +314,36 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) { return false; } + +/// instructionChanged - When the address of an instruction changes, this +/// method should be called so that live variables can update its internal +/// data structures. This removes the records for OldMI, transfering them to +/// the records for NewMI. +void LiveVariables::instructionChanged(MachineInstr *OldMI, + MachineInstr *NewMI) { + // If the instruction defines any virtual registers, update the VarInfo for + // the instruction. + for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) { + MachineOperand &MO = NewMI->getOperand(i); + if (MO.isRegister() && MO.isDef() && + MRegisterInfo::isVirtualRegister(MO.getReg())) { + unsigned Reg = MO.getReg(); + VarInfo &VI = getVarInfo(Reg); + if (VI.DefInst == OldMI) + VI.DefInst = NewMI; + } + } + + // Move the killed information over... + killed_iterator I, E; + tie(I, E) = killed_range(OldMI); + for (killed_iterator A = I; A != E; ++A) + RegistersKilled.insert(std::make_pair(NewMI, A->second)); + RegistersKilled.erase(I, E); + + // Move the dead information over... + tie(I, E) = dead_range(OldMI); + for (killed_iterator A = I; A != E; ++A) + RegistersDead.insert(std::make_pair(NewMI, A->second)); + RegistersDead.erase(I, E); +} |