24 std::unordered_set<BasicBlock *> phi_blocks;
27 if (is<SsaPhiOperation>(bb.first()))
28 phi_blocks.insert(&bb);
35 [](
ControlFlowGraph & cfg,
const std::unordered_set<BasicBlock *> & phi_blocks)
37 if (phi_blocks.empty())
42 for (
auto phi_block : phi_blocks)
45 auto & tacs = phi_block->tacs();
51 std::unordered_map<ControlFlowGraphNode *, BasicBlock *> intermediateBlocks;
54 std::vector<ControlFlowGraphEdge *> originalInEdges;
55 for (
auto & inEdge : phi_block->InEdges())
56 originalInEdges.push_back(&inEdge);
59 for (
auto inEdge : originalInEdges)
61 auto source = inEdge->source();
64 if (intermediateBlocks.find(source) == intermediateBlocks.end())
68 intermediateBlocks[source] = intermediate;
72 intermediate = intermediateBlocks[source];
76 inEdge->divert(intermediate);
85 auto phitac = tacs.first();
86 if (!is<SsaPhiOperation>(phitac))
89 const auto phi =
static_cast<const SsaPhiOperation *
>(&phitac->operation());
92 auto phiresult = std::move(phitac->results()[0]);
98 JLM_ASSERT(phitac->noperands() == intermediateBlocks.size());
99 for (
size_t n = 0; n < phitac->noperands(); n++)
101 auto incoming = phi->GetIncomingNode(n);
102 auto intermediate = intermediateBlocks[incoming];
117 auto phi_blocks = collect_phi_blocks(cfg);
118 eliminate_phis(cfg, phi_blocks);