Jlm
GraphTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2010 2011 2012 2014 Helge Bahmann <hcb@chaoticmind.net>
3  * Copyright 2014 2015 Nico Reißmann <nico.reissmann@gmail.com>
4  * See COPYING for terms of redistribution.
5  */
6 
7 #include <gtest/gtest.h>
8 
11 #include <jlm/rvsdg/TestType.hpp>
12 #include <jlm/rvsdg/view.hpp>
13 
14 static bool
16 {
17  for (const auto & node : region->Nodes())
18  {
19  if (&node == n)
20  return true;
21  }
22 
23  return false;
24 }
25 
26 TEST(GraphTests, test_recursive_prune)
27 {
28  using namespace jlm::rvsdg;
29 
30  auto t = TestType::createValueType();
31 
32  Graph graph;
33  auto & imp = jlm::rvsdg::GraphImport::Create(graph, t, "i");
34 
35  auto n1 = TestOperation::createNode(&graph.GetRootRegion(), { &imp }, { t });
36  auto n2 = TestOperation::createNode(&graph.GetRootRegion(), { &imp }, { t });
37 
38  auto n3 = TestStructuralNode::create(&graph.GetRootRegion(), 1);
39  auto input0 = n3->addInputWithArguments(imp);
40  auto & a1 = *n3->addArguments(t).argument[0];
41  auto n4 = TestOperation::createNode(n3->subregion(0), { &a1 }, { t });
42  auto n5 = TestOperation::createNode(n3->subregion(0), { &a1 }, { t });
43  auto o1 = n3->addOutputWithResults({ n4->output(0) });
44 
45  auto n6 = TestStructuralNode::create(n3->subregion(0), 1);
46 
47  GraphExport::Create(*n2->output(0), "n2");
48  GraphExport::Create(*o1.output, "n3");
49 
50  jlm::rvsdg::view(&graph.GetRootRegion(), stdout);
51  graph.PruneNodes();
52  jlm::rvsdg::view(&graph.GetRootRegion(), stdout);
53 
54  EXPECT_FALSE(region_contains_node(&graph.GetRootRegion(), n1));
55  EXPECT_TRUE(region_contains_node(&graph.GetRootRegion(), n2));
56  EXPECT_TRUE(region_contains_node(&graph.GetRootRegion(), n3));
57  EXPECT_TRUE(region_contains_node(n3->subregion(0), n4));
58  EXPECT_FALSE(region_contains_node(n3->subregion(0), n5));
59  EXPECT_FALSE(region_contains_node(n3->subregion(0), n6));
60 }
61 
62 TEST(GraphTests, test_empty_graph_pruning)
63 {
64  jlm::rvsdg::Graph graph;
65 
66  jlm::rvsdg::view(&graph.GetRootRegion(), stdout);
67 
68  graph.PruneNodes();
69 
70  EXPECT_EQ(graph.GetRootRegion().numNodes(), 0u);
71 
72  jlm::rvsdg::view(&graph.GetRootRegion(), stdout);
73 }
74 
75 TEST(GraphTests, test_prune_replace)
76 {
77  using namespace jlm::rvsdg;
78 
79  auto type = TestType::createValueType();
80 
81  Graph graph;
82  auto n1 = TestOperation::createNode(&graph.GetRootRegion(), {}, { type });
83  auto n2 = TestOperation::createNode(&graph.GetRootRegion(), { n1->output(0) }, { type });
84  auto n3 = TestOperation::createNode(&graph.GetRootRegion(), { n2->output(0) }, { type });
85 
86  GraphExport::Create(*n2->output(0), "n2");
87  GraphExport::Create(*n3->output(0), "n3");
88 
89  auto n4 = TestOperation::createNode(&graph.GetRootRegion(), { n1->output(0) }, { type });
90 
91  n2->output(0)->divert_users(n4->output(0));
92  EXPECT_EQ(n2->output(0)->nusers(), 0u);
93 
94  graph.PruneNodes();
95 
96  EXPECT_FALSE(region_contains_node(&graph.GetRootRegion(), n2));
97 }
98 
99 TEST(GraphTests, Copy)
100 {
101  using namespace jlm::rvsdg;
102 
103  // Arrange
104  auto valueType = TestType::createValueType();
105 
106  Graph graph;
107  auto & argument = jlm::rvsdg::GraphImport::Create(graph, valueType, "import");
108  auto node = TestOperation::createNode(&graph.GetRootRegion(), { &argument }, { valueType });
109  GraphExport::Create(*node->output(0), "export");
110 
111  // Act
112  auto newGraph = graph.Copy();
113 
114  // Assert
115  EXPECT_EQ(newGraph->GetRootRegion().narguments(), 1u);
116  auto copiedArgument = newGraph->GetRootRegion().argument(0);
117  EXPECT_TRUE(is<jlm::rvsdg::GraphImport>(copiedArgument));
118 
119  EXPECT_EQ(newGraph->GetRootRegion().numNodes(), 1u);
120  auto copiedNode = newGraph->GetRootRegion().Nodes().begin().ptr();
121  EXPECT_EQ(copiedNode->ninputs() == 1 && copiedNode->noutputs(), 1);
122  EXPECT_EQ(copiedNode->input(0)->origin(), copiedArgument);
123 
124  EXPECT_EQ(newGraph->GetRootRegion().nresults(), 1u);
125  auto copiedResult = newGraph->GetRootRegion().result(0);
126  EXPECT_TRUE(is<jlm::rvsdg::GraphExport>(*copiedResult));
127  EXPECT_EQ(copiedResult->origin(), copiedNode->output(0));
128 }
static bool region_contains_node(const jlm::rvsdg::Region *region, const jlm::rvsdg::Node *n)
Definition: GraphTests.cpp:15
TEST(GraphTests, test_recursive_prune)
Definition: GraphTests.cpp:26
static GraphExport & Create(Output &origin, std::string name)
Definition: graph.cpp:62
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Definition: graph.cpp:36
void PruneNodes()
Definition: graph.hpp:116
std::unique_ptr< Graph > Copy() const
Definition: graph.cpp:79
Region & GetRootRegion() const noexcept
Definition: graph.hpp:99
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
size_t numNodes() const noexcept
Definition: region.hpp:481
NodeRange Nodes() noexcept
Definition: region.hpp:328
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type >> resultTypes)
static TestStructuralNode * create(Region *parent, const size_t numSubregions)
Definition: TestNodes.hpp:152
static std::shared_ptr< const TestType > createValueType()
Definition: TestType.cpp:67
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142