Jlm
rvsdg2rhls.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 
27 #include <jlm/hls/opt/cne.hpp>
30 #include <jlm/hls/util/view.hpp>
33 #include <jlm/llvm/DotWriter.hpp>
47 #include <jlm/rvsdg/traverser.hpp>
48 #include <jlm/rvsdg/view.hpp>
49 #include <jlm/util/Statistics.hpp>
50 #include <llvm/IR/LLVMContext.h>
51 #include <llvm/IR/Module.h>
52 #include <llvm/Support/raw_ostream.h>
53 #include <llvm/Support/SourceMgr.h>
54 
55 #include <regex>
56 
57 namespace jlm::hls
58 {
59 
60 void
62 {
63  // TODO: figure out which optimizations to use here
69  jlm::util::StatisticsCollector statisticsCollector;
70  tgi.Run(rm, statisticsCollector);
71  dne.Run(rm, statisticsCollector);
72  cne.Run(rm, statisticsCollector);
73  ivr.Run(rm, statisticsCollector);
74  red.Run(rm, statisticsCollector);
75  dne.Run(rm, statisticsCollector);
76 }
77 
78 void
80 {
81  // TODO: figure out which optimizations to use here
86  jlm::util::StatisticsCollector statisticsCollector;
87  tgi.Run(rm, statisticsCollector);
88  dne.Run(rm, statisticsCollector);
89  cne.Run(rm, statisticsCollector);
90  ivr.Run(rm, statisticsCollector);
91  dne.Run(rm, statisticsCollector);
92  cne.Run(rm, statisticsCollector);
93  dne.Run(rm, statisticsCollector);
94 }
95 
96 void
97 dump_xml(llvm::LlvmRvsdgModule & rvsdgModule, const std::string & file_name)
98 {
99  auto xml_file = fopen(file_name.c_str(), "w");
100  jlm::rvsdg::view_xml(&rvsdgModule.Rvsdg().GetRootRegion(), xml_file);
101  fclose(xml_file);
102 }
103 
104 bool
105 function_match(rvsdg::LambdaNode * ln, const std::string & function_name)
106 {
107  const std::regex fn_regex(function_name);
108  if (std::regex_match(
109  dynamic_cast<llvm::LlvmLambdaOperation &>(ln->GetOperation()).name(),
110  fn_regex))
111  { // TODO: handle C++ name mangling
112  return true;
113  }
114  return false;
115 }
116 
117 const jlm::rvsdg::Output *
119 {
120  auto graph = input->region()->graph();
121 
122  auto argument = dynamic_cast<const rvsdg::RegionArgument *>(input->origin());
123  const rvsdg::Output * result = nullptr;
124  if (auto theta = rvsdg::TryGetOwnerNode<rvsdg::ThetaNode>(*input->origin()))
125  {
126  result = trace_call(theta->MapOutputLoopVar(*input->origin()).input);
127  }
128  else if (argument == nullptr)
129  {
130  result = input->origin();
131  }
132  else if (argument->region() == &graph->GetRootRegion())
133  {
134  result = argument;
135  }
136  else
137  {
138  JLM_ASSERT(argument->input() != nullptr);
139  result = trace_call(argument->input());
140  }
141  return result;
142 }
143 
144 void
146 {
147  for (auto & node : rvsdg::TopDownTraverser(region))
148  {
149  if (auto structnode = dynamic_cast<rvsdg::StructuralNode *>(node))
150  {
151  for (size_t n = 0; n < structnode->nsubregions(); n++)
152  {
153  inline_calls(structnode->subregion(n));
154  }
155  }
156  else if (dynamic_cast<const llvm::CallOperation *>(&(node->GetOperation())))
157  {
158  auto traced = jlm::hls::trace_call(node->input(0));
159  auto so = dynamic_cast<const rvsdg::StructuralOutput *>(traced);
160  if (!so)
161  {
162  if (auto graphImport = dynamic_cast<const llvm::LlvmGraphImport *>(traced))
163  {
164  if (graphImport->Name().rfind("decouple_", 0) == 0)
165  {
166  // can't inline pseudo functions used for decoupling
167  continue;
168  }
169  if (graphImport->Name().rfind("hls_", 0) == 0)
170  {
171  // can't inline pseudo functions used for streaming
172  continue;
173  }
174  throw util::Error("can not inline external function " + graphImport->Name());
175  }
176  }
177  JLM_ASSERT(rvsdg::is<rvsdg::LambdaOperation>(so->node()));
178  auto ln = dynamic_cast<const rvsdg::StructuralOutput *>(traced)->node();
180  *dynamic_cast<rvsdg::SimpleNode *>(node),
181  *dynamic_cast<const rvsdg::LambdaNode *>(ln));
182  // restart for this region
183  inline_calls(region);
184  return;
185  }
186  }
187 }
188 
189 size_t alloca_cnt = 0;
190 
191 void
193 {
194  for (auto & node : rvsdg::TopDownTraverser(region))
195  {
196  if (auto structnode = dynamic_cast<rvsdg::StructuralNode *>(node))
197  {
198  for (size_t n = 0; n < structnode->nsubregions(); n++)
199  {
200  convert_alloca(structnode->subregion(n));
201  }
202  }
203  else if (auto po = dynamic_cast<const llvm::AllocaOperation *>(&(node->GetOperation())))
204  {
205  auto rr = &region->graph()->GetRootRegion();
206  auto delta_name = jlm::util::strfmt("hls_alloca_", alloca_cnt++);
207  auto delta_type = llvm::PointerType::Create();
208  std::cout << "alloca " << delta_name << ": " << po->value_type().debug_string() << "\n";
209  auto db = rvsdg::DeltaNode::Create(
210  rr,
212  po->ValueType(),
213  delta_name,
215  "",
216  false));
217  // create zero constant of allocated type
218  rvsdg::Output * cout = nullptr;
219  if (auto bt = dynamic_cast<const llvm::IntegerConstantOperation *>(&po->value_type()))
220  {
222  *db->subregion(),
223  bt->Representation().nbits(),
224  0)
225  .output(0);
226  }
227  else
228  {
229  cout = llvm::ConstantAggregateZeroOperation::Create(*db->subregion(), po->ValueType());
230  }
231  auto delta = &db->finalize(cout);
232  rvsdg::GraphExport::Create(*delta, delta_name);
233  auto delta_local = &rvsdg::RouteToRegion(*delta, *region);
234  node->output(0)->divert_users(delta_local);
235  // TODO: check that the input to alloca is a bitconst 1
236  // TODO: handle general case of other nodes getting state edge without a merge
237  JLM_ASSERT(node->output(1)->nusers() == 1);
238  auto & mux_in = *node->output(1)->Users().begin();
239  auto mux_node = rvsdg::TryGetOwnerNode<rvsdg::Node>(mux_in);
240  if (dynamic_cast<const llvm::MemoryStateMergeOperation *>(&mux_node->GetOperation()))
241  {
242  // merge after alloca -> remove merge
243  JLM_ASSERT(mux_node->ninputs() == 2);
244  auto other_index = mux_in.index() ? 0 : 1;
245  mux_node->output(0)->divert_users(mux_node->input(other_index)->origin());
246  jlm::rvsdg::remove(mux_node);
247  }
248  else
249  {
250  // TODO: fix this properly by adding a state edge to the LambdaEntryMemState and routing it
251  // to the region
252  JLM_ASSERT(false);
253  }
254  jlm::rvsdg::remove(node);
255  }
256  }
257 }
258 
261 {
262  auto op = util::assertedCast<const llvm::DeltaOperation>(&odn->GetOperation());
263  auto name = op->name();
264  std::replace_if(
265  name.begin(),
266  name.end(),
267  [](char c)
268  {
269  return c == '.';
270  },
271  '_');
272  std::cout << "renaming delta node " << op->name() << " to " << name << "\n";
273  auto db = rvsdg::DeltaNode::Create(
274  odn->region(),
276  odn->Type(),
277  name,
279  "",
280  op->constant()));
281  /* add dependencies */
283  for (auto ctxVar : odn->GetContextVars())
284  {
285  auto input = ctxVar.input;
286  auto nd = db->AddContextVar(*input->origin()).inner;
287  rmap.insert(ctxVar.inner, nd);
288  }
289 
290  /* copy subregion */
291  odn->subregion()->copy(db->subregion(), rmap);
292 
293  auto result = &rmap.lookup(*odn->subregion()->result(0)->origin());
294  auto data = &db->finalize(result);
295 
296  odn->output().divert_users(data);
297  jlm::rvsdg::remove(odn);
298  return rvsdg::TryGetOwnerNode<rvsdg::DeltaNode>(*data);
299 }
300 
303 {
304  const auto & op = dynamic_cast<llvm::LlvmLambdaOperation &>(ln->GetOperation());
305  auto lambda = rvsdg::LambdaNode::Create(
306  *ln->region(),
307  llvm::LlvmLambdaOperation::Create(op.Type(), op.name(), link, op.attributes()));
308 
309  /* add context variables */
310  rvsdg::SubstitutionMap subregionmap;
311  for (const auto & cv : ln->GetContextVars())
312  {
313  auto origin = cv.input->origin();
314  auto newcv = lambda->AddContextVar(*origin);
315  subregionmap.insert(cv.inner, newcv.inner);
316  }
317  /* collect function arguments */
318  auto args = ln->GetFunctionArguments();
319  auto newArgs = lambda->GetFunctionArguments();
320  JLM_ASSERT(args.size() == newArgs.size());
321  for (std::size_t n = 0; n < args.size(); ++n)
322  {
323  subregionmap.insert(args[n], newArgs[n]);
324  }
325 
326  /* copy subregion */
327  ln->subregion()->copy(lambda->subregion(), subregionmap);
328 
329  /* collect function results */
330  std::vector<jlm::rvsdg::Output *> results;
331  for (auto result : ln->GetFunctionResults())
332  results.push_back(&subregionmap.lookup(*result->origin()));
333 
334  /* finalize lambda */
335  lambda->finalize(results);
336 
337  divert_users(ln, outputs(lambda));
338  jlm::rvsdg::remove(ln);
339 
340  return lambda;
341 }
342 
343 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
344 split_hls_function(llvm::LlvmRvsdgModule & rm, const std::string & function_name)
345 {
346  // TODO: use a different datastructure for rhls?
347  // create a copy of rm
348  auto rhls =
350  std::cout << "processing " << rm.SourceFileName().name() << "\n";
351  auto root = &rm.Rvsdg().GetRootRegion();
352  for (auto node : rvsdg::TopDownTraverser(root))
353  {
354  if (auto ln = dynamic_cast<rvsdg::LambdaNode *>(node))
355  {
356  if (!function_match(ln, function_name))
357  {
358  continue;
359  }
360  inline_calls(ln->subregion());
361  split_opt(rm);
362  // convert_alloca(ln->subregion());
364  for (size_t i = 0; i < ln->ninputs(); ++i)
365  {
366  auto orig_node_output = dynamic_cast<rvsdg::NodeOutput *>(ln->input(i)->origin());
367  if (!orig_node_output)
368  {
369  // handle decouple stuff
370  auto oldGraphImport = dynamic_cast<llvm::LlvmGraphImport *>(ln->input(i)->origin());
371  auto & newGraphImport = llvm::LlvmGraphImport::Create(
372  rhls->Rvsdg(),
373  oldGraphImport->ValueType(),
374  oldGraphImport->ImportedType(),
375  oldGraphImport->Name(),
376  oldGraphImport->linkage());
377  smap.insert(ln->input(i)->origin(), &newGraphImport);
378  continue;
379  }
380  auto orig_node = orig_node_output->node();
381  if (auto oln = dynamic_cast<rvsdg::LambdaNode *>(orig_node))
382  {
383  throw util::Error(
384  "Inlining of function "
385  + dynamic_cast<llvm::LlvmLambdaOperation &>(oln->GetOperation()).name()
386  + " not supported");
387  }
388  else if (auto odn = dynamic_cast<rvsdg::DeltaNode *>(orig_node))
389  {
390  auto op = util::assertedCast<const llvm::DeltaOperation>(&odn->GetOperation());
391  // modify name to not contain .
392  if (op->name().find('.') != std::string::npos)
393  {
394  odn = rename_delta(odn);
395  op = util::assertedCast<const llvm::DeltaOperation>(&odn->GetOperation());
396  }
397  std::cout << "delta node " << op->name() << ": " << op->Type()->debug_string() << "\n";
398  // add import for delta to rhls
399  auto & graphImport = llvm::LlvmGraphImport::Create(
400  rhls->Rvsdg(),
401  op->Type(),
403  op->name(),
405  smap.insert(ln->input(i)->origin(), &graphImport);
406  // add export for delta to rm
407  // TODO: check if not already exported and maybe adjust linkage?
408  rvsdg::GraphExport::Create(odn->output(), op->name());
409  }
410  else
411  {
412  throw util::Error("Unsupported node type: " + orig_node->DebugString());
413  }
414  }
415  // copy function into rhls
416  auto new_ln = ln->copy(&rhls->Rvsdg().GetRootRegion(), smap);
418  auto oldExport = jlm::llvm::ComputeCallSummary(*ln).GetRvsdgExport();
419  rvsdg::GraphExport::Create(*new_ln->output(), oldExport ? oldExport->Name() : "");
420  // add function as input to rm and remove it
421  const auto & op = dynamic_cast<llvm::LlvmLambdaOperation &>(ln->GetOperation());
422  auto & graphImport = llvm::LlvmGraphImport::Create(
423  rm.Rvsdg(),
424  op.Type(),
425  op.Type(),
426  op.name(),
427  llvm::Linkage::externalLinkage); // TODO: change linkage?
428  ln->output()->divert_users(&graphImport);
429  remove(ln);
430  std::cout << "function "
431  << dynamic_cast<llvm::LlvmLambdaOperation &>(new_ln->GetOperation()).name()
432  << " extracted for HLS\n";
433  return rhls;
434  }
435  }
436  throw util::Error("HLS function " + function_name + " not found");
437 }
438 
439 void
441 {
442  dump_ref(rhls, path);
443 }
444 
445 std::unique_ptr<rvsdg::TransformationSequence>
446 createTransformationSequence(rvsdg::DotWriter & dotWriter, const bool dumpRvsdgDotGraphs)
447 {
448  auto predicateCorrelation = std::make_shared<llvm::PredicateCorrelation>();
449  auto deadNodeElimination = std::make_shared<llvm::DeadNodeElimination>();
450  auto commonNodeElimination = std::make_shared<CommonNodeElimination>();
451  auto invariantValueRedirection = std::make_shared<llvm::InvariantValueRedirection>();
452  auto loopUnswitching = std::make_shared<llvm::LoopUnswitching>();
453  auto ioBarrierRemoval = std::make_shared<IOBarrierRemoval>();
454  auto ioStateElimination = std::make_shared<IOStateElimination>();
455  auto memoryStateSeparation = std::make_shared<MemoryStateSeparation>();
456  auto gammaMerge = std::make_shared<GammaMerge>();
457  auto unusedStateRemoval = std::make_shared<UnusedStateRemoval>();
458  auto constantDistribution = std::make_shared<ConstantDistribution>();
459  auto gammaNodeConversion = std::make_shared<GammaNodeConversion>();
460  auto thetaNodeConversion = std::make_shared<ThetaNodeConversion>();
461  auto rhlsDeadNodeElimination = std::make_shared<RhlsDeadNodeElimination>();
462  auto allocaNodeConversion = std::make_shared<AllocaNodeConversion>();
463  auto streamConversion = std::make_shared<StreamConversion>();
464  auto addressQueueInsertion = std::make_shared<AddressQueueInsertion>();
465  auto memoryStateDecoupling = std::make_shared<MemoryStateDecoupling>();
466  auto memoryConverter = std::make_shared<MemoryConverter>();
467  auto nodeReduction = std::make_shared<llvm::NodeReduction>();
468  auto memoryStateSplitConversion = std::make_shared<MemoryStateSplitConversion>();
469  auto redundantBufferElimination = std::make_shared<RedundantBufferElimination>();
470  auto sinkInsertion = std::make_shared<SinkInsertion>();
471  auto forkInsertion = std::make_shared<ForkInsertion>();
472  auto bufferInsertion = std::make_shared<BufferInsertion>();
473  auto rhlsVerification = std::make_shared<RhlsVerification>();
474 
475  // Use this transformation to dump HLS dot graphs at specific points in the sequence
476  [[maybe_unused]] auto dumpDot = std::make_shared<DumpDotTransformation>();
477 
478  std::vector<std::shared_ptr<rvsdg::Transformation>> sequence({
479  loopUnswitching,
480  deadNodeElimination,
481  commonNodeElimination,
482  invariantValueRedirection,
483  predicateCorrelation,
484  deadNodeElimination,
485  commonNodeElimination,
486  deadNodeElimination,
487  ioBarrierRemoval,
488  ioStateElimination,
489  memoryStateSeparation,
490  gammaMerge,
491  unusedStateRemoval,
492  deadNodeElimination,
493  loopUnswitching,
494  commonNodeElimination,
495  deadNodeElimination,
496  gammaMerge,
497  deadNodeElimination,
498  unusedStateRemoval,
499  constantDistribution,
500  deadNodeElimination,
501  gammaNodeConversion,
502  thetaNodeConversion,
503  commonNodeElimination,
504  rhlsDeadNodeElimination,
505  allocaNodeConversion,
506  streamConversion,
507  addressQueueInsertion,
508  memoryStateDecoupling,
509  unusedStateRemoval,
510  memoryConverter,
511  nodeReduction,
512  memoryStateSplitConversion,
513  redundantBufferElimination,
514  sinkInsertion,
515  forkInsertion,
516  bufferInsertion,
517  rhlsVerification,
518  });
519 
520  return std::make_unique<rvsdg::TransformationSequence>(
521  std::move(sequence),
522  dotWriter,
523  dumpRvsdgDotGraphs);
524 }
525 
526 void
528 {
529  const std::unique_ptr<llvm::LlvmRvsdgModule> reference(
530  static_cast<llvm::LlvmRvsdgModule *>(rhls.copy().release()));
531  pre_opt(*reference);
532  instrument_ref(*reference);
533  for (size_t i = 0; i < reference->Rvsdg().GetRootRegion().narguments(); ++i)
534  {
535  auto graphImport = util::assertedCast<const llvm::LlvmGraphImport>(
536  reference->Rvsdg().GetRootRegion().argument(i));
537  std::cout << "impport " << graphImport->Name() << ": " << graphImport->Type()->debug_string()
538  << "\n";
539  }
540  ::llvm::LLVMContext ctx;
541  jlm::util::StatisticsCollector statisticsCollector;
542  auto jm2 = llvm::RvsdgToIpGraphConverter::CreateAndConvertModule(*reference, statisticsCollector);
544  std::error_code EC;
545  ::llvm::raw_fd_ostream os(path.to_str(), EC);
546  lm2->print(os, nullptr);
547 }
548 
549 }
Common Node Elimination This is mainly a copy of the CNE optimization in the LLVM backend with the ad...
Definition: cne.hpp:24
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
Definition: cne.cpp:623
Call operation class.
Definition: call.hpp:249
rvsdg::GraphExport * GetRvsdgExport() const noexcept
static jlm::rvsdg::Output * Create(rvsdg::Region &region, std::shared_ptr< const jlm::rvsdg::Type > type)
Definition: operators.hpp:1900
Dead Node Elimination Optimization.
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const llvm::Linkage &linkage, std::string section, bool constant)
Definition: delta.hpp:76
static void inlineCall(rvsdg::SimpleNode &callNode, rvsdg::LambdaNode &caller, const rvsdg::LambdaNode &callee)
Definition: inlining.cpp:278
static rvsdg::Node & Create(rvsdg::Region &region, IntegerValueRepresentation representation)
Invariant Value Redirection Optimization.
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static std::unique_ptr<::llvm::Module > CreateAndConvertModule(InterProceduralGraphModule &ipGraphModule, ::llvm::LLVMContext &ctx)
static LlvmGraphImport & Create(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, bool isConstant=false)
Definition: RvsdgModule.hpp:81
Lambda operation.
Definition: lambda.hpp:30
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::AttributeSet attributes)
Definition: lambda.hpp:77
const std::string & name() const noexcept
Definition: lambda.hpp:41
const util::FilePath & SourceFileName() const noexcept
const std::string & TargetTriple() const noexcept
static std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
std::unique_ptr< RvsdgModule > copy() const override
Definition: RvsdgModule.cpp:18
const std::string & DataLayout() const noexcept
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
Definition: reduction.cpp:59
static std::shared_ptr< const PointerType > Create()
Definition: types.cpp:45
static std::unique_ptr< InterProceduralGraphModule > CreateAndConvertModule(LlvmRvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector)
Delta node.
Definition: delta.hpp:129
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
Definition: delta.cpp:39
rvsdg::Region * subregion() const noexcept
Definition: delta.hpp:234
const DeltaOperation & GetOperation() const noexcept override
Definition: delta.cpp:71
static DeltaNode * Create(rvsdg::Region *parent, std::unique_ptr< DeltaOperation > op)
Definition: delta.hpp:313
rvsdg::Output & output() const noexcept
Definition: delta.cpp:110
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
Definition: delta.hpp:243
static GraphExport & Create(Output &origin, std::string name)
Definition: graph.cpp:62
Region & GetRootRegion() const noexcept
Definition: graph.hpp:99
Output * origin() const noexcept
Definition: node.hpp:58
Region * region() const noexcept
Definition: node.cpp:83
Lambda node.
Definition: lambda.hpp:83
std::vector< rvsdg::Output * > GetFunctionArguments() const
Definition: lambda.cpp:57
rvsdg::Region * subregion() const noexcept
Definition: lambda.hpp:138
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition: lambda.cpp:140
std::vector< rvsdg::Input * > GetFunctionResults() const
Definition: lambda.cpp:69
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
Definition: lambda.cpp:119
LambdaOperation & GetOperation() const noexcept override
Definition: lambda.cpp:51
rvsdg::Region * region() const noexcept
Definition: node.hpp:761
NodeOutput * output(size_t index) const noexcept
Definition: node.hpp:650
void divert_users(jlm::rvsdg::Output *new_origin)
Definition: node.hpp:301
Represents the argument of a region.
Definition: region.hpp:41
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
RegionResult * result(size_t index) const noexcept
Definition: region.hpp:471
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
Definition: region.cpp:314
Graph * graph() const noexcept
Definition: region.hpp:363
Graph & Rvsdg() noexcept
Definition: RvsdgModule.hpp:57
void insert(const Output *original, Output *substitute)
Output & lookup(const Output &original) const
std::string name() const noexcept
Returns the name of the file, excluding the path.
Definition: file.hpp:81
const std::string & to_str() const noexcept
Definition: file.hpp:275
#define JLM_ASSERT(x)
Definition: common.hpp:16
void dump_xml(llvm::LlvmRvsdgModule &rvsdgModule, const std::string &file_name)
Definition: rvsdg2rhls.cpp:97
void convert_alloca(rvsdg::Region *region)
Definition: rvsdg2rhls.cpp:192
rvsdg::LambdaNode * change_linkage(rvsdg::LambdaNode *ln, llvm::Linkage link)
Definition: rvsdg2rhls.cpp:302
rvsdg::DeltaNode * rename_delta(rvsdg::DeltaNode *odn)
Definition: rvsdg2rhls.cpp:260
bool function_match(rvsdg::LambdaNode *ln, const std::string &function_name)
Definition: rvsdg2rhls.cpp:105
void split_opt(llvm::LlvmRvsdgModule &rm)
Definition: rvsdg2rhls.cpp:61
void inline_calls(rvsdg::Region *region)
Definition: rvsdg2rhls.cpp:145
static void divert_users(jlm::rvsdg::Output *output, Context &ctx)
Definition: cne.cpp:504
size_t alloca_cnt
Definition: rvsdg2rhls.cpp:189
void instrument_ref(llvm::LlvmRvsdgModule &rm)
void dump_ref(llvm::LlvmRvsdgModule &rhls, const util::FilePath &path)
Definition: rvsdg2rhls.cpp:527
void pre_opt(jlm::llvm::LlvmRvsdgModule &rm)
Definition: rvsdg2rhls.cpp:79
std::unique_ptr< rvsdg::TransformationSequence > createTransformationSequence(rvsdg::DotWriter &dotWriter, const bool dumpRvsdgDotGraphs)
Definition: rvsdg2rhls.cpp:446
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > split_hls_function(llvm::LlvmRvsdgModule &rm, const std::string &function_name)
Definition: rvsdg2rhls.cpp:344
const jlm::rvsdg::Output * trace_call(jlm::rvsdg::Input *input)
Definition: rvsdg2rhls.cpp:118
void rvsdg2ref(llvm::LlvmRvsdgModule &rhls, const util::FilePath &path)
Definition: rvsdg2rhls.cpp:440
CallSummary ComputeCallSummary(const rvsdg::LambdaNode &lambdaNode)
Definition: CallSummary.cpp:30
static void remove(Node *node)
Definition: region.hpp:932
Output & RouteToRegion(Output &output, Region &region)
Definition: node.cpp:381
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
Definition: node.hpp:1058
void view_xml(const rvsdg::Region *region, FILE *out)
Definition: view.cpp:369
static std::string strfmt(Args... args)
Definition: strfmt.hpp:35