Jlm
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>
13 #include <jlm/rvsdg/TestNodes.hpp>
14 #include <jlm/rvsdg/TestType.hpp>
15 #include <jlm/rvsdg/view.hpp>
16 
17 TEST(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
52  view(rvsdg, stdout);
53 
54  // Assert
55  EXPECT_EQ(structuralNode->subregion(0)->numNodes(), 1);
56  EXPECT_EQ(lambdaNode->subregion()->numNodes(), 2);
57 
58  // The sink insertion pass should have inserted a SinkOperation node at output o0
59  {
60  EXPECT_EQ(outputVar0.output->nusers(), 1);
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(), 1);
68  EXPECT_TRUE(IsOwnerNodeOperation<SinkOperation>(*i0Argument.Users().begin()));
69  }
70 }
static jlm::util::StatisticsCollector statisticsCollector
TEST(SinkInsertionTests, SinkInsertion)
static void CreateAndRun(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector)
Definition: add-sinks.cpp:22
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
Definition: lambda.hpp:84
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
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:140
static TestStructuralNode * create(Region *parent, const size_t numSubregions)
Definition: TestNodes.hpp:152
static std::shared_ptr< const TestType > createValueType()
Definition: TestType.cpp:67
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142