mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 04:28:30 +00:00
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:
parent
35b35c5c32
commit
34c2a9f57c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user