From 62e526d0ae8ab4ec00e525dc01d72c78d0b06c4d Mon Sep 17 00:00:00 2001 From: Nadav Rotem Date: Wed, 27 Feb 2013 21:59:43 +0000 Subject: [PATCH] The FastISEL should be fast. But when we record statistics we use atomic operations to increment the counters. This patch disables the counters on non-debug builds. This reduces the runtime of SelectionDAGISel::SelectCodeCommon by ~5%. llvm-svn: 176214 --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index acae58c12a6..87c153468fc 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1076,7 +1076,8 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) { FastIS->setLastLocalValue(0); } - unsigned NumFastIselRemaining = std::distance(Begin, End); + unsigned NumFastIselRemaining = 0; + NumFastIselRemaining = std::distance(Begin, End); // Do FastISel on as many instructions as possible. for (; BI != Begin; --BI) { const Instruction *Inst = llvm::prior(BI); @@ -1094,7 +1095,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) { // Try to select the instruction with FastISel. if (FastIS->SelectInstruction(Inst)) { --NumFastIselRemaining; - ++NumFastIselSuccess; + DEBUG(++NumFastIselSuccess); // If fast isel succeeded, skip over all the folded instructions, and // then see if there is a load right before the selected instructions. // Try to fold the load if so. @@ -1110,7 +1111,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) { // If we succeeded, don't re-select the load. BI = llvm::next(BasicBlock::const_iterator(BeforeInst)); --NumFastIselRemaining; - ++NumFastIselSuccess; + DEBUG(++NumFastIselSuccess); } continue; } @@ -1149,20 +1150,20 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) { // Recompute NumFastIselRemaining as Selection DAG instruction // selection may have handled the call, input args, etc. unsigned RemainingNow = std::distance(Begin, BI); - NumFastIselFailures += NumFastIselRemaining - RemainingNow; - NumFastIselRemaining = RemainingNow; + DEBUG(NumFastIselFailures += NumFastIselRemaining - RemainingNow); + DEBUG(NumFastIselRemaining = RemainingNow); continue; } if (isa(Inst) && !isa(Inst)) { // Don't abort, and use a different message for terminator misses. - NumFastIselFailures += NumFastIselRemaining; + DEBUG(NumFastIselFailures += NumFastIselRemaining); if (EnableFastISelVerbose || EnableFastISelAbort) { dbgs() << "FastISel missed terminator: "; Inst->dump(); } } else { - NumFastIselFailures += NumFastIselRemaining; + DEBUG(NumFastIselFailures += NumFastIselRemaining); if (EnableFastISelVerbose || EnableFastISelAbort) { dbgs() << "FastISel miss: "; Inst->dump(); @@ -2362,7 +2363,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, DEBUG(errs() << " Skipped scope entry (due to false predicate) at " << "index " << MatcherIndexOfPredicate << ", continuing at " << FailIndex << "\n"); - ++NumDAGIselRetries; + DEBUG(++NumDAGIselRetries); // Otherwise, we know that this case of the Scope is guaranteed to fail, // move to the next case. @@ -2943,7 +2944,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, // another child to try in the current 'Scope', otherwise pop it until we // find a case to check. DEBUG(errs() << " Match failed at index " << CurrentOpcodeIndex << "\n"); - ++NumDAGIselRetries; + DEBUG(++NumDAGIselRetries); while (1) { if (MatchScopes.empty()) { CannotYetSelect(NodeToMatch);