summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-06-12 00:35:38 +0000
committerDevang Patel <dpatel@apple.com>2007-06-12 00:35:38 +0000
commit9576fac800b714677d0bfb40f3e242cbaf7c2bdc (patch)
treeaae0766d493804e49146b50e88c1ba93c0202eec /llvm/lib
parent88ea2dbc68a775ae5cc876f4286969974bb44286 (diff)
downloadbcm5719-llvm-9576fac800b714677d0bfb40f3e242cbaf7c2bdc.tar.gz
bcm5719-llvm-9576fac800b714677d0bfb40f3e242cbaf7c2bdc.zip
Check immediate dominators first while searching for nearset common dominator.
Fix 80 col violations. llvm-svn: 37547
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/VMCore/Dominators.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/llvm/lib/VMCore/Dominators.cpp b/llvm/lib/VMCore/Dominators.cpp
index 225d8d200ae..5e0ab84cf97 100644
--- a/llvm/lib/VMCore/Dominators.cpp
+++ b/llvm/lib/VMCore/Dominators.cpp
@@ -23,7 +23,6 @@
#include "llvm/Instructions.h"
#include "llvm/Support/Streams.h"
#include <algorithm>
-#include <set>
using namespace llvm;
namespace llvm {
@@ -363,7 +362,8 @@ bool DominatorTreeBase::dominates(Instruction *A, Instruction *B) {
// DominatorTreeBase::reset - Free all of the tree node memory.
//
void DominatorTreeBase::reset() {
- for (DomTreeNodeMapType::iterator I = DomTreeNodes.begin(), E = DomTreeNodes.end(); I != E; ++I)
+ for (DomTreeNodeMapType::iterator I = DomTreeNodes.begin(),
+ E = DomTreeNodes.end(); I != E; ++I)
delete I->second;
DomTreeNodes.clear();
IDoms.clear();
@@ -374,10 +374,13 @@ void DominatorTreeBase::reset() {
/// findNearestCommonDominator - Find nearest common dominator basic block
/// for basic block A and B. If there is no such block then return NULL.
-BasicBlock *DominatorTreeBase::findNearestCommonDominator(BasicBlock *A, BasicBlock *B) {
+BasicBlock *DominatorTreeBase::findNearestCommonDominator(BasicBlock *A,
+ BasicBlock *B) {
- assert (!isPostDominator() && "This is not implemented for post dominators");
- assert (A->getParent() == B->getParent() && "Two blocks are not in same function");
+ assert (!isPostDominator()
+ && "This is not implemented for post dominators");
+ assert (A->getParent() == B->getParent()
+ && "Two blocks are not in same function");
// If either A or B is a entry block then it is nearest common dominator.
BasicBlock &Entry = A->getParent()->getEntryBlock();
@@ -391,8 +394,17 @@ BasicBlock *DominatorTreeBase::findNearestCommonDominator(BasicBlock *A, BasicBl
DomTreeNode *NodeB = getNode(B);
+ // If B immediately dominates A then B is nearest common dominator.
+ if (NodeA->getIDom() == NodeB)
+ return B;
+
+ // If A immediately dominates B then A is nearest common dominator.
+ if (NodeB->getIDom() == NodeA)
+ return A;
+
// Collect NodeA dominators set.
- std::set<DomTreeNode *> NodeADoms;
+ // SmallPtrSet<DomTreeNode*, 16> NodeADoms;
+ std::set<DomTreeNode*> NodeADoms;
NodeADoms.insert(NodeA);
DomTreeNode *IDomA = NodeA->getIDom();
while(IDomA) {
OpenPOWER on IntegriCloud