13TEST(GammaTests, test_gamma)
24 auto & matchNode = MatchOperation::CreateNode(*cmp, { { 0, 0 }, { 1, 1 } }, 2, 3);
26 auto gamma = GammaNode::create(matchNode.output(0), 3);
27 auto ev0 = gamma->AddEntryVar(v0);
28 auto ev1 = gamma->AddEntryVar(v1);
29 auto ev2 = gamma->AddEntryVar(v2);
30 gamma->AddExitVar({ ev0.branchArgument[0], ev1.branchArgument[1], ev2.branchArgument[2] });
32 GraphExport::Create(*gamma->output(0),
"dummy");
34 EXPECT_NE(gamma,
nullptr);
41 { matchNode.output(0), v0, v1, v2 });
43 EXPECT_NE(
dynamic_cast<const GammaNode *
>(gamma2),
nullptr);
47 auto gamma3 = GammaNode::create(v3, 2);
48 EXPECT_TRUE(gamma3->GetEntryVars().empty());
49 EXPECT_TRUE(gamma3->GetExitVars().empty());
52TEST(GammaTests, test_predicate_reduction)
64 auto pred = &ControlConstantOperation::create(graph.
GetRootRegion(), 3, 1);
66 auto gamma = GammaNode::create(pred, 3);
67 auto ev0 = gamma->AddEntryVar(v0);
68 auto ev1 = gamma->AddEntryVar(v1);
69 auto ev2 = gamma->AddEntryVar(v2);
70 gamma->AddExitVar({ ev0.branchArgument[0], ev1.branchArgument[1], ev2.branchArgument[2] });
72 auto & r = GraphExport::Create(*gamma->output(0),
"");
77 auto gammaNode = TryGetOwnerNode<GammaNode>(*r.origin());
78 ReduceGammaWithStaticallyKnownPredicate(*gammaNode);
82 EXPECT_EQ(r.origin(), v1);
88TEST(GammaTests, test_invariant_reduction)
94 const auto valueType = TestType::createValueType();
99 const auto gammaNode = GammaNode::create(predicate, 2);
100 auto [input, branchArgument] = gammaNode->AddEntryVar(value);
101 gammaNode->AddExitVar(branchArgument);
103 auto & ex = GraphExport::Create(*gammaNode->output(0),
"");
108 const auto success = ReduceGammaInvariantVariables(*gammaNode);
112 EXPECT_TRUE(success);
113 EXPECT_EQ(ex.origin(), value);
119TEST(GammaTests, test_control_constant_reduction)
128 auto & matchNode = MatchOperation::CreateNode(*x, { { 0, 0 } }, 1, 2);
130 auto gamma = GammaNode::create(matchNode.output(0), 2);
132 auto t = &ControlConstantOperation::createTrue(*gamma->subregion(0));
133 auto f = &ControlConstantOperation::createFalse(*gamma->subregion(1));
135 auto n0 = &ControlConstantOperation::create(*gamma->subregion(0), 3, 0);
136 auto n1 = &ControlConstantOperation::create(*gamma->subregion(1), 3, 1);
138 auto xv1 = gamma->AddExitVar({ t, f });
139 auto xv2 = gamma->AddExitVar({ n0, n1 });
141 auto & ex1 = GraphExport::Create(*xv1.output,
"");
142 auto & ex2 = GraphExport::Create(*xv2.output,
"");
147 auto gammaNode = TryGetOwnerNode<GammaNode>(*ex1.origin());
148 ReduceGammaControlConstant(*gammaNode);
153 auto [matchNode, matchOperation] = TryGetSimpleNodeAndOptionalOp<MatchOperation>(*ex1.origin());
154 EXPECT_TRUE(matchNode && matchOperation);
155 EXPECT_EQ(matchOperation->default_alternative(), 0u);
157 EXPECT_EQ(TryGetOwnerNode<Node>(*ex2.origin()), gamma);
161TEST(GammaTests, test_control_constant_reduction2)
168 auto import = &jlm::rvsdg::GraphImport::Create(graph, BitType::Create(2), "import");
170 auto & matchNode = MatchOperation::CreateNode(*
import, { { 3, 2 }, { 2, 1 }, { 1, 0 } }, 3, 4);
172 auto gamma = GammaNode::create(matchNode.output(0), 4);
174 auto t1 = &ControlConstantOperation::createTrue(*gamma->subregion(0));
175 auto t2 = &ControlConstantOperation::createTrue(*gamma->subregion(1));
176 auto t3 = &ControlConstantOperation::createTrue(*gamma->subregion(2));
177 auto f = &ControlConstantOperation::createFalse(*gamma->subregion(3));
179 auto xv = gamma->AddExitVar({ t1, t2, t3, f });
181 auto & ex = GraphExport::Create(*xv.output,
"");
186 auto gammaNode = TryGetOwnerNode<GammaNode>(*ex.origin());
187 ReduceGammaControlConstant(*gammaNode);
191 auto match = TryGetOwnerNode<SimpleNode>(*ex.origin());
192 EXPECT_TRUE(is<MatchOperation>(match->GetOperation()));
195TEST(GammaTests, TestPruneOutputs)
201 auto vt = TestType::createValueType();
210 auto gammaNode = GammaNode::create(predicate, 2);
211 auto gammaInput0 = gammaNode->AddEntryVar(v0);
212 auto gammaInput1 = gammaNode->AddEntryVar(v1);
213 auto gammaInput2 = gammaNode->AddEntryVar(v2);
214 auto gammaInput3 = gammaNode->AddEntryVar(v3);
216 auto gammaOutput0 = gammaNode->AddExitVar(gammaInput0.branchArgument);
217 gammaNode->AddExitVar(gammaInput1.branchArgument);
218 auto gammaOutput2 = gammaNode->AddExitVar(gammaInput2.branchArgument);
219 gammaNode->AddExitVar(gammaInput3.branchArgument);
221 GraphExport::Create(*gammaOutput0.output,
"");
222 GraphExport::Create(*gammaOutput2.output,
"");
225 gammaNode->PruneExitVars();
228 EXPECT_EQ(gammaNode->noutputs(), 2u);
229 EXPECT_EQ(gammaNode->subregion(0)->nresults(), 2u);
230 EXPECT_EQ(gammaNode->subregion(1)->nresults(), 2u);
232 EXPECT_EQ(gammaOutput0.output->index(), 0u);
233 EXPECT_EQ(gammaNode->GetExitVars()[0].output, gammaOutput0.output);
235 EXPECT_EQ(gammaOutput2.output->index(), 1u);
236 EXPECT_EQ(gammaNode->GetExitVars()[1].output, gammaOutput2.output);
239TEST(GammaTests, TestIsInvariant)
245 auto vt = TestType::createValueType();
252 auto gammaNode = GammaNode::create(predicate, 2);
253 auto gammaInput0 = gammaNode->AddEntryVar(v0);
254 auto gammaInput1 = gammaNode->AddEntryVar(v1);
255 auto gammaInput2 = gammaNode->AddEntryVar(v1);
257 auto gammaOutput0 = gammaNode->AddExitVar(gammaInput0.branchArgument);
259 gammaNode->AddExitVar({ gammaInput1.branchArgument[0], gammaInput2.branchArgument[1] });
261 gammaNode->AddExitVar({ gammaInput0.branchArgument[0], gammaInput2.branchArgument[1] });
264 std::optional<jlm::rvsdg::Output *> invariantOrigin;
266 EXPECT_NE(invariantOrigin,
nullptr);
267 EXPECT_EQ(*invariantOrigin, v0);
270 EXPECT_NE(invariantOrigin,
nullptr);
271 EXPECT_EQ(*invariantOrigin, v1);
274 EXPECT_EQ(invariantOrigin, std::nullopt);