Try fold re-materialized load instructions into its uses.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41598 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-08-30 05:53:02 +00:00
parent 35b35c5c32
commit 34c2a9f57c

View File

@ -236,10 +236,17 @@ bool LiveIntervals::isReMaterializable(const LiveInterval &li,
return true; return true;
} }
/// tryFoldMemoryOperand - Attempts to fold either a spill / restore from
/// slot / to reg or any rematerialized load into ith operand of specified
/// MI. If it is successul, MI is updated with the newly created MI and
/// returns true.
bool LiveIntervals::tryFoldMemoryOperand(MachineInstr* &MI, VirtRegMap &vrm, bool LiveIntervals::tryFoldMemoryOperand(MachineInstr* &MI, VirtRegMap &vrm,
unsigned index, unsigned i, unsigned index, unsigned i,
bool isSS, MachineInstr *DefMI,
int slot, unsigned reg) { int slot, unsigned reg) {
MachineInstr *fmi = mri_->foldMemoryOperand(MI, i, slot); MachineInstr *fmi = isSS
? mri_->foldMemoryOperand(MI, i, slot)
: mri_->foldMemoryOperand(MI, i, DefMI);
if (fmi) { if (fmi) {
// Attempt to fold the memory reference into the instruction. If // Attempt to fold the memory reference into the instruction. If
// we can do this, we don't need to insert spill code. // we can do this, we don't need to insert spill code.
@ -340,6 +347,8 @@ addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, unsigned reg) {
bool CanDelete = ReMatDelete[I->valno->id]; bool CanDelete = ReMatDelete[I->valno->id];
int LdSlot = 0; int LdSlot = 0;
bool isLoadSS = DefIsReMat && tii_->isLoadFromStackSlot(DefMI, LdSlot); bool isLoadSS = DefIsReMat && tii_->isLoadFromStackSlot(DefMI, LdSlot);
bool isLoad = isLoadSS ||
(DefIsReMat && (DefMI->getInstrDescriptor()->Flags & M_LOAD_FLAG));
unsigned index = getBaseIndex(I->start); unsigned index = getBaseIndex(I->start);
unsigned end = getBaseIndex(I->end-1) + InstrSlots::NUM; unsigned end = getBaseIndex(I->end-1) + InstrSlots::NUM;
for (; index != end; index += InstrSlots::NUM) { for (; index != end; index += InstrSlots::NUM) {
@ -362,20 +371,22 @@ addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, unsigned reg) {
RemoveMachineInstrFromMaps(MI); RemoveMachineInstrFromMaps(MI);
MI->eraseFromParent(); MI->eraseFromParent();
break; break;
} else if (tryFoldMemoryOperand(MI, vrm, index, i, slot, li.reg)) } else if (tryFoldMemoryOperand(MI, vrm, index, i, true,
DefMI, slot, li.reg)) {
// Folding the load/store can completely change the instruction // Folding the load/store can completely change the instruction
// in unpredictable ways, rescan it from the beginning. // in unpredictable ways, rescan it from the beginning.
goto RestartInstruction; goto RestartInstruction;
} else if (isLoadSS && }
tryFoldMemoryOperand(MI, vrm, index, i, LdSlot, li.reg)){ } else if (isLoad &&
// FIXME: Other rematerializable loads can be folded as well. tryFoldMemoryOperand(MI, vrm, index, i, isLoadSS,
// Folding the load/store can completely change the DefMI, LdSlot, li.reg))
// instruction in unpredictable ways, rescan it from // Folding the load/store can completely change the
// the beginning. // instruction in unpredictable ways, rescan it from
goto RestartInstruction; // the beginning.
} goto RestartInstruction;
} else { } else {
if (tryFoldMemoryOperand(MI, vrm, index, i, slot, li.reg)) if (tryFoldMemoryOperand(MI, vrm, index, i, true, DefMI,
slot, li.reg))
// Folding the load/store can completely change the instruction in // Folding the load/store can completely change the instruction in
// unpredictable ways, rescan it from the beginning. // unpredictable ways, rescan it from the beginning.
goto RestartInstruction; goto RestartInstruction;