6 #include <gtest/gtest.h>
19 TEST(NodeSinkingTests, testPullInTop)
30 auto & graph = rm.Rvsdg();
35 auto n1 = TestOperation::createNode(&graph.GetRootRegion(), { x }, { vt })->output(0);
36 auto n2 = TestOperation::createNode(&graph.GetRootRegion(), { x }, { vt })->output(0);
37 auto n3 = TestOperation::createNode(&graph.GetRootRegion(), { n2 }, { vt })->output(0);
38 auto n4 = TestOperation::createNode(&graph.GetRootRegion(), { c, n1 }, { ct })->output(0);
39 auto n5 = TestOperation::createNode(&graph.GetRootRegion(), { n1, n3 }, { vt })->output(0);
43 gamma->AddEntryVar(n4);
44 auto ev = gamma->AddEntryVar(n5);
45 gamma->AddExitVar(ev.branchArgument);
54 EXPECT_EQ(gamma->subregion(0)->numNodes(), 2u);
55 EXPECT_EQ(gamma->subregion(1)->numNodes(), 2u);
58 TEST(NodeSinkingTests, testPullInBottom)
64 auto valueType = TestType::createValueType();
65 const auto controlType = ControlType::Create(2);
71 auto gammaNode = GammaNode::create(c, 2);
73 auto entryVar = gammaNode->AddEntryVar(x);
74 gammaNode->AddExitVar(entryVar.branchArgument);
77 TestOperation::createNode(&rvsdg.
GetRootRegion(), { gammaNode->output(0), x }, { valueType });
78 auto node2 = TestOperation::createNode(
80 { gammaNode->output(0), node1->output(0) },
83 auto & xp = GraphExport::Create(*node2->output(0),
"x");
94 EXPECT_EQ(sunkNodes, 2u);
97 EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*xp.origin()), gammaNode);
98 EXPECT_EQ(gammaNode->subregion(0)->numNodes(), 2u);
99 EXPECT_EQ(gammaNode->subregion(1)->numNodes(), 2u);
102 TEST(NodeSinkingTests, testPull)
108 auto & graph = rm.
Rvsdg();
112 auto croot = TestOperation::createNode(&graph.GetRootRegion(), {}, { vt })->output(0);
116 auto ev1 = gamma1->AddEntryVar(p);
117 auto ev2 = gamma1->AddEntryVar(croot);
119 auto cg1 = TestOperation::createNode(gamma1->subregion(0), {}, { vt })->output(0);
123 auto ev3 = gamma2->AddEntryVar(ev2.branchArgument[1]);
124 auto cg2 = TestOperation::createNode(gamma2->subregion(0), {}, { vt })->output(0);
126 TestOperation::createNode(gamma2->subregion(1), { ev3.branchArgument[1] }, { vt })->output(0);
127 auto g2xv = gamma2->AddExitVar({ cg2, un });
129 auto g1xv = gamma1->AddExitVar({ cg1, g2xv.output });
139 EXPECT_EQ(graph.GetRootRegion().numNodes(), 1u);
static jlm::util::StatisticsCollector statisticsCollector
TEST(NodeSinkingTests, testPullInTop)
Node Sinking Optimization.
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static size_t sinkDependentNodesIntoGamma(rvsdg::GammaNode &gammaNode)
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
static GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
static GraphExport & Create(Output &origin, std::string name)
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Region & GetRootRegion() const noexcept
size_t numNodes() const noexcept
static std::shared_ptr< const TestType > createValueType()
Global memory state passed between functions.
void pullin_top(rvsdg::GammaNode *gamma)
std::string view(const rvsdg::Region *region)