Jlm
Loading...
Searching...
No Matches
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>
8
10#include <jlm/rvsdg/theta.hpp>
11#include <jlm/rvsdg/view.hpp>
12
13namespace jlm::rvsdg
14{
15
17{
18 using namespace jlm::rvsdg;
19
20 Graph graph;
22
24 auto imp2 = &jlm::rvsdg::GraphImport::Create(graph, t, "imp2");
25 auto imp3 = &jlm::rvsdg::GraphImport::Create(graph, t, "imp3");
26
27 auto theta = jlm::rvsdg::ThetaNode::create(&graph.GetRootRegion());
28
29 auto lv1 = theta->AddLoopVar(imp1);
30 auto lv2 = theta->AddLoopVar(imp2);
31 auto lv3 = theta->AddLoopVar(imp3);
32
33 lv2.post->divert_to(lv3.pre);
34 lv3.post->divert_to(lv3.pre);
35 theta->set_predicate(lv1.pre);
36
37 GraphExport::Create(*theta->output(0), "exp");
38 auto theta2 = static_cast<jlm::rvsdg::StructuralNode *>(theta)->copy(
39 &graph.GetRootRegion(),
40 { imp1, imp2, imp3 });
42
46
47 EXPECT_EQ(theta->predicate(), theta->subregion()->result(0));
48 EXPECT_EQ(theta->GetLoopVars().size(), 3u);
49 EXPECT_EQ(theta->GetLoopVars()[0].post, theta->subregion()->result(1));
50
51 EXPECT_NE(dynamic_cast<const jlm::rvsdg::ThetaNode *>(theta2), nullptr);
52}
53
55{
56 using namespace jlm::rvsdg;
57
58 // Arrange
59 Graph rvsdg;
61
63 auto x = &jlm::rvsdg::GraphImport::Create(rvsdg, valueType, "x");
64 auto y = &jlm::rvsdg::GraphImport::Create(rvsdg, valueType, "y");
65
66 auto thetaNode = ThetaNode::create(&rvsdg.GetRootRegion());
67
68 auto lv0 = thetaNode->AddLoopVar(ctl);
69 auto lv1 = thetaNode->AddLoopVar(x);
70 auto lv2 = thetaNode->AddLoopVar(y);
71 thetaNode->set_predicate(lv0.pre);
72
73 GraphExport::Create(*lv0.output, "");
74
75 // Act & Assert
76 thetaNode->RemoveLoopVars({ lv1 });
77 auto loopvars = thetaNode->GetLoopVars();
78 EXPECT_EQ(loopvars.size(), 2u);
79 EXPECT_EQ(loopvars[0].input, lv0.input);
80 EXPECT_EQ(loopvars[0].pre, lv0.pre);
81 EXPECT_EQ(loopvars[0].post, lv0.post);
82 EXPECT_EQ(loopvars[0].output, lv0.output);
83 EXPECT_EQ(loopvars[1].input, lv2.input);
84 EXPECT_EQ(loopvars[1].pre, lv2.pre);
85 EXPECT_EQ(loopvars[1].post, lv2.post);
86 EXPECT_EQ(loopvars[1].output, lv2.output);
87}
88
89TEST(ThetaTests, reduceStaticallyKnownPredicate)
90{
91 // Arrange
92 Graph rvsdg;
94
95 auto x = &GraphImport::Create(rvsdg, valueType, "x");
96 auto y = &GraphImport::Create(rvsdg, valueType, "y");
97
98 auto thetaNode = ThetaNode::create(&rvsdg.GetRootRegion());
99 auto loopVar1 = thetaNode->AddLoopVar(x);
100 auto loopVar2 = thetaNode->AddLoopVar(y);
101
103 thetaNode->subregion(),
104 { loopVar1.pre, loopVar2.pre },
105 { valueType });
106 auto testNode2 =
107 TestOperation::createNode(thetaNode->subregion(), { loopVar2.pre }, { valueType });
108
109 auto & ctlConstant = ControlConstantOperation::createFalse(*thetaNode->subregion());
110
111 thetaNode->set_predicate(&ctlConstant);
112 loopVar1.post->divert_to(testNode1->output(0));
113 loopVar2.post->divert_to(testNode2->output(0));
114
115 auto & x1 = GraphExport::Create(*loopVar1.output, "");
116 auto & x2 = GraphExport::Create(*loopVar2.output, "");
117
118 // Act
120
121 // Assert
122 EXPECT_FALSE(Region::containsNodeType<ThetaNode>(rvsdg.GetRootRegion(), false));
123 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 3u);
124
125 {
126 auto [node, operation] = TryGetSimpleNodeAndOptionalOp<TestOperation>(*x1.origin());
127 EXPECT_NE(operation, nullptr);
128 EXPECT_EQ(node->ninputs(), 2u);
129 EXPECT_EQ(node->input(0)->origin(), x);
130 EXPECT_EQ(node->input(1)->origin(), y);
131 }
132
133 {
134 auto [node, operation] = TryGetSimpleNodeAndOptionalOp<TestOperation>(*x2.origin());
135 EXPECT_NE(operation, nullptr);
136 EXPECT_EQ(node->ninputs(), 1u);
137 EXPECT_EQ(node->input(0)->origin(), y);
138 }
139}
140
141}
static Output & createFalse(Region &region)
Definition control.hpp:134
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
size_t numNodes() const noexcept
Definition region.hpp:510
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type > > resultTypes)
static std::shared_ptr< const TestType > createValueType()
Definition TestType.cpp:67
static bool reduceStaticallyKnownPredicate(Node &node)
Definition theta.cpp:207
static ThetaNode * create(rvsdg::Region *parent)
Definition theta.hpp:84
TEST(ThetaTests, TestThetaCreation)
std::string view(const rvsdg::Region *region)
Definition view.cpp:142
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Definition node.hpp:872