Jlm
IOBarrierRemoval.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2025 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
8 #include <jlm/rvsdg/region.hpp>
11 
12 namespace jlm::hls
13 {
14 
15 IOBarrierRemoval::~IOBarrierRemoval() noexcept = default;
16 
17 void
18 IOBarrierRemoval::Run(rvsdg::RvsdgModule & module, util::StatisticsCollector &)
19 {
20  RemoveIOBarrierFromRegion(module.Rvsdg().GetRootRegion());
21 }
22 
23 void
25 {
26  for (auto & node : region.Nodes())
27  {
28  // Handle subregions first
29  if (const auto structuralNode = dynamic_cast<const rvsdg::StructuralNode *>(&node))
30  {
31  for (size_t n = 0; n < structuralNode->nsubregions(); n++)
32  {
33  RemoveIOBarrierFromRegion(*structuralNode->subregion(n));
34  }
35  }
36 
37  // Render all IOBarrier nodes dead
38  if (rvsdg::is<llvm::IOBarrierOperation>(&node))
39  {
40  node.output(0)->divert_users(node.input(0)->origin());
41  }
42  }
43 
44  // Remove all dead IOBarrier nodes
45  region.prune(false);
46 }
47 
48 }
Removes all IOBarrier nodes from the RVSDG.
static void RemoveIOBarrierFromRegion(rvsdg::Region &region)
~IOBarrierRemoval() noexcept override
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
void prune(bool recursive)
Definition: region.cpp:323
NodeRange Nodes() noexcept
Definition: region.hpp:328