6 #include <gtest/gtest.h>
17 TEST(LoopUnswitchingTests, Test1)
23 const auto valueType = TestType::createValueType();
26 auto & graph = rvsdgModule.
Rvsdg();
28 auto x = &GraphImport::Create(graph, valueType,
"x");
29 auto y = &GraphImport::Create(graph, valueType,
"y");
30 auto z = &GraphImport::Create(graph, valueType,
"z");
32 auto thetaNode = ThetaNode::create(&graph.GetRootRegion());
34 auto loopVarX = thetaNode->AddLoopVar(x);
35 auto loopVarY = thetaNode->AddLoopVar(y);
36 thetaNode->AddLoopVar(z);
38 auto a = TestOperation::createNode(
39 thetaNode->subregion(),
40 { loopVarX.pre, loopVarY.pre },
41 { BitType::Create(1) })
43 auto & predicateNode = MatchOperation::CreateNode(*a, { { 1, 0 } }, 1, 2);
45 auto gamma = GammaNode::create(predicateNode.output(0), 2);
47 auto entryVarX = gamma->AddEntryVar(loopVarX.pre);
48 auto entryVarY = gamma->AddEntryVar(loopVarY.pre);
50 auto b = TestOperation::createNode(
52 { entryVarX.branchArgument[0], entryVarY.branchArgument[0] },
55 auto c = TestOperation::createNode(
57 { entryVarX.branchArgument[1], entryVarY.branchArgument[1] },
61 auto exitVarY = gamma->AddExitVar({ b, c });
63 loopVarY.post->divert_to(exitVarY.output);
65 thetaNode->set_predicate(predicateNode.output(0));
67 auto & ex1 = GraphExport::Create(*thetaNode->output(0),
"x");
68 auto & ex2 = GraphExport::Create(*thetaNode->output(1),
"y");
69 auto & ex3 = GraphExport::Create(*thetaNode->output(2),
"z");
71 view(&graph.GetRootRegion(), stdout);
80 view(&graph.GetRootRegion(), stdout);
83 EXPECT_NE(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::GammaNode>(*ex1.origin()),
nullptr);
84 auto [testNode, testOperation] = TryGetSimpleNodeAndOptionalOp<TestOperation>(*ex2.origin());
85 EXPECT_NE(testNode,
nullptr);
86 EXPECT_NE(testOperation,
nullptr);
87 EXPECT_NE(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::GammaNode>(*ex3.origin()),
nullptr);
90 TEST(LoopUnswitchingTests, Test2)
96 const auto valueType = TestType::createValueType();
99 auto & graph = rvsdgModule.
Rvsdg();
101 auto x = &GraphImport::Create(graph, valueType,
"x");
103 auto thetaNode = ThetaNode::create(&graph.GetRootRegion());
105 auto loopVarX = thetaNode->AddLoopVar(x);
108 TestOperation::createNode(thetaNode->subregion(), { loopVarX.pre }, { BitType::Create(1) })
111 TestOperation::createNode(thetaNode->subregion(), { loopVarX.pre }, { valueType })->output(0);
112 auto & predicateNode = MatchOperation::CreateNode(*n1, { { 1, 0 } }, 1, 2);
114 auto gammaNode = GammaNode::create(predicateNode.output(0), 2);
116 auto ev1 = gammaNode->AddEntryVar(n1);
117 auto ev2 = gammaNode->AddEntryVar(loopVarX.pre);
118 auto ev3 = gammaNode->AddEntryVar(n2);
120 gammaNode->AddExitVar(ev1.branchArgument);
121 gammaNode->AddExitVar(ev2.branchArgument);
122 gammaNode->AddExitVar(ev3.branchArgument);
124 loopVarX.post->divert_to(gammaNode->output(1));
126 thetaNode->set_predicate(predicateNode.output(0));
128 auto & ex = GraphExport::Create(*thetaNode->output(0),
"x");
130 view(&graph.GetRootRegion(), stdout);
139 view(&graph.GetRootRegion(), stdout);
142 EXPECT_NE(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::GammaNode>(*ex.origin()),
nullptr);
static jlm::util::StatisticsCollector statisticsCollector
TEST(LoopUnswitchingTests, Test1)
static std::shared_ptr< const LoopUnswitchingDefaultHeuristic > create()
static void CreateAndRun(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector, std::shared_ptr< const LoopUnswitchingHeuristic > heuristic)
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)