Jlm
Loading...
Searching...
No Matches
SinkInsertionTests.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>
15#include <jlm/rvsdg/view.hpp>
16
17TEST(SinkInsertionTests, SinkInsertion)
18{
19 using namespace jlm::hls;
20 using namespace jlm::llvm;
21 using namespace jlm::rvsdg;
22 using namespace jlm::util;
23
24 // Arrange
25 auto valueType = TestType::createValueType();
26 auto functionType = FunctionType::Create({ valueType }, { valueType });
27
28 jlm::llvm::LlvmRvsdgModule rvsdgModule(FilePath(""), "", "");
29 auto & rvsdg = rvsdgModule.Rvsdg();
30
31 auto lambdaNode = jlm::rvsdg::LambdaNode::Create(
32 rvsdg.GetRootRegion(),
33 LlvmLambdaOperation::Create(functionType, "f", Linkage::externalLinkage));
34 auto argument = lambdaNode->GetFunctionArguments()[0];
35
36 auto structuralNode = TestStructuralNode::create(lambdaNode->subregion(), 1);
37 const auto inputVar0 = structuralNode->addInputWithArguments(*argument);
38 const auto inputVar1 = structuralNode->addInputWithArguments(*argument);
39
40 const auto outputVar0 = structuralNode->addOutputWithResults({ inputVar1.argument[0] });
41 const auto outputVar1 = structuralNode->addOutputWithResults({ inputVar1.argument[0] });
42
43 auto lambdaOutput = lambdaNode->finalize({ outputVar1.output });
44
45 jlm::rvsdg::GraphExport::Create(*lambdaOutput, "");
46
47 view(rvsdg, stdout);
48
49 // Act
51 SinkInsertion::CreateAndRun(rvsdgModule, statisticsCollector);
52 view(rvsdg, stdout);
53
54 // Assert
55 EXPECT_EQ(structuralNode->subregion(0)->numNodes(), 1u);
56 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 2u);
57
58 // The sink insertion pass should have inserted a SinkOperation node at output o0
59 {
60 EXPECT_EQ(outputVar0.output->nusers(), 1u);
61 EXPECT_TRUE(IsOwnerNodeOperation<SinkOperation>(*outputVar0.output->Users().begin()));
62 }
63
64 // The sink insertion pass should have inserted a SinkOperation node at the argument of i0
65 {
66 auto & i0Argument = *inputVar0.argument[0];
67 EXPECT_EQ(i0Argument.nusers(), 1u);
68 EXPECT_TRUE(IsOwnerNodeOperation<SinkOperation>(*i0Argument.Users().begin()));
69 }
70}
static jlm::util::StatisticsCollector statisticsCollector
TEST(SinkInsertionTests, SinkInsertion)
static GraphExport & Create(Output &origin, std::string name)
Definition graph.cpp:62
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition lambda.cpp:141
Global memory state passed between functions.