Jlm
DeadNodeEliminationTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
10 #include <jlm/rvsdg/TestType.hpp>
11 
12 TEST(DeadNodeEliminationTests, TestDeadLoopNode)
13 {
14  using namespace jlm::hls;
15 
16  // Arrange
17  auto valueType = jlm::rvsdg::TestType::createValueType();
18  auto functionType = jlm::rvsdg::FunctionType::Create(
19  { jlm::rvsdg::ControlType::Create(2), valueType },
20  { valueType });
21 
22  jlm::llvm::LlvmRvsdgModule rvsdgModule(jlm::util::FilePath(""), "", "");
23  auto & rvsdg = rvsdgModule.Rvsdg();
24 
25  auto lambdaNode = jlm::rvsdg::LambdaNode::Create(
26  rvsdg.GetRootRegion(),
28  functionType,
29  "f",
31 
32  LoopNode::create(lambdaNode->subregion());
33 
34  lambdaNode->finalize({ lambdaNode->GetFunctionArguments()[1] });
35 
36  // Act
37  EliminateDeadNodes(rvsdgModule);
38 
39  // Assert
40  EXPECT_EQ(lambdaNode->subregion()->numNodes(), 0);
41 }
42 
43 TEST(DeadNodeEliminationTests, TestDeadLoopNodeOutput)
44 {
45  using namespace jlm::hls;
46 
47  // Arrange
48  auto valueType = jlm::rvsdg::TestType::createValueType();
49  auto functionType = jlm::rvsdg::FunctionType::Create(
50  { jlm::rvsdg::ControlType::Create(2), valueType },
52 
53  jlm::llvm::LlvmRvsdgModule rvsdgModule(jlm::util::FilePath(""), "", "");
54  auto & rvsdg = rvsdgModule.Rvsdg();
55 
56  auto lambdaNode = jlm::rvsdg::LambdaNode::Create(
57  rvsdg.GetRootRegion(),
59  functionType,
60  "f",
62 
63  auto p = lambdaNode->GetFunctionArguments()[0];
64  auto x = lambdaNode->GetFunctionArguments()[1];
65 
66  auto loopNode = LoopNode::create(lambdaNode->subregion());
67 
68  jlm::rvsdg::Output * buffer = nullptr;
69  auto output0 = loopNode->AddLoopVar(p, &buffer);
70  loopNode->AddLoopVar(x);
71  loopNode->set_predicate(buffer);
72 
73  auto lambdaOutput = lambdaNode->finalize({ output0 });
74 
75  jlm::rvsdg::GraphExport::Create(*lambdaOutput, "f");
76 
77  // Act
78  EliminateDeadNodes(rvsdgModule);
79 
80  // Assert
81  EXPECT_EQ(loopNode->noutputs(), 1);
82  EXPECT_EQ(loopNode->ninputs(), 2); // I believe that it actually should only have one input.
83  // FIXME: The DNE seems to already be broken for a simple dead edge through it. It removes the
84  // output from the loop node, but then seems to fail to remove the corresponding input, arguments,
85  // and results.
86 }
static LoopNode * create(rvsdg::Region *parent, bool init=true)
Definition: hls.cpp:294
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 ControlType > Create(std::size_t nalternatives)
Instantiates control type.
Definition: control.cpp:50
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 std::shared_ptr< const TestType > createValueType()
Definition: TestType.cpp:67
TEST(DeadNodeEliminationTests, TestDeadLoopNode)
void EliminateDeadNodes(llvm::LlvmRvsdgModule &rvsdgModule)