Jlm
Loading...
Searching...
No Matches
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
11
12TEST(DeadNodeEliminationTests, TestDeadLoopNode)
13{
14 using namespace jlm::hls;
15
16 // Arrange
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(), 0u);
41}
42
43TEST(DeadNodeEliminationTests, TestDeadLoopNodeOutput)
44{
45 using namespace jlm::hls;
46
47 // Arrange
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(), 1u);
82 EXPECT_EQ(loopNode->ninputs(), 2u); // 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 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:141
static std::shared_ptr< const TestType > createValueType()
Definition TestType.cpp:67
TEST(DeadNodeEliminationTests, TestDeadLoopNode)