11 #include <unordered_map>
33 auto & cfg = loopEntry.
cfg();
37 if (er->sink() != &loopEntry)
47 replacement->add_outedge(ex->sink());
49 er->divert(&loopEntry);
59 auto & cfg = loop.
ne->
cfg();
64 cfg.remove_node(loop.
insert);
68 static const ThreeAddressCodeVariable *
76 static const ThreeAddressCodeVariable &
86 static const ThreeAddressCodeVariable &
96 static const ThreeAddressCodeVariable &
109 const auto numAlternatives =
110 util::assertedCast<const rvsdg::ControlType>(&operand->
type())->nalternatives();
120 const auto numAlternatives =
121 util::assertedCast<const rvsdg::ControlType>(&variable.
type())->nalternatives();
123 auto op = std::make_unique<rvsdg::ControlConstantOperation>(
136 std::unordered_map<ControlFlowGraphNode *, size_t> indices;
148 auto os = edge->sink();
149 edge->divert(newEntryNode);
181 std::unordered_map<ControlFlowGraphNode *, size_t> indices;
182 for (
auto & node : sccStructure.
ExitNodes())
191 for (
auto & edge : sccStructure.
ExitEdges())
193 auto os = edge->sink();
194 edge->divert(&newRepetitionNode);
195 auto bb = edge->split();
210 std::unordered_map<ControlFlowGraphNode *, size_t> indices;
216 auto os = edge->sink();
217 edge->divert(&newRepetitionNode);
218 auto basicBlock = edge->split();
228 if (
auto basicBlock =
dynamic_cast<BasicBlock *
>(node))
239 ControlFlowGraphNode &,
240 ControlFlowGraphNode &,
241 std::vector<TailControlledLoop> &);
247 std::vector<TailControlledLoop> & loops)
249 if (®ionEntry == ®ionExit)
252 auto & cfg = regionEntry.
cfg();
254 const auto stronglyConnectedComponents =
find_sccs(®ionEntry, ®ionExit);
255 for (
auto & scc : stronglyConnectedComponents)
259 if (sccStructure->IsTailControlledLoop())
261 auto loopEntry = *sccStructure->EntryNodes().begin();
262 auto loopExit = (*sccStructure->ExitEdges().begin())->source();
264 loops.push_back(
ExtractLoop(*loopEntry, *loopExit));
271 newRepetitionNode.add_outedge(&newExitNode);
272 newRepetitionNode.add_outedge(&newEntryNode);
275 if (sccStructure->NumEntryNodes() > 1)
285 if (sccStructure->NumExitNodes() > 1)
303 loops.push_back(
ExtractLoop(newEntryNode, newRepetitionNode));
307 static ControlFlowGraphNode &
313 if (headBranch->
is_branch() || headBranch == &end)
328 std::deque toVisit(1, edge->
sink());
329 while (toVisit.size() != 0)
337 for (
auto & inedge : node->
InEdges())
339 if (!edges.Contains(&inedge))
349 for (
auto & outedge : node->
OutEdges())
351 edges.insert(&outedge);
352 toVisit.push_back(outedge.sink());
363 std::unordered_map<ControlFlowGraphEdge *, util::HashSet<ControlFlowGraphEdge *>>
edges;
371 std::unordered_map<ControlFlowGraphEdge *, util::HashSet<ControlFlowGraphNode *>> dominatorGraphs;
372 for (
auto & outedge : headBranch.
OutEdges())
376 for (
auto & outedge : headBranch.
OutEdges())
378 auto & dominatorGraph = dominatorGraphs[&outedge];
379 if (dominatorGraph.IsEmpty())
381 c.
edges[&outedge].insert(&outedge);
382 c.
points.insert(outedge.sink());
386 for (
const auto & node : dominatorGraph.Items())
388 for (
auto & outedge2 : node->OutEdges())
390 if (!dominatorGraph.Contains(outedge2.sink()))
392 c.
edges[&outedge].insert(&outedge2);
393 c.
points.insert(outedge2.sink());
405 auto & cfg = entry.
cfg();
408 if (&headBranch == &exit)
412 auto & hbb = *
static_cast<BasicBlock *
>(&headBranch);
417 if (continuationPoints.Size() == 1)
419 const auto continuationPoint = *continuationPoints.Items().begin();
420 for (
auto & outedge : headBranch.OutEdges())
422 auto continuationEdges = continuationEdgesDict[&outedge];
425 if (outedge.sink() == continuationPoint)
432 if (continuationEdges.Size() == 1)
434 const auto continuationEdge = *continuationEdges.Items().begin();
442 nullNode->add_outedge(continuationPoint);
443 for (
const auto & e : continuationEdges.Items())
457 std::unordered_map<ControlFlowGraphNode *, size_t> indices;
458 for (
const auto & cp : continuationPoints.Items())
460 continuationNode->add_outedge(cp);
461 indices.insert({ cp, indices.size() });
465 for (
auto & outedge : headBranch.OutEdges())
467 auto continuationEdges = continuationEdgesDict[&outedge];
470 nullNode->add_outedge(continuationNode);
471 for (
const auto & e : continuationEdges.Items())
475 bb->add_outedge(nullNode);
491 std::vector<TailControlledLoop> loops;
494 for (
const auto & loop : loops)
510 std::vector<TailControlledLoop> & tailControlledLoops)
521 std::vector<TailControlledLoop> loops;
524 for (
const auto & loop : loops)
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *rhs, const Variable *lhs)
ThreeAddressCode * last() const noexcept
llvm::ThreeAddressCode * insert_before_branch(std::unique_ptr< llvm::ThreeAddressCode > tac)
static BasicBlock * create(ControlFlowGraph &cfg)
llvm::ThreeAddressCode * append_last(std::unique_ptr< llvm::ThreeAddressCode > tac)
static std::unique_ptr< llvm::ThreeAddressCode > create(size_t nalternatives, const Variable *operand)
ControlFlowGraphNode * sink() const noexcept
bool is_branch() const noexcept
ControlFlowGraphEdge * add_outedge(ControlFlowGraphNode *sink)
inedge_iterator_range InEdges() const
ControlFlowGraphEdge * OutEdge(size_t n) const
size_t NumInEdges() const noexcept
ControlFlowGraph & cfg() const noexcept
outedge_iterator_range OutEdges() const
size_t NumOutEdges() const noexcept
void divert_inedges(llvm::ControlFlowGraphNode *new_successor)
EntryNode * entry() const noexcept
ExitNode * exit() const noexcept
Strongly Connected Component Structure.
EdgeIteratorRange ExitEdges() const
size_t NumExitEdges() const noexcept
NodeIteratorRange ExitNodes() const
NodeIteratorRange EntryNodes() const
EdgeIteratorRange RepetitionEdges() const
static std::unique_ptr< StronglyConnectedComponentStructure > Create(const StronglyConnectedComponent &scc)
EdgeIteratorRange EntryEdges() const
const ThreeAddressCodeVariable * result(size_t index) const noexcept
static std::unique_ptr< llvm::ThreeAddressCode > create(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands)
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
const jlm::rvsdg::Type & type() const noexcept
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
bool insert(ItemType item)
bool Contains(const ItemType &item) const noexcept
Global memory state passed between functions.
static void RestructureLoopRepetition(const StronglyConnectedComponentStructure &sccStructure, ControlFlowGraphNode &newRepetitionNode, const ThreeAddressCodeVariable *entryVariable, const ThreeAddressCodeVariable &repetitionVariable)
std::vector< StronglyConnectedComponent > find_sccs(const ControlFlowGraph &cfg)
static void RestructureBranches(ControlFlowGraphNode &entry, ControlFlowGraphNode &exit)
static void AppendBranch(BasicBlock &basicBlock, const Variable *operand)
static Continuation ComputeContinuation(const ControlFlowGraphNode &headBranch)
static void RestructureControlFlow(ControlFlowGraphNode &, ControlFlowGraphNode &, std::vector< TailControlledLoop > &)
static void RestructureLoopExit(const StronglyConnectedComponentStructure &sccStructure, BasicBlock &newRepetitionNode, BasicBlock &newExitNode, ControlFlowGraphNode ®ionExit, const ThreeAddressCodeVariable &repetitionVariable, const ThreeAddressCodeVariable *exitVariable)
static void RestructureLoops(ControlFlowGraphNode ®ionEntry, ControlFlowGraphNode ®ionExit, std::vector< TailControlledLoop > &loops)
static void AppendConstantAssignment(BasicBlock &basicBlock, const ThreeAddressCodeVariable &variable, const size_t value)
static void ReinsertLoop(const TailControlledLoop &loop)
static BasicBlock * GetEntryVariableBlock(ControlFlowGraphNode *node)
static const ThreeAddressCodeVariable & CreateLoopExitVariable(BasicBlock &bb, std::shared_ptr< const rvsdg::ControlType > type)
static ControlFlowGraphNode & ComputeHeadBranch(ControlFlowGraphNode &start, ControlFlowGraphNode &end)
static TailControlledLoop ExtractLoop(ControlFlowGraphNode &loopEntry, ControlFlowGraphNode &loopExit)
bool is_proper_structured(const ControlFlowGraph &cfg)
static const ThreeAddressCodeVariable * CreateContinuationVariable(BasicBlock &bb, std::shared_ptr< const rvsdg::ControlType > type)
static const ThreeAddressCodeVariable & CreateLoopEntryVariable(BasicBlock &bb, std::shared_ptr< const rvsdg::ControlType > type)
static util::HashSet< ControlFlowGraphNode * > ComputeDominatorGraph(const ControlFlowGraphEdge *edge)
static const ThreeAddressCodeVariable & CreateLoopRepetitionVariable(BasicBlock &basicBlock)
bool is_closed(const ControlFlowGraph &cfg)
static bool is_acyclic(const ControlFlowGraph &cfg)
static void RestructureLoopEntry(const StronglyConnectedComponentStructure &sccStructure, BasicBlock *newEntryNode, const ThreeAddressCodeVariable *entryVariable)
static std::string type(const Node *n)
static std::string strfmt(Args... args)
util::HashSet< ControlFlowGraphNode * > points
std::unordered_map< ControlFlowGraphEdge *, util::HashSet< ControlFlowGraphEdge * > > edges
TailControlledLoop(ControlFlowGraphNode *entry, BasicBlock *i, BasicBlock *r)
ControlFlowGraphNode * ne