diff options
author | Nadav Rotem <nrotem@apple.com> | 2012-09-12 04:57:37 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2012-09-12 04:57:37 +0000 |
commit | 8ff00989fc14b2e85f8d81a94195e98e9ca243f0 (patch) | |
tree | 992dbb5dfc5e623395b57ad4d4b3d8843a586893 /llvm/lib/CodeGen/StackColoring.cpp | |
parent | 103f02820d20fd880792d3f4c179aead198597d5 (diff) | |
download | bcm5719-llvm-8ff00989fc14b2e85f8d81a94195e98e9ca243f0.tar.gz bcm5719-llvm-8ff00989fc14b2e85f8d81a94195e98e9ca243f0.zip |
Stack coloring: remove lifetime intervals which contain escaped allocas.
The input program may contain intructions which are not inside lifetime
markers. This can happen due to a bug in the compiler or due to a bug in
user code (for example, returning a reference to a local variable).
This commit adds checks that all of the instructions in the function and
invalidates lifetime ranges which do not contain all of the instructions.
llvm-svn: 163678
Diffstat (limited to 'llvm/lib/CodeGen/StackColoring.cpp')
-rw-r--r-- | llvm/lib/CodeGen/StackColoring.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/StackColoring.cpp b/llvm/lib/CodeGen/StackColoring.cpp index 6df932c1ae0..16b715a7962 100644 --- a/llvm/lib/CodeGen/StackColoring.cpp +++ b/llvm/lib/CodeGen/StackColoring.cpp @@ -158,6 +158,14 @@ private: /// slots to use the joint slots. void remapInstructions(DenseMap<int, int> &SlotRemap); + /// The input program may contain intructions which are not inside lifetime + /// markers. This can happen due to a bug in the compiler or due to a bug in + /// user code (for example, returning a reference to a local variable). + /// This procedure checks all of the instructions in the function and + /// invalidates lifetime ranges which do not contain all of the instructions + /// which access that frame slot. + void removeInvalidSlotRanges(); + /// Map entries which point to other entries to their destination. /// A->B->C becomes A->C. void expungeSlotMap(DenseMap<int, int> &SlotRemap, unsigned NumSlots); @@ -543,6 +551,43 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) { DEBUG(dbgs()<<"Fixed "<<FixedInstr<<" machine instructions.\n"); } +void StackColoring::removeInvalidSlotRanges() { + MachineFunction::iterator BB, BBE; + MachineBasicBlock::iterator I, IE; + for (BB = MF->begin(), BBE = MF->end(); BB != BBE; ++BB) + for (I = BB->begin(), IE = BB->end(); I != IE; ++I) { + + if (I->getOpcode() == TargetOpcode::LIFETIME_START || + I->getOpcode() == TargetOpcode::LIFETIME_END || I->isDebugValue()) + continue; + + // Check all of the machine operands. + for (unsigned i = 0 ; i < I->getNumOperands(); ++i) { + MachineOperand &MO = I->getOperand(i); + + if (!MO.isFI()) + continue; + + int Slot = MO.getIndex(); + + if (Slot<0) + continue; + + if (Intervals[Slot]->empty()) + continue; + + // Check that the used slot is inside the calculated lifetime range. + // If it is not, warn about it and invalidate the range. + LiveInterval *Interval = Intervals[Slot]; + SlotIndex Index = Indexes->getInstructionIndex(I); + if (Interval->find(Index) == Interval->end()) { + Intervals[Slot]->clear(); + DEBUG(dbgs()<<"Invalidating range #"<<Slot<<"\n"); + } + } + } +} + void StackColoring::expungeSlotMap(DenseMap<int, int> &SlotRemap, unsigned NumSlots) { // Expunge slot remap map. @@ -617,6 +662,8 @@ bool StackColoring::runOnMachineFunction(MachineFunction &Func) { // Propagate the liveness information. calculateLiveIntervals(NumSlots); + removeInvalidSlotRanges(); + // Maps old slots to new slots. DenseMap<int, int> SlotRemap; unsigned RemovedSlots = 0; |