diff --git a/furc/src/middle/ssa.cpp b/furc/src/middle/ssa.cpp index 497aac9..96dc994 100644 --- a/furc/src/middle/ssa.cpp +++ b/furc/src/middle/ssa.cpp @@ -26,6 +26,9 @@ struct block_info { std::unordered_set preds; std::unordered_set sucs; std::size_t idom = 0; + + // Dominance Frontiers + std::unordered_set df; }; void rpo_dfs(std::unordered_set& visited, @@ -116,6 +119,18 @@ void process_function(ir_function& func) { } } } + + // 3. Computing Dominance Frontiers + for (std::size_t j = 0; j < blocks.size(); ++j) { + const auto& join = blocks[j]; + if (join.preds.size() < 2) continue; + for (std::size_t runner : join.preds) { + while (runner != join.idom) { + blocks[runner].df.insert(j); + runner = blocks[runner].idom; + } + } + } } } // namespace