12 #include <unordered_set>
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);
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *rhs, const Variable *lhs)
static BasicBlock * create(ControlFlowGraph &cfg)
ControlFlowGraphNode * sink() const noexcept
ControlFlowGraphEdge * add_outedge(ControlFlowGraphNode *sink)
ControlFlowGraphEdge * OutEdge(size_t n) const
EntryNode * entry() const noexcept
InterProceduralGraphModule & module() const noexcept
llvm::Variable * create_variable(std::shared_ptr< const jlm::rvsdg::Type > type, const std::string &name)
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
Global memory state passed between functions.
void destruct_ssa(ControlFlowGraph &cfg)
bool is_valid(const ControlFlowGraph &cfg)