mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
Add some statistics to the splitting and spilling frameworks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130931 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
23d3243e62
commit
e9bd4ea5fd
@ -16,6 +16,7 @@
|
||||
#include "Spiller.h"
|
||||
#include "LiveRangeEdit.h"
|
||||
#include "VirtRegMap.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
|
||||
#include "llvm/CodeGen/LiveStackAnalysis.h"
|
||||
@ -31,6 +32,18 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
STATISTIC(NumSpilledRanges, "Number of spilled live ranges");
|
||||
STATISTIC(NumSnippets, "Number of snippets included in spills");
|
||||
STATISTIC(NumSpills, "Number of spills inserted");
|
||||
STATISTIC(NumReloads, "Number of reloads inserted");
|
||||
STATISTIC(NumFolded, "Number of folded stack accesses");
|
||||
STATISTIC(NumFoldedLoads, "Number of folded loads");
|
||||
STATISTIC(NumRemats, "Number of rematerialized defs for spilling");
|
||||
STATISTIC(NumOmitReloadSpill, "Number of omitted spills after reloads");
|
||||
STATISTIC(NumHoistLocal, "Number of locally hoisted spills");
|
||||
STATISTIC(NumHoistGlobal, "Number of globally hoisted spills");
|
||||
STATISTIC(NumRedundantSpills, "Number of redundant spills identified");
|
||||
|
||||
namespace {
|
||||
class InlineSpiller : public Spiller {
|
||||
MachineFunctionPass &Pass;
|
||||
@ -247,10 +260,11 @@ void InlineSpiller::collectRegsToSpill() {
|
||||
if (!isSnippet(SnipLI))
|
||||
continue;
|
||||
SnippetCopies.insert(MI);
|
||||
if (!isRegToSpill(SnipReg))
|
||||
RegsToSpill.push_back(SnipReg);
|
||||
|
||||
if (isRegToSpill(SnipReg))
|
||||
continue;
|
||||
RegsToSpill.push_back(SnipReg);
|
||||
DEBUG(dbgs() << "\talso spill snippet " << SnipLI << '\n');
|
||||
++NumSnippets;
|
||||
}
|
||||
}
|
||||
|
||||
@ -469,9 +483,10 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
||||
<< *StackInt << '\n');
|
||||
|
||||
// Already spilled everywhere.
|
||||
if (SVI.AllDefsAreReloads)
|
||||
if (SVI.AllDefsAreReloads) {
|
||||
++NumOmitReloadSpill;
|
||||
return true;
|
||||
|
||||
}
|
||||
// We are going to spill SVI.SpillVNI immediately after its def, so clear out
|
||||
// any later spills of the same value.
|
||||
eliminateRedundantSpills(SibLI, SVI.SpillVNI);
|
||||
@ -493,6 +508,11 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
||||
LIS.InsertMachineInstrInMaps(MII);
|
||||
VRM.addSpillSlotUse(StackSlot, MII);
|
||||
DEBUG(dbgs() << "\thoisted: " << SVI.SpillVNI->def << '\t' << *MII);
|
||||
|
||||
if (MBB == CopyMI->getParent())
|
||||
++NumHoistLocal;
|
||||
else
|
||||
++NumHoistGlobal;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -547,6 +567,7 @@ void InlineSpiller::eliminateRedundantSpills(LiveInterval &SLI, VNInfo *VNI) {
|
||||
// eliminateDeadDefs won't normally remove stores, so switch opcode.
|
||||
MI->setDesc(TII.get(TargetOpcode::KILL));
|
||||
DeadDefs.push_back(MI);
|
||||
++NumRedundantSpills;
|
||||
}
|
||||
}
|
||||
} while (!WorkList.empty());
|
||||
@ -642,6 +663,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg,
|
||||
if (RM.OrigMI->getDesc().canFoldAsLoad() &&
|
||||
foldMemoryOperand(MI, Ops, RM.OrigMI)) {
|
||||
Edit->markRematerialized(RM.ParentVNI);
|
||||
++NumFoldedLoads;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -668,6 +690,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg,
|
||||
VNInfo *DefVNI = NewLI.getNextValue(DefIdx, 0, LIS.getVNInfoAllocator());
|
||||
NewLI.addRange(LiveRange(DefIdx, UseIdx.getDefIndex(), DefVNI));
|
||||
DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
|
||||
++NumRemats;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -794,6 +817,7 @@ bool InlineSpiller::foldMemoryOperand(MachineBasicBlock::iterator MI,
|
||||
VRM.addSpillSlotUse(StackSlot, FoldMI);
|
||||
MI->eraseFromParent();
|
||||
DEBUG(dbgs() << "\tfolded: " << *FoldMI);
|
||||
++NumFolded;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -811,6 +835,7 @@ void InlineSpiller::insertReload(LiveInterval &NewLI,
|
||||
VNInfo *LoadVNI = NewLI.getNextValue(LoadIdx, 0,
|
||||
LIS.getVNInfoAllocator());
|
||||
NewLI.addRange(LiveRange(LoadIdx, Idx, LoadVNI));
|
||||
++NumReloads;
|
||||
}
|
||||
|
||||
/// insertSpill - Insert a spill of NewLI.reg after MI.
|
||||
@ -825,6 +850,7 @@ void InlineSpiller::insertSpill(LiveInterval &NewLI, const LiveInterval &OldLI,
|
||||
DEBUG(dbgs() << "\tspilled: " << StoreIdx << '\t' << *MI);
|
||||
VNInfo *StoreVNI = NewLI.getNextValue(Idx, 0, LIS.getVNInfoAllocator());
|
||||
NewLI.addRange(LiveRange(Idx, StoreIdx, StoreVNI));
|
||||
++NumSpills;
|
||||
}
|
||||
|
||||
/// spillAroundUses - insert spill code around each use of Reg.
|
||||
@ -972,6 +998,7 @@ void InlineSpiller::spillAll() {
|
||||
}
|
||||
|
||||
void InlineSpiller::spill(LiveRangeEdit &edit) {
|
||||
++NumSpilledRanges;
|
||||
Edit = &edit;
|
||||
assert(!TargetRegisterInfo::isStackSlot(edit.getReg())
|
||||
&& "Trying to spill a stack slot.");
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "LiveRangeEdit.h"
|
||||
#include "VirtRegMap.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/CodeGen/CalcSpillWeights.h"
|
||||
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
@ -24,6 +25,10 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
STATISTIC(NumDCEDeleted, "Number of instructions deleted by DCE");
|
||||
STATISTIC(NumDCEFoldedLoads, "Number of single use loads folded after DCE");
|
||||
STATISTIC(NumFracRanges, "Number of live ranges fractured by DCE");
|
||||
|
||||
LiveInterval &LiveRangeEdit::createFrom(unsigned OldReg,
|
||||
LiveIntervals &LIS,
|
||||
VirtRegMap &VRM) {
|
||||
@ -199,6 +204,7 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
|
||||
UseMI->eraseFromParent();
|
||||
DefMI->addRegisterDead(LI->reg, 0);
|
||||
Dead.push_back(DefMI);
|
||||
++NumDCEFoldedLoads;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -269,6 +275,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
delegate_->LRE_WillEraseInstruction(MI);
|
||||
LIS.RemoveMachineInstrFromMaps(MI);
|
||||
MI->eraseFromParent();
|
||||
++NumDCEDeleted;
|
||||
}
|
||||
|
||||
if (ToShrink.empty())
|
||||
@ -290,6 +297,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
unsigned NumComp = ConEQ.Classify(LI);
|
||||
if (NumComp <= 1)
|
||||
continue;
|
||||
++NumFracRanges;
|
||||
DEBUG(dbgs() << NumComp << " components: " << *LI << '\n');
|
||||
SmallVector<LiveInterval*, 8> Dups(1, LI);
|
||||
for (unsigned i = 1; i != NumComp; ++i) {
|
||||
|
@ -30,6 +30,8 @@ using namespace llvm;
|
||||
|
||||
STATISTIC(NumFinished, "Number of splits finished");
|
||||
STATISTIC(NumSimple, "Number of splits that were simple");
|
||||
STATISTIC(NumCopies, "Number of copies inserted for splitting");
|
||||
STATISTIC(NumRemats, "Number of rematerialized defs for splitting");
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Split Analysis
|
||||
@ -589,12 +591,14 @@ VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
|
||||
LiveRangeEdit::Remat RM(ParentVNI);
|
||||
if (Edit->canRematerializeAt(RM, UseIdx, true, LIS)) {
|
||||
Def = Edit->rematerializeAt(MBB, I, LI->reg, RM, LIS, TII, TRI, Late);
|
||||
++NumRemats;
|
||||
} else {
|
||||
// Can't remat, just insert a copy from parent.
|
||||
CopyMI = BuildMI(MBB, I, DebugLoc(), TII.get(TargetOpcode::COPY), LI->reg)
|
||||
.addReg(Edit->getReg());
|
||||
Def = LIS.getSlotIndexes()->insertMachineInstrInMaps(CopyMI, Late)
|
||||
.getDefIndex();
|
||||
++NumCopies;
|
||||
}
|
||||
|
||||
// Define the value in Reg.
|
||||
|
Loading…
Reference in New Issue
Block a user