From 87f1e7796d02ea991bdbf084f312879988732a26 Mon Sep 17 00:00:00 2001 From: Torok Edwin Date: Thu, 11 Dec 2008 10:36:07 +0000 Subject: [PATCH] introduce BasicBlock::getUniquePredecessor() git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60872 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/BasicBlock.h | 10 ++++++++++ lib/VMCore/BasicBlock.cpp | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index ff45800f1e5..ee5ceb3683a 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -134,6 +134,16 @@ public: return const_cast(this)->getSinglePredecessor(); } + /// getUniquePredecessor - If this basic block has a unique predecessor block, + /// return the block, otherwise return a null pointer. + /// Note that unique predecessor doesn't mean single edge, there can be + /// multiple edges from the unique predecessor to this block (for example in + /// case of a switch statement with multiple cases having same destination). + BasicBlock *getUniquePredecessor(); + const BasicBlock *getUniquePredecessor() const { + return const_cast(this)->getUniquePredecessor(); + } + //===--------------------------------------------------------------------===// /// Instruction iterator methods /// diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index 514aa1de237..ab2cbebb90c 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -169,6 +169,25 @@ BasicBlock *BasicBlock::getSinglePredecessor() { return (PI == E) ? ThePred : 0 /*multiple preds*/; } +/// getUniquePredecessor - If this basic block has a unique predecessor block, +/// return the block, otherwise return a null pointer. +/// Note that unique predecessor doesn't mean single edge, there can be +/// multiple edges from the unique predecessor to this block (for example in +/// case of a switch statement with multiple cases having same destination). +BasicBlock *BasicBlock::getUniquePredecessor() { + pred_iterator PI = pred_begin(this), E = pred_end(this); + if (PI == E) return 0; // No preds. + BasicBlock *PredBB = *PI; + ++PI; + for (;PI != E; ++PI) { + if (*PI != PredBB) + return 0; + // same predecessor appears multiple times in predecessor list, + // this is ok + } + return PredBB; +} + /// removePredecessor - This method is used to notify a BasicBlock that the /// specified Predecessor of the block is no longer able to reach it. This is /// actually not used to update the Predecessor list, but is actually used to -- 2.11.0