diff options
| author | Rusty Wagner <rusty@vector35.com> | 2017-02-20 21:11:26 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2017-02-20 21:11:26 -0500 |
| commit | 33ae06ad9a4dfe1e78467ebf7f82a4c95f8945eb (patch) | |
| tree | ee977cc7defdeddddf7ee986ed9ba9647755566b /basicblock.cpp | |
| parent | 96f6bc8a3099754bf79a05af7a1ec342f8030335 (diff) | |
Add dominance frontier APIs
Diffstat (limited to 'basicblock.cpp')
| -rw-r--r-- | basicblock.cpp | 48 |
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); |
