From 5ed001b6afe2225343ec79f58645a9aaf35c1fd2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 19 Feb 2004 18:28:02 +0000 Subject: [PATCH] Add method to update livevar when an instruction moves git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11625 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/LiveVariables.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp index 0554bae87be..c4c8d639292 100644 --- a/lib/CodeGen/LiveVariables.cpp +++ b/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 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); +}