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:
parent
3800f76c1a
commit
aa8617389c
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user