Jlm
Loading...
Searching...
No Matches
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
12#include <jlm/rvsdg/view.hpp>
13
14static bool
16{
17 for (const auto & node : region->Nodes())
18 {
19 if (&node == n)
20 return true;
21 }
22
23 return false;
24}
25
26TEST(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
62TEST(GraphTests, test_empty_graph_pruning)
63{
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
75TEST(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
99TEST(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(), 1u);
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)
TEST(GraphTests, test_recursive_prune)
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
void PruneNodes()
Definition graph.hpp:116
std::unique_ptr< Graph > Copy() const
Definition graph.cpp:79
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213
size_t numNodes() const noexcept
Definition region.hpp:510
NodeRange Nodes() noexcept
Definition region.hpp:375
std::string view(const rvsdg::Region *region)
Definition view.cpp:142