cache computation of #preds for a BB. This speeds up
authorChris Lattner <sabre@nondot.org>
Sat, 4 Aug 2007 20:24:50 +0000 (20:24 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 4 Aug 2007 20:24:50 +0000 (20:24 +0000)
mem2reg from 2.0742->2.0522s on PR1432.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40821 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/PromoteMemoryToRegister.cpp

index ecc317f24cfe336b5f3eba9bec783a2a244df178..9baa197851914e80f16c4d9aa22b5e10f49fec0e 100644 (file)
@@ -137,6 +137,8 @@ namespace {
     /// non-determinstic behavior.
     DenseMap<BasicBlock*, unsigned> BBNumbers;
 
+    /// BBNumPreds - Lazily compute the number of predecessors a block has.
+    DenseMap<const BasicBlock*, unsigned> BBNumPreds;
   public:
     PromoteMem2Reg(const std::vector<AllocaInst*> &A,
                    SmallVector<AllocaInst*, 16> &Retry, DominatorTree &dt,
@@ -165,6 +167,14 @@ namespace {
       Allocas.pop_back();
       --AllocaIdx;
     }
+
+    unsigned getNumPreds(const BasicBlock *BB) {
+      unsigned &NP = BBNumPreds[BB];
+      if (NP == 0)
+        NP = std::distance(pred_begin(BB), pred_end(BB))+1;
+      return NP-1;
+    }
+
     
     void RewriteSingleStoreAlloca(AllocaInst *AI, AllocaInfo &Info);
 
@@ -209,7 +219,7 @@ namespace {
       // and decide whether all of the loads and stores to the alloca are within
       // the same basic block.
       for (Value::use_iterator U = AI->use_begin(), E = AI->use_end();
-           U != E; ++U){
+           U != E; ++U) {
         Instruction *User = cast<Instruction>(*U);
         if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
           // Remember the basic blocks which define new values for the alloca
@@ -218,7 +228,8 @@ namespace {
           OnlyStore = SI;
         } else {
           LoadInst *LI = cast<LoadInst>(User);
-          // Otherwise it must be a load instruction, keep track of variable reads
+          // Otherwise it must be a load instruction, keep track of variable
+          // reads.
           UsingBlocks.push_back(LI->getParent());
           AllocaPointerVal = LI;
         }
@@ -772,7 +783,7 @@ bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo,
                    Allocas[AllocaNo]->getName() + "." +
                    utostr(Version++), BB->begin());
   PhiToAllocaMap[PN] = AllocaNo;
-  PN->reserveOperandSpace(std::distance(pred_begin(BB), pred_end(BB)));
+  PN->reserveOperandSpace(getNumPreds(BB));
   
   InsertedPHINodes.insert(PN);