Jlm
Loading...
Searching...
No Matches
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>
13#include <jlm/rvsdg/view.hpp>
14
15TEST(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
54 MemoryStateSplitConversion::CreateAndRun(rvsdgModule, statisticsCollector);
55 view(rvsdg, stdout);
56
57 // Assert
58 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
59 EXPECT_EQ(structuralNode->subregion(0)->numNodes(), 1u);
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(), 1u);
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 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
Global memory state passed between functions.