forked from OSchip/llvm-project
Add counters to count basic blocks and machine basic blocks with out of order line number info.
Add counters to count how many basic blocks are entirely selected by fastisel. llvm-svn: 117310
This commit is contained in:
parent
b9c91679aa
commit
3bc6d198fb
|
@ -53,7 +53,13 @@
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
STATISTIC(NumFastIselFailures, "Number of instructions fast isel failed on");
|
STATISTIC(NumFastIselFailures, "Number of instructions fast isel failed on");
|
||||||
|
STATISTIC(NumFastIselBlocks, "Number of blocks selected entirely by fast isel");
|
||||||
|
STATISTIC(NumDAGBlocks, "Number of blocks selected using DAG");
|
||||||
STATISTIC(NumDAGIselRetries,"Number of times dag isel has to try another path");
|
STATISTIC(NumDAGIselRetries,"Number of times dag isel has to try another path");
|
||||||
|
STATISTIC(NumBBWithOutOfOrderLineInfo,
|
||||||
|
"Number of blocks with out of order line number info");
|
||||||
|
STATISTIC(NumMBBWithOutOfOrderLineInfo,
|
||||||
|
"Number of machine blocks with out of order line number info");
|
||||||
|
|
||||||
static cl::opt<bool>
|
static cl::opt<bool>
|
||||||
EnableFastISelVerbose("fast-isel-verbose", cl::Hidden,
|
EnableFastISelVerbose("fast-isel-verbose", cl::Hidden,
|
||||||
|
@ -370,7 +376,7 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
SelectionDAGISel::SelectBasicBlock(BasicBlock::const_iterator Begin,
|
SelectionDAGISel::SelectBasicBlock(BasicBlock::const_iterator Begin,
|
||||||
BasicBlock::const_iterator End,
|
BasicBlock::const_iterator End,
|
||||||
bool &HadTailCall) {
|
bool &HadTailCall) {
|
||||||
|
@ -387,6 +393,7 @@ SelectionDAGISel::SelectBasicBlock(BasicBlock::const_iterator Begin,
|
||||||
|
|
||||||
// Final step, emit the lowered DAG as machine code.
|
// Final step, emit the lowered DAG as machine code.
|
||||||
CodeGenAndEmitDAG();
|
CodeGenAndEmitDAG();
|
||||||
|
return Begin != End;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionDAGISel::ComputeLiveOutVRegInfo() {
|
void SelectionDAGISel::ComputeLiveOutVRegInfo() {
|
||||||
|
@ -726,8 +733,47 @@ bool SelectionDAGISel::TryToFoldFastISelLoad(const LoadInst *LI,
|
||||||
return FastIS->TryToFoldLoad(&*RI, RI.getOperandNo(), LI);
|
return FastIS->TryToFoldLoad(&*RI, RI.getOperandNo(), LI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
/// CheckLineNumbers - Check if basic block instructions follow source order
|
||||||
|
/// or not.
|
||||||
|
static void CheckLineNumbers(const BasicBlock *BB) {
|
||||||
|
unsigned Line = 0;
|
||||||
|
unsigned Col = 0;
|
||||||
|
for (BasicBlock::const_iterator BI = BB->begin(),
|
||||||
|
BE = BB->end(); BI != BE; ++BI) {
|
||||||
|
const DebugLoc DL = BI->getDebugLoc();
|
||||||
|
if (DL.isUnknown()) continue;
|
||||||
|
unsigned L = DL.getLine();
|
||||||
|
unsigned C = DL.getCol();
|
||||||
|
if (L < Line || (L == Line && C < Col)) {
|
||||||
|
++NumBBWithOutOfOrderLineInfo;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Line = L;
|
||||||
|
Col = C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// CheckLineNumbers - Check if machine basic block instructions follow source
|
||||||
|
/// order or not.
|
||||||
|
static void CheckLineNumbers(const MachineBasicBlock *MBB) {
|
||||||
|
unsigned Line = 0;
|
||||||
|
unsigned Col = 0;
|
||||||
|
for (MachineBasicBlock::const_iterator MBI = MBB->begin(),
|
||||||
|
MBE = MBB->end(); MBI != MBE; ++MBI) {
|
||||||
|
const DebugLoc DL = MBI->getDebugLoc();
|
||||||
|
if (DL.isUnknown()) continue;
|
||||||
|
unsigned L = DL.getLine();
|
||||||
|
unsigned C = DL.getCol();
|
||||||
|
if (L < Line || (L == Line && C < Col)) {
|
||||||
|
++NumMBBWithOutOfOrderLineInfo;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Line = L;
|
||||||
|
Col = C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||||
// Initialize the Fast-ISel state, if needed.
|
// Initialize the Fast-ISel state, if needed.
|
||||||
|
@ -737,7 +783,11 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||||
|
|
||||||
// Iterate over all basic blocks in the function.
|
// Iterate over all basic blocks in the function.
|
||||||
for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
|
for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
|
||||||
|
bool BBSelectedUsingDAG = false;
|
||||||
const BasicBlock *LLVMBB = &*I;
|
const BasicBlock *LLVMBB = &*I;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
CheckLineNumbers(LLVMBB);
|
||||||
|
#endif
|
||||||
FuncInfo->MBB = FuncInfo->MBBMap[LLVMBB];
|
FuncInfo->MBB = FuncInfo->MBBMap[LLVMBB];
|
||||||
FuncInfo->InsertPt = FuncInfo->MBB->getFirstNonPHI();
|
FuncInfo->InsertPt = FuncInfo->MBB->getFirstNonPHI();
|
||||||
|
|
||||||
|
@ -822,7 +872,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HadTailCall = false;
|
bool HadTailCall = false;
|
||||||
SelectBasicBlock(Inst, BI, HadTailCall);
|
BBSelectedUsingDAG |= SelectBasicBlock(Inst, BI, HadTailCall);
|
||||||
|
|
||||||
// If the call was emitted as a tail call, we're done with the block.
|
// If the call was emitted as a tail call, we're done with the block.
|
||||||
if (HadTailCall) {
|
if (HadTailCall) {
|
||||||
|
@ -856,13 +906,22 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||||
// not handled by FastISel. If FastISel is not run, this is the entire
|
// not handled by FastISel. If FastISel is not run, this is the entire
|
||||||
// block.
|
// block.
|
||||||
bool HadTailCall;
|
bool HadTailCall;
|
||||||
SelectBasicBlock(Begin, BI, HadTailCall);
|
BBSelectedUsingDAG |= SelectBasicBlock(Begin, BI, HadTailCall);
|
||||||
|
|
||||||
FinishBasicBlock();
|
FinishBasicBlock();
|
||||||
FuncInfo->PHINodesToUpdate.clear();
|
FuncInfo->PHINodesToUpdate.clear();
|
||||||
|
if (BBSelectedUsingDAG)
|
||||||
|
++NumDAGBlocks;
|
||||||
|
else
|
||||||
|
++NumFastIselBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete FastIS;
|
delete FastIS;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
for (MachineFunction::const_iterator MBI = MF->begin(), MBE = MF->end();
|
||||||
|
MBI != MBE; ++MBI)
|
||||||
|
CheckLineNumbers(MBI);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue