Jlm
DeltaTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2018 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
11 #include <jlm/rvsdg/TestType.hpp>
12 #include <jlm/rvsdg/view.hpp>
13 
14 TEST(DeltaTests, TestDeltaCreation)
15 {
16  using namespace jlm::llvm;
17  using namespace jlm::rvsdg;
18 
19  // Arrange & Act
20  auto valueType = TestType::createValueType();
21  auto pointerType = PointerType::Create();
22  jlm::llvm::LlvmRvsdgModule rvsdgModule(jlm::util::FilePath(""), "", "");
23 
24  auto imp = &jlm::rvsdg::GraphImport::Create(rvsdgModule.Rvsdg(), valueType, "");
25 
26  auto delta1 = jlm::rvsdg::DeltaNode::Create(
27  &rvsdgModule.Rvsdg().GetRootRegion(),
29  valueType,
30  "test-delta1",
32  "",
33  true,
34  4));
35  auto dep = delta1->AddContextVar(*imp).inner;
36  auto d1 = &delta1->finalize(
37  TestOperation::createNode(delta1->subregion(), { dep }, { valueType })->output(0));
38 
39  auto delta2 = jlm::rvsdg::DeltaNode::Create(
40  &rvsdgModule.Rvsdg().GetRootRegion(),
42  valueType,
43  "test-delta2",
45  "",
46  false,
47  4));
48  auto d2 = &delta2->finalize(
49  TestOperation::createNode(delta2->subregion(), {}, { valueType })->output(0));
50 
51  GraphExport::Create(*d1, "");
52  GraphExport::Create(*d2, "");
53 
54  jlm::rvsdg::view(rvsdgModule.Rvsdg(), stdout);
55 
56  // Assert
57  EXPECT_EQ(rvsdgModule.Rvsdg().GetRootRegion().numNodes(), 2u);
58 
59  EXPECT_TRUE(delta1->constant());
60  EXPECT_EQ(*delta1->Type(), *valueType);
61 
62  EXPECT_FALSE(delta2->constant());
63  EXPECT_EQ(*delta2->Type(), *valueType);
64 }
65 
66 TEST(DeltaTests, TestRemoveDeltaInputsWhere)
67 {
68  using namespace jlm::llvm;
69  using namespace jlm::rvsdg;
70 
71  // Arrange
72  auto valueType = TestType::createValueType();
73  jlm::llvm::LlvmRvsdgModule rvsdgModule(jlm::util::FilePath(""), "", "");
74 
75  auto x = &jlm::rvsdg::GraphImport::Create(rvsdgModule.Rvsdg(), valueType, "");
76 
77  auto deltaNode = jlm::rvsdg::DeltaNode::Create(
78  &rvsdgModule.Rvsdg().GetRootRegion(),
79  jlm::llvm::DeltaOperation::Create(valueType, "delta", Linkage::externalLinkage, "", true, 4));
80  auto deltaInput0 = deltaNode->AddContextVar(*x).input;
81  auto deltaInput1 = deltaNode->AddContextVar(*x).input;
82  deltaNode->AddContextVar(*x);
83 
84  auto result = jlm::rvsdg::CreateOpNode<TestOperation>(
85  { deltaNode->MapInputContextVar(*deltaInput1).inner },
86  std::vector<std::shared_ptr<const Type>>{ valueType },
87  std::vector<std::shared_ptr<const Type>>{ valueType })
88  .output(0);
89 
90  deltaNode->finalize(result);
91 
92  // Act & Assert
93  // Try to remove deltaInput1 even though it is used
94  auto numRemovedInputs = deltaNode->RemoveDeltaInputsWhere(
95  [&](const jlm::rvsdg::Input & input)
96  {
97  return input.index() == deltaInput1->index();
98  });
99  EXPECT_EQ(numRemovedInputs, 0u);
100  EXPECT_EQ(deltaNode->ninputs(), 3u);
101  EXPECT_EQ(deltaNode->GetContextVars().size(), 3u);
102 
103  // Remove deltaInput2
104  numRemovedInputs = deltaNode->RemoveDeltaInputsWhere(
105  [&](const jlm::rvsdg::Input & input)
106  {
107  return input.index() == 2;
108  });
109  EXPECT_EQ(numRemovedInputs, 1u);
110  EXPECT_EQ(deltaNode->ninputs(), 2u);
111  EXPECT_EQ(deltaNode->GetContextVars().size(), 2u);
112  EXPECT_EQ(deltaNode->input(0), deltaInput0);
113  EXPECT_EQ(deltaNode->input(1), deltaInput1);
114 
115  // Remove deltaInput0
116  numRemovedInputs = deltaNode->RemoveDeltaInputsWhere(
117  [&](const jlm::rvsdg::Input & input)
118  {
119  return input.index() == 0;
120  });
121  EXPECT_EQ(numRemovedInputs, 1u);
122  EXPECT_EQ(deltaNode->ninputs(), 1u);
123  EXPECT_EQ(deltaNode->GetContextVars().size(), 1u);
124  EXPECT_EQ(deltaNode->input(0), deltaInput1);
125  EXPECT_EQ(deltaInput1->index(), 0u);
126  EXPECT_EQ(deltaNode->MapInputContextVar(*deltaInput1).inner->index(), 0u);
127 }
128 
129 TEST(DeltaTests, TestPruneDeltaInputs)
130 {
131  using namespace jlm::llvm;
132  using namespace jlm::rvsdg;
133 
134  // Arrange
135  auto valueType = TestType::createValueType();
136  jlm::llvm::LlvmRvsdgModule rvsdgModule(jlm::util::FilePath(""), "", "");
137 
138  auto x = &jlm::rvsdg::GraphImport::Create(rvsdgModule.Rvsdg(), valueType, "");
139 
140  auto deltaNode = jlm::rvsdg::DeltaNode::Create(
141  &rvsdgModule.Rvsdg().GetRootRegion(),
142  jlm::llvm::DeltaOperation::Create(valueType, "delta", Linkage::externalLinkage, "", true, 4));
143 
144  deltaNode->AddContextVar(*x);
145  auto deltaInput1 = deltaNode->AddContextVar(*x).input;
146  deltaNode->AddContextVar(*x);
147 
148  auto result = jlm::rvsdg::CreateOpNode<TestOperation>(
149  { deltaNode->MapInputContextVar(*deltaInput1).inner },
150  std::vector<std::shared_ptr<const Type>>{ valueType },
151  std::vector<std::shared_ptr<const Type>>{ valueType })
152  .output(0);
153 
154  deltaNode->finalize(result);
155 
156  // Act
157  auto numRemovedInputs = deltaNode->PruneDeltaInputs();
158 
159  // Assert
160  EXPECT_EQ(numRemovedInputs, 2u);
161  EXPECT_EQ(deltaNode->ninputs(), 1u);
162  EXPECT_EQ(deltaNode->GetContextVars().size(), 1u);
163  EXPECT_EQ(deltaNode->input(0), deltaInput1);
164  EXPECT_EQ(deltaNode->subregion()->argument(0), deltaNode->MapInputContextVar(*deltaInput1).inner);
165  EXPECT_EQ(deltaInput1->index(), 0u);
166  EXPECT_EQ(deltaNode->MapInputContextVar(*deltaInput1).inner->index(), 0u);
167 }
TEST(DeltaTests, TestDeltaCreation)
Definition: DeltaTests.cpp:14
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const Linkage &linkage, std::string section, bool constant, const size_t alignment)
Definition: delta.hpp:84
static std::shared_ptr< const PointerType > Create()
Definition: types.cpp:45
static DeltaNode * Create(rvsdg::Region *parent, std::unique_ptr< DeltaOperation > op)
Definition: delta.hpp:313
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Definition: graph.cpp:36
Region & GetRootRegion() const noexcept
Definition: graph.hpp:99
size_t index() const noexcept
Definition: node.hpp:52
size_t numNodes() const noexcept
Definition: region.hpp:481
Graph & Rvsdg() noexcept
Definition: RvsdgModule.hpp:57
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142