Jlm
ThetaTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
8 #include <jlm/rvsdg/TestType.hpp>
9 #include <jlm/rvsdg/theta.hpp>
10 #include <jlm/rvsdg/view.hpp>
11 
12 TEST(ThetaTests, TestThetaCreation)
13 {
14  using namespace jlm::rvsdg;
15 
16  Graph graph;
17  auto t = TestType::createValueType();
18 
19  auto imp1 = &jlm::rvsdg::GraphImport::Create(graph, ControlType::Create(2), "imp1");
20  auto imp2 = &jlm::rvsdg::GraphImport::Create(graph, t, "imp2");
21  auto imp3 = &jlm::rvsdg::GraphImport::Create(graph, t, "imp3");
22 
23  auto theta = jlm::rvsdg::ThetaNode::create(&graph.GetRootRegion());
24 
25  auto lv1 = theta->AddLoopVar(imp1);
26  auto lv2 = theta->AddLoopVar(imp2);
27  auto lv3 = theta->AddLoopVar(imp3);
28 
29  lv2.post->divert_to(lv3.pre);
30  lv3.post->divert_to(lv3.pre);
31  theta->set_predicate(lv1.pre);
32 
33  GraphExport::Create(*theta->output(0), "exp");
34  auto theta2 = static_cast<jlm::rvsdg::StructuralNode *>(theta)->copy(
35  &graph.GetRootRegion(),
36  { imp1, imp2, imp3 });
37  jlm::rvsdg::view(&graph.GetRootRegion(), stdout);
38 
39  EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::ThetaNode>(*lv1.output), theta);
40  EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::ThetaNode>(*lv2.output), theta);
41  EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::ThetaNode>(*lv3.output), theta);
42 
43  EXPECT_EQ(theta->predicate(), theta->subregion()->result(0));
44  EXPECT_EQ(theta->GetLoopVars().size(), 3u);
45  EXPECT_EQ(theta->GetLoopVars()[0].post, theta->subregion()->result(1));
46 
47  EXPECT_NE(dynamic_cast<const jlm::rvsdg::ThetaNode *>(theta2), nullptr);
48 }
49 
50 TEST(ThetaTests, TestThetaLoopVarRemoval)
51 {
52  using namespace jlm::rvsdg;
53 
54  // Arrange
55  Graph rvsdg;
56  auto valueType = TestType::createValueType();
57 
58  auto ctl = &jlm::rvsdg::GraphImport::Create(rvsdg, ControlType::Create(2), "ctl");
59  auto x = &jlm::rvsdg::GraphImport::Create(rvsdg, valueType, "x");
60  auto y = &jlm::rvsdg::GraphImport::Create(rvsdg, valueType, "y");
61 
62  auto thetaNode = ThetaNode::create(&rvsdg.GetRootRegion());
63 
64  auto lv0 = thetaNode->AddLoopVar(ctl);
65  auto lv1 = thetaNode->AddLoopVar(x);
66  auto lv2 = thetaNode->AddLoopVar(y);
67  thetaNode->set_predicate(lv0.pre);
68 
69  GraphExport::Create(*lv0.output, "");
70 
71  // Act & Assert
72  thetaNode->RemoveLoopVars({ lv1 });
73  auto loopvars = thetaNode->GetLoopVars();
74  EXPECT_EQ(loopvars.size(), 2u);
75  EXPECT_EQ(loopvars[0].input, lv0.input);
76  EXPECT_EQ(loopvars[0].pre, lv0.pre);
77  EXPECT_EQ(loopvars[0].post, lv0.post);
78  EXPECT_EQ(loopvars[0].output, lv0.output);
79  EXPECT_EQ(loopvars[1].input, lv2.input);
80  EXPECT_EQ(loopvars[1].pre, lv2.pre);
81  EXPECT_EQ(loopvars[1].post, lv2.post);
82  EXPECT_EQ(loopvars[1].output, lv2.output);
83 }
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
Definition: control.cpp:50
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
Region & GetRootRegion() const noexcept
Definition: graph.hpp:99
static std::shared_ptr< const TestType > createValueType()
Definition: TestType.cpp:67
static ThetaNode * create(rvsdg::Region *parent)
Definition: theta.hpp:73
TEST(ThetaConversionTests, TestUnknownBoundaries)
Definition: ThetaTests.cpp:18
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142