7 #include <llvm/ADT/iterator.h>
8 #include <llvm/Analysis/DominanceFrontier.h>
9 #include <llvm/Analysis/DominanceFrontierImpl.h>
10 #include <llvm/Support/GenericDomTree.h>
11 #include <llvm/Support/GenericDomTreeConstruction.h>
14 #include "core/block.h"
15 #include "core/func.h"
26 bool Dominates(
const Block *start,
const Block *end,
const Block *block)
28 if (!dominates(end, block)) {
31 if (end->pred_size() == 1) {
35 bool isDuplicateEdge =
false;
36 for (
const Block *bb : end->predecessors()) {
38 if (isDuplicateEdge) {
41 isDuplicateEdge =
true;
43 if (!dominates(end, bb)) {
59 bool Dominates(
const Block *start,
const Block *end,
const Block *block)
61 if (!dominates(start, block)) {
64 if (start->succ_size() == 1) {
68 bool isDuplicateEdge =
false;
69 for (
const Block *bb : start->successors()) {
71 if (isDuplicateEdge) {
74 isDuplicateEdge =
true;
76 if (!dominates(start, bb)) {
91 using iterator = llvm::DominanceFrontierBase<Block, false>::iterator;
92 using const_iterator = llvm::DominanceFrontierBase<Block, false>::const_iterator;
100 using iterator = llvm::DominanceFrontierBase<Block, true>::iterator;
101 using const_iterator = llvm::DominanceFrontierBase<Block, true>::const_iterator;
107 namespace DomTreeBuilder {
109 using BlockDomTree = llvm::DominatorTreeBase<Block, false>;
110 extern template void Calculate<BlockDomTree>(BlockDomTree &DT);