Jlm
memstate-conv.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2021 David Metz <david.c.metz@ntnu.no>
3  * See COPYING for terms of redistribution.
4  */
5 
7 #include <jlm/hls/ir/hls.hpp>
10 
11 namespace jlm::hls
12 {
13 
15 
16 void
17 MemoryStateSplitConversion::Run(rvsdg::RvsdgModule & module, util::StatisticsCollector &)
18 {
19  ConvertMemoryStateSplitsInRegion(module.Rvsdg().GetRootRegion());
20 }
21 
22 void
24  rvsdg::RvsdgModule & module,
25  util::StatisticsCollector & statisticsCollector)
26 {
27  MemoryStateSplitConversion memoryStateSplitConversion;
28  memoryStateSplitConversion.Run(module, statisticsCollector);
29 }
30 
31 void
33 {
34  for (auto & node : region.Nodes())
35  {
36  // Handle innermost regions first
37  if (const auto structuralNode = dynamic_cast<rvsdg::StructuralNode *>(&node))
38  {
39  for (auto & subregion : structuralNode->Subregions())
40  {
42  }
43  }
44 
45  // Replace split nodes with fork nodes
46  if (rvsdg::is<llvm::LambdaEntryMemoryStateSplitOperation>(&node)
47  || rvsdg::is<llvm::MemoryStateSplitOperation>(&node))
48  {
49  JLM_ASSERT(node.ninputs() == 1);
50  auto results = ForkOperation::create(node.noutputs(), *node.input(0)->origin());
51  divert_users(&node, results);
52  }
53  }
54 
55  // Prune dead nodes
56  region.prune(false);
57 }
58 
59 } // namespace jlm::hls
static std::vector< jlm::rvsdg::Output * > create(size_t nalternatives, jlm::rvsdg::Output &value, bool isConstant=false)
Definition: hls.hpp:161
~MemoryStateSplitConversion() noexcept override
static void CreateAndRun(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector)
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static void ConvertMemoryStateSplitsInRegion(rvsdg::Region &region)
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
void prune(bool recursive)
Definition: region.cpp:323
NodeRange Nodes() noexcept
Definition: region.hpp:328
#define JLM_ASSERT(x)
Definition: common.hpp:16
static void divert_users(jlm::rvsdg::Output *output, Context &ctx)
Definition: cne.cpp:504