aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/BasicBlock.cpp
diff options
context:
space:
mode:
authorVedant Kumar <vsk@apple.com>2018-11-19 19:54:27 +0000
committerVedant Kumar <vsk@apple.com>2018-11-19 19:54:27 +0000
commit4de31bba51b884bdfc7eb688958d9dc517da8353 (patch)
tree8bfd8a142284649e9502ed52fe786cd312fc5922 /llvm/lib/IR/BasicBlock.cpp
parent740122fb8cb6a38ad072d3da26f6641434f30761 (diff)
downloadllvm-4de31bba51b884bdfc7eb688958d9dc517da8353.zip
llvm-4de31bba51b884bdfc7eb688958d9dc517da8353.tar.gz
llvm-4de31bba51b884bdfc7eb688958d9dc517da8353.tar.bz2
[IR] Add hasNPredecessors, hasNPredecessorsOrMore to BasicBlock
Add methods to BasicBlock which make it easier to efficiently check whether a block has N (or more) predecessors. This can be more efficient than using pred_size(), which is a linear time operation. We might consider adding similar methods for successors. I haven't done so in this patch because succ_size() is already O(1). With this patch applied, I measured a 0.065% compile-time reduction in user time for running `opt -O3` on the sqlite3 amalgamation (30 trials). The change in mergeStoreIntoSuccessor alone saves 45 million linked list iterations in a stage2 Release build of llc. See llvm.org/PR39702 for a harder but more general way of achieving similar results. Differential Revision: https://reviews.llvm.org/D54686 llvm-svn: 347256
Diffstat (limited to 'llvm/lib/IR/BasicBlock.cpp')
-rw-r--r--llvm/lib/IR/BasicBlock.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp
index 12ab2e2..e9eb686 100644
--- a/llvm/lib/IR/BasicBlock.cpp
+++ b/llvm/lib/IR/BasicBlock.cpp
@@ -260,6 +260,14 @@ const BasicBlock *BasicBlock::getUniquePredecessor() const {
return PredBB;
}
+bool BasicBlock::hasNPredecessors(unsigned N) const {
+ return hasNItems(pred_begin(this), pred_end(this), N);
+}
+
+bool BasicBlock::hasNPredecessorsOrMore(unsigned N) const {
+ return hasNItemsOrMore(pred_begin(this), pred_end(this), N);
+}
+
const BasicBlock *BasicBlock::getSingleSuccessor() const {
succ_const_iterator SI = succ_begin(this), E = succ_end(this);
if (SI == E) return nullptr; // no successors