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>
7
9#include <jlm/rvsdg/theta.hpp>
10#include <jlm/rvsdg/view.hpp>
11
12TEST(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
50TEST(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 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 ThetaNode * create(rvsdg::Region *parent)
Definition theta.hpp:73
TEST(ThetaConversionTests, TestUnknownBoundaries)
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