mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-21 17:46:17 +00:00
Simplify the LiveRangeEdit::canRematerializeAt() interface a bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118661 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
42c31a7073
commit
b80e973c95
@ -167,9 +167,8 @@ bool InlineSpiller::reMaterializeFor(MachineBasicBlock::iterator MI) {
|
||||
return true;
|
||||
}
|
||||
|
||||
LiveRangeEdit::Remat RM = edit_->canRematerializeAt(OrigVNI, UseIdx, false,
|
||||
lis_);
|
||||
if (!RM) {
|
||||
LiveRangeEdit::Remat RM(OrigVNI);
|
||||
if (!edit_->canRematerializeAt(RM, UseIdx, false, lis_)) {
|
||||
usedValues_.insert(OrigVNI);
|
||||
DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << *MI);
|
||||
return false;
|
||||
|
@ -88,36 +88,29 @@ bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
|
||||
return true;
|
||||
}
|
||||
|
||||
LiveRangeEdit::Remat LiveRangeEdit::canRematerializeAt(VNInfo *ParentVNI,
|
||||
SlotIndex UseIdx,
|
||||
bool cheapAsAMove,
|
||||
LiveIntervals &lis) {
|
||||
bool LiveRangeEdit::canRematerializeAt(Remat &RM,
|
||||
SlotIndex UseIdx,
|
||||
bool cheapAsAMove,
|
||||
LiveIntervals &lis) {
|
||||
assert(scannedRemattable_ && "Call anyRematerializable first");
|
||||
Remat RM = { 0, 0 };
|
||||
|
||||
// We could remat an undefined value as IMPLICIT_DEF, but all that should have
|
||||
// been taken care of earlier.
|
||||
if (!(RM.ParentVNI = parent_.getVNInfoAt(UseIdx)))
|
||||
return RM;
|
||||
|
||||
// Use scanRemattable info.
|
||||
if (!remattable_.count(RM.ParentVNI))
|
||||
return RM;
|
||||
return false;
|
||||
|
||||
// No defining instruction.
|
||||
MachineInstr *OrigMI = lis.getInstructionFromIndex(RM.ParentVNI->def);
|
||||
assert(OrigMI && "Defining instruction for remattable value disappeared");
|
||||
RM.OrigMI = lis.getInstructionFromIndex(RM.ParentVNI->def);
|
||||
assert(RM.OrigMI && "Defining instruction for remattable value disappeared");
|
||||
|
||||
// If only cheap remats were requested, bail out early.
|
||||
if (cheapAsAMove && !OrigMI->getDesc().isAsCheapAsAMove())
|
||||
return RM;
|
||||
if (cheapAsAMove && !RM.OrigMI->getDesc().isAsCheapAsAMove())
|
||||
return false;
|
||||
|
||||
// Verify that all used registers are available with the same values.
|
||||
if (!allUsesAvailableAt(OrigMI, RM.ParentVNI->def, UseIdx, lis))
|
||||
return RM;
|
||||
if (!allUsesAvailableAt(RM.OrigMI, RM.ParentVNI->def, UseIdx, lis))
|
||||
return false;
|
||||
|
||||
RM.OrigMI = OrigMI;
|
||||
return RM;
|
||||
return true;
|
||||
}
|
||||
|
||||
SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
|
||||
|
@ -94,16 +94,16 @@ public:
|
||||
struct Remat {
|
||||
VNInfo *ParentVNI; // parent_'s value at the remat location.
|
||||
MachineInstr *OrigMI; // Instruction defining ParentVNI.
|
||||
operator bool() const { return OrigMI; }
|
||||
explicit Remat(VNInfo *ParentVNI) : ParentVNI(ParentVNI), OrigMI(0) {}
|
||||
};
|
||||
|
||||
/// canRematerializeAt - Determine if ParentVNI can be rematerialized at
|
||||
/// UseIdx. It is assumed that parent_.getVNINfoAt(UseIdx) == ParentVNI.
|
||||
/// When cheapAsAMove is set, only cheap remats are allowed.
|
||||
Remat canRematerializeAt(VNInfo *ParentVNI,
|
||||
SlotIndex UseIdx,
|
||||
bool cheapAsAMove,
|
||||
LiveIntervals &lis);
|
||||
bool canRematerializeAt(Remat &RM,
|
||||
SlotIndex UseIdx,
|
||||
bool cheapAsAMove,
|
||||
LiveIntervals &lis);
|
||||
|
||||
/// rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an
|
||||
/// instruction into MBB before MI. The new instruction is mapped, but
|
||||
|
Loading…
x
Reference in New Issue
Block a user