1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Clear up the last (famous last words) frame index value reuse issues for Thumb1.

llvm-svn: 98109
This commit is contained in:
Jim Grosbach 2010-03-10 00:13:42 +00:00
parent 3800f76c1a
commit aa8617389c
3 changed files with 12 additions and 8 deletions

View File

@ -57,6 +57,7 @@ bool PEI::runOnMachineFunction(MachineFunction &Fn) {
const TargetRegisterInfo *TRI = Fn.getTarget().getRegisterInfo();
RS = TRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : NULL;
FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(Fn);
FrameConstantRegMap.clear();
// Get MachineModuleInfo so that we can track the construction of the
// frame.
@ -693,8 +694,7 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
assert (FrameIndexVirtualScavenging &&
"Not scavenging, but virtual returned from "
"eliminateFrameIndex()!");
FrameConstantRegMap[VReg] = FrameConstantEntry(Value.second,
SPAdj);
FrameConstantRegMap[VReg] = FrameConstantEntry(Value, SPAdj);
}
// Reset the iterator if we were at the beginning of the BB.
@ -765,12 +765,12 @@ void PEI::scavengeFrameVirtualRegs(MachineFunction &Fn) {
unsigned CurrentVirtReg = 0;
unsigned CurrentScratchReg = 0;
bool havePrevValue = false;
int PrevValue = 0;
TargetRegisterInfo::FrameIndexValue PrevValue(0,0);
TargetRegisterInfo::FrameIndexValue Value(0,0);
MachineInstr *PrevLastUseMI = NULL;
unsigned PrevLastUseOp = 0;
bool trackingCurrentValue = false;
int SPAdj = 0;
int Value = 0;
// The instruction stream may change in the loop, so check BB->end()
// directly.
@ -827,8 +827,11 @@ void PEI::scavengeFrameVirtualRegs(MachineFunction &Fn) {
if (trackingCurrentValue) {
SPAdj = (*Entry).second.second;
Value = (*Entry).second.first;
} else
SPAdj = Value = 0;
} else {
SPAdj = 0;
Value.first = 0;
Value.second = 0;
}
// If the scratch register from the last allocation is still
// available, see if the value matches. If it does, just re-use it.

View File

@ -102,7 +102,8 @@ namespace llvm {
// When using the scavenger post-pass to resolve frame reference
// materialization registers, maintain a map of the registers to
// the constant value and SP adjustment associated with it.
typedef std::pair<int, int> FrameConstantEntry;
typedef std::pair<TargetRegisterInfo::FrameIndexValue, int>
FrameConstantEntry;
DenseMap<unsigned, FrameConstantEntry> FrameConstantRegMap;
#ifndef NDEBUG

View File

@ -642,7 +642,7 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass);
assert (Value && "Frame index virtual allocated, but Value arg is NULL!");
bool UseRR = false;
bool TrackVReg = FrameReg == ARM::SP;
bool TrackVReg = true;
Value->first = FrameReg; // use the frame register as a kind indicator
Value->second = Offset;