Jlm
MemoryStateSplitConversionTests.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 
6 #include <gtest/gtest.h>
7 
9 #include <jlm/hls/ir/hls.hpp>
12 #include <jlm/rvsdg/TestNodes.hpp>
13 #include <jlm/rvsdg/view.hpp>
14 
15 TEST(MemoryStateSplitConversionTests, SplitConversion)
16 {
17  using namespace jlm::hls;
18  using namespace jlm::llvm;
19  using namespace jlm::rvsdg;
20  using namespace jlm::util;
21 
22  // Arrange
23  auto memoryStateType = MemoryStateType::Create();
24 
25  jlm::llvm::LlvmRvsdgModule rvsdgModule(FilePath(""), "", "");
26  auto & rvsdg = rvsdgModule.Rvsdg();
27 
28  auto & importX = jlm::rvsdg::GraphImport::Create(rvsdg, memoryStateType, "x");
29  auto & importY = jlm::rvsdg::GraphImport::Create(rvsdg, memoryStateType, "y");
30 
31  auto structuralNode = TestStructuralNode::create(&rvsdg.GetRootRegion(), 1);
32  const auto inputVar = structuralNode->addInputWithArguments(importX);
33 
34  auto & entrySplitNode =
35  LambdaEntryMemoryStateSplitOperation::CreateNode(*inputVar.argument[0], { 0, 1, 2 });
36 
37  const auto outputVar0 = structuralNode->addOutputWithResults({ entrySplitNode.output(0) });
38  const auto outputVar1 = structuralNode->addOutputWithResults({ entrySplitNode.output(1) });
39  const auto outputVar2 = structuralNode->addOutputWithResults({ entrySplitNode.output(2) });
40 
41  auto splitResults = MemoryStateSplitOperation::Create(importY, 2);
42 
43  jlm::rvsdg::GraphExport::Create(*outputVar0.output, "o0");
44  jlm::rvsdg::GraphExport::Create(*outputVar1.output, "o1");
45  jlm::rvsdg::GraphExport::Create(*outputVar2.output, "o2");
46 
47  jlm::rvsdg::GraphExport::Create(*splitResults[0], "o3");
48  jlm::rvsdg::GraphExport::Create(*splitResults[1], "o4");
49 
50  view(rvsdg, stdout);
51 
52  // Act
55  view(rvsdg, stdout);
56 
57  // Assert
58  EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
59  EXPECT_EQ(structuralNode->subregion(0)->numNodes(), 1);
60 
61  // The memory state split conversion pass should have replaced the
62  // LambdaEntryMemoryStateSplitOperation node with a ForkOperation node
63  {
64  EXPECT_EQ(outputVar0.output->nusers(), 1);
65  EXPECT_TRUE(IsOwnerNodeOperation<ForkOperation>(*inputVar.argument[0]->Users().begin()));
66  }
67 
68  // The memory state split conversion pass should have replaced the
69  // MemoryStateSplitOperation node with a ForkOperation node
70  {
71  EXPECT_TRUE(IsOwnerNodeOperation<ForkOperation>(*importY.Users().begin()));
72  }
73 }
static jlm::util::StatisticsCollector statisticsCollector
TEST(MemoryStateSplitConversionTests, SplitConversion)
static void CreateAndRun(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector)
static rvsdg::SimpleNode & CreateNode(rvsdg::Output &operand, std::vector< MemoryNodeId > memoryNodeIds)
static std::vector< rvsdg::Output * > Create(rvsdg::Output &operand, const size_t numResults)
static std::shared_ptr< const MemoryStateType > Create()
Definition: types.cpp:379
static GraphExport & Create(Output &origin, std::string name)
Definition: graph.cpp:62
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Definition: graph.cpp:36
Graph & Rvsdg() noexcept
Definition: RvsdgModule.hpp:57
static TestStructuralNode * create(Region *parent, const size_t numSubregions)
Definition: TestNodes.hpp:152
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142