diff options
author | Dan Gohman <dan433584@gmail.com> | 2013-02-12 19:49:10 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2013-02-12 19:49:10 +0000 |
commit | 5f3c4a39109479e81238ce28e91e5dcc565f068c (patch) | |
tree | 8daa3faedac3be7e7abf3bb2eb7284176b8a9db9 | |
parent | e1d640312889a9e5ec4fc6cd3d6a1bc74289c8a9 (diff) | |
download | external_llvm-5f3c4a39109479e81238ce28e91e5dcc565f068c.zip external_llvm-5f3c4a39109479e81238ce28e91e5dcc565f068c.tar.gz external_llvm-5f3c4a39109479e81238ce28e91e5dcc565f068c.tar.bz2 |
Record PRE predecessors with a SmallVector instead of a DenseMap, and
avoid a second pred_iterator traversal.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175001 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/GVN.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index ff55f6f..26b1134 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -2389,7 +2389,7 @@ bool GVN::processBlock(BasicBlock *BB) { /// control flow patterns and attempts to perform simple PRE at the join point. bool GVN::performPRE(Function &F) { bool Changed = false; - DenseMap<BasicBlock*, Value*> predMap; + SmallVector<std::pair<Value*, BasicBlock*>, 8> predMap; for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()), DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) { BasicBlock *CurrentBlock = *DI; @@ -2452,6 +2452,7 @@ bool GVN::performPRE(Function &F) { Value* predV = findLeader(P, ValNo); if (predV == 0) { + predMap.push_back(std::make_pair(static_cast<Value *>(0), P)); PREPred = P; ++NumWithout; } else if (predV == CurInst) { @@ -2459,7 +2460,7 @@ bool GVN::performPRE(Function &F) { NumWithout = 2; break; } else { - predMap[P] = predV; + predMap.push_back(std::make_pair(predV, P)); ++NumWith; } } @@ -2514,7 +2515,6 @@ bool GVN::performPRE(Function &F) { PREInstr->insertBefore(PREPred->getTerminator()); PREInstr->setName(CurInst->getName() + ".pre"); PREInstr->setDebugLoc(CurInst->getDebugLoc()); - predMap[PREPred] = PREInstr; VN.add(PREInstr, ValNo); ++NumGVNPRE; @@ -2522,13 +2522,14 @@ bool GVN::performPRE(Function &F) { addToLeaderTable(ValNo, PREInstr, PREPred); // Create a PHI to make the value available in this block. - pred_iterator PB = pred_begin(CurrentBlock), PE = pred_end(CurrentBlock); - PHINode* Phi = PHINode::Create(CurInst->getType(), std::distance(PB, PE), + PHINode* Phi = PHINode::Create(CurInst->getType(), predMap.size(), CurInst->getName() + ".pre-phi", CurrentBlock->begin()); - for (pred_iterator PI = PB; PI != PE; ++PI) { - BasicBlock *P = *PI; - Phi->addIncoming(predMap[P], P); + for (unsigned i = 0, e = predMap.size(); i != e; ++i) { + if (Value *V = predMap[i].first) + Phi->addIncoming(V, predMap[i].second); + else + Phi->addIncoming(PREInstr, PREPred); } VN.add(Phi, ValNo); |