aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/MachineBasicBlock.cpp
diff options
context:
space:
mode:
authorCameron Zwarich <zwarich@apple.com>2013-02-17 00:10:44 +0000
committerCameron Zwarich <zwarich@apple.com>2013-02-17 00:10:44 +0000
commitf0b2535344e8c9e2912da78010918a44c5a18cab (patch)
tree74335c2750bc468334a70f31581aee40cf255c0d /lib/CodeGen/MachineBasicBlock.cpp
parentcc54889cd58322b8766525f43cc1f7cb52e4692e (diff)
Add support for updating the LiveIntervals of registers used by 'exotic'
terminators that actually have register uses when splitting critical edges. This commit also introduces a method repairIntervalsInRange() on LiveIntervals, which allows for repairing LiveIntervals in a small range after an arbitrary target hook modifies, inserts, and removes instructions. It's pretty limited right now, but I hope to extend it to support all of the things that are done by the convertToThreeAddress() target hooks. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175382 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineBasicBlock.cpp')
-rw-r--r--lib/CodeGen/MachineBasicBlock.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/CodeGen/MachineBasicBlock.cpp b/lib/CodeGen/MachineBasicBlock.cpp
index df1c7c2a66..3d754366ee 100644
--- a/lib/CodeGen/MachineBasicBlock.cpp
+++ b/lib/CodeGen/MachineBasicBlock.cpp
@@ -698,6 +698,24 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
}
}
+ SmallVector<unsigned, 4> UsedRegs;
+ if (LIS) {
+ for (instr_iterator I = getFirstInstrTerminator(), E = instr_end();
+ I != E; ++I) {
+ MachineInstr *MI = I;
+
+ for (MachineInstr::mop_iterator OI = MI->operands_begin(),
+ OE = MI->operands_end(); OI != OE; ++OI) {
+ if (!OI->isReg() || OI->getReg() == 0)
+ continue;
+
+ unsigned Reg = OI->getReg();
+ if (std::find(UsedRegs.begin(), UsedRegs.end(), Reg) == UsedRegs.end())
+ UsedRegs.push_back(Reg);
+ }
+ }
+ }
+
ReplaceUsesOfBlockWith(Succ, NMBB);
// If updateTerminator() removes instructions, we need to remove them from
@@ -830,6 +848,17 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
LI.removeRange(StartIndex, EndIndex);
}
}
+
+ // Update all intervals for registers whose uses may have been modified by
+ // updateTerminator().
+ iterator FirstTerminator = getFirstTerminator();
+ MachineInstr *FirstTerminatorMI = FirstTerminator;
+ if (FirstTerminatorMI->isBundled())
+ FirstTerminatorMI = getBundleStart(FirstTerminatorMI);
+ reverse_iterator PreTerminators =
+ (FirstTerminator == begin()) ? rend()
+ : reverse_iterator(FirstTerminatorMI);
+ LIS->repairIntervalsInRange(this, rbegin(), PreTerminators, UsedRegs);
}
if (MachineDominatorTree *MDT =