summaryrefslogtreecommitdiff
path: root/basicblock.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-02-20 21:11:26 -0500
committerRusty Wagner <rusty@vector35.com>2017-02-20 21:11:26 -0500
commit33ae06ad9a4dfe1e78467ebf7f82a4c95f8945eb (patch)
treeee977cc7defdeddddf7ee986ed9ba9647755566b /basicblock.cpp
parent96f6bc8a3099754bf79a05af7a1ec342f8030335 (diff)
Add dominance frontier APIs
Diffstat (limited to 'basicblock.cpp')
-rw-r--r--basicblock.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/basicblock.cpp b/basicblock.cpp
index d6423fa0..d8ae0f65 100644
--- a/basicblock.cpp
+++ b/basicblock.cpp
@@ -195,6 +195,54 @@ Ref<BasicBlock> BasicBlock::GetImmediateDominator() const
}
+set<Ref<BasicBlock>> BasicBlock::GetDominatorTreeChildren() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockDominatorTreeChildren(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetDominanceFrontier() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockDominanceFrontier(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetIteratedDominanceFrontier(const set<Ref<BasicBlock>>& blocks)
+{
+ BNBasicBlock** blockSet = new BNBasicBlock*[blocks.size()];
+ size_t i = 0;
+ for (auto& j : blocks)
+ blockSet[i++] = j->GetObject();
+
+ size_t count;
+ BNBasicBlock** resultBlocks = BNGetBasicBlockIteratedDominanceFrontier(blockSet, blocks.size(), &count);
+ delete[] blockSet;
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(resultBlocks[i])));
+
+ BNFreeBasicBlockList(resultBlocks, count);
+ return result;
+}
+
+
void BasicBlock::MarkRecentUse()
{
BNMarkBasicBlockAsRecentlyUsed(m_object);