29TEST(CommonNodeEliminationTests, test_simple)
34 auto vt = TestType::createValueType();
37 auto & graph = rvsdgModule.
Rvsdg();
39 auto x = &GraphImport::Create(graph,
vt,
"x");
40 auto y = &GraphImport::Create(graph,
vt,
"y");
41 auto z = &GraphImport::Create(graph,
vt,
"z");
43 auto n1 = TestOperation::createNode(&graph.GetRootRegion(), {}, { vt })->output(0);
44 auto n2 = TestOperation::createNode(&graph.GetRootRegion(), {}, { vt })->output(0);
46 auto u1 = TestOperation::createNode(&graph.GetRootRegion(), { z }, { vt })->output(0);
48 auto b1 = TestOperation::createNode(&graph.GetRootRegion(), { x, y }, { vt })->output(0);
49 auto b2 = TestOperation::createNode(&graph.GetRootRegion(), { x, y }, { vt })->output(0);
50 auto b3 = TestOperation::createNode(&graph.GetRootRegion(), { n1, z }, { vt })->output(0);
51 auto b4 = TestOperation::createNode(&graph.GetRootRegion(), { n2, z }, { vt })->output(0);
53 GraphExport::Create(*n1,
"n1");
54 GraphExport::Create(*n2,
"n2");
55 GraphExport::Create(*u1,
"u1");
56 GraphExport::Create(*b1,
"b1");
57 GraphExport::Create(*b2,
"b2");
58 GraphExport::Create(*b3,
"b3");
59 GraphExport::Create(*b4,
"b4");
69 EXPECT_EQ(graph.GetRootRegion().result(0)->origin(), graph.GetRootRegion().result(1)->origin());
70 EXPECT_EQ(graph.GetRootRegion().result(3)->origin(), graph.GetRootRegion().result(4)->origin());
71 EXPECT_EQ(graph.GetRootRegion().result(5)->origin(), graph.GetRootRegion().result(6)->origin());
74TEST(CommonNodeEliminationTests, test_gamma)
79 auto vt = TestType::createValueType();
80 auto ct = ControlType::Create(2);
83 auto & graph = rvsdgModule.
Rvsdg();
85 auto c = &GraphImport::Create(graph, ct,
"c");
86 auto ix = &GraphImport::Create(graph,
vt,
"x");
87 auto iy = &GraphImport::Create(graph,
vt,
"y");
88 auto iz = &GraphImport::Create(graph,
vt,
"z");
90 auto u1 = TestOperation::createNode(&graph.GetRootRegion(), { ix }, { vt })->output(0);
91 auto u2 = TestOperation::createNode(&graph.GetRootRegion(), { ix }, { vt })->output(0);
93 auto gamma = GammaNode::create(c, 2);
95 auto ev1 = gamma->AddEntryVar(u1);
96 auto ev2 = gamma->AddEntryVar(u2);
97 auto ev3 = gamma->AddEntryVar(iy);
98 auto ev4 = gamma->AddEntryVar(iz);
99 auto ev5 = gamma->AddEntryVar(iz);
101 auto n1 = TestOperation::createNode(gamma->subregion(0), {}, { vt })->output(0);
102 auto n2 = TestOperation::createNode(gamma->subregion(0), {}, { vt })->output(0);
103 auto n3 = TestOperation::createNode(gamma->subregion(0), {}, { vt })->output(0);
105 gamma->AddExitVar({ ev1.branchArgument[0], ev1.branchArgument[1] });
106 gamma->AddExitVar({ ev2.branchArgument[0], ev2.branchArgument[1] });
107 gamma->AddExitVar({ ev3.branchArgument[0], ev3.branchArgument[1] });
108 gamma->AddExitVar({ n1, ev3.branchArgument[1] });
109 gamma->AddExitVar({ n2, ev3.branchArgument[1] });
110 gamma->AddExitVar({ n3, ev3.branchArgument[1] });
111 gamma->AddExitVar({ ev5.branchArgument[0], ev4.branchArgument[1] });
113 auto & ex1 = GraphExport::Create(*gamma->output(0),
"x1");
114 auto & ex2 = GraphExport::Create(*gamma->output(1),
"x2");
115 auto & ex3 = GraphExport::Create(*gamma->output(2),
"x3");
126 EXPECT_FALSE(Region::containsNodeType<GammaNode>(graph.GetRootRegion(),
false));
128 EXPECT_TRUE(graph.GetRootRegion().numNodes() == 1);
129 auto & node = *graph.GetRootRegion().Nodes().begin();
131 EXPECT_EQ(ex1.origin(), node.output(0));
132 EXPECT_EQ(ex2.origin(), node.output(0));
133 EXPECT_EQ(ex3.origin(), iy);
136TEST(CommonNodeEliminationTests, test_gamma_congruent_exit_vars)
164 auto vt = TestType::createValueType();
165 auto ct = ControlType::Create(2);
168 auto & graph = rvsdgModule.
Rvsdg();
170 auto importPredicate = &GraphImport::Create(graph, ct,
"c");
171 auto importA = &GraphImport::Create(graph,
vt,
"a");
172 auto importB = &GraphImport::Create(graph,
vt,
"b");
174 auto gamma = GammaNode::create(importPredicate, 2);
176 auto entryVarA = gamma->AddEntryVar(importA);
177 auto entryVarB = gamma->AddEntryVar(importB);
180 auto exitVarA = gamma->AddExitVar({ entryVarA.branchArgument[0], entryVarA.branchArgument[1] });
181 auto exitVarB = gamma->AddExitVar({ entryVarB.branchArgument[0], entryVarB.branchArgument[1] });
184 auto exitVarX = gamma->AddExitVar({ entryVarA.branchArgument[0], entryVarB.branchArgument[1] });
185 auto exitVarY = gamma->AddExitVar({ entryVarA.branchArgument[0], entryVarB.branchArgument[1] });
186 auto exitVarZ = gamma->AddExitVar({ entryVarB.branchArgument[0], entryVarA.branchArgument[1] });
188 auto & exportA = GraphExport::Create(*exitVarA.output,
"a2");
189 auto & exportB = GraphExport::Create(*exitVarB.output,
"b2");
190 auto & exportX = GraphExport::Create(*exitVarX.output,
"x");
191 auto & exportY = GraphExport::Create(*exitVarY.output,
"y");
192 auto & exportZ = GraphExport::Create(*exitVarZ.output,
"z");
201 EXPECT_EQ(exportA.origin(), importA);
202 EXPECT_EQ(exportB.origin(), importB);
205 EXPECT_EQ(exportX.origin(), exitVarX.output);
206 EXPECT_EQ(exportY.origin(), exitVarX.output);
207 EXPECT_EQ(exitVarY.output->nusers(), 0u);
210 EXPECT_EQ(exportZ.origin(), exitVarZ.output);
213TEST(CommonNodeEliminationTests, test_theta)
218 auto vt = TestType::createValueType();
219 auto ct = ControlType::Create(2);
222 auto & graph = rvsdgModule.
Rvsdg();
224 auto c = &GraphImport::Create(graph, ct,
"c");
225 auto x = &GraphImport::Create(graph,
vt,
"x");
227 auto theta = ThetaNode::create(&graph.GetRootRegion());
228 auto region = theta->subregion();
230 auto lv1 = theta->AddLoopVar(c);
231 auto lv2 = theta->AddLoopVar(x);
232 auto lv3 = theta->AddLoopVar(x);
233 auto lv4 = theta->AddLoopVar(x);
235 auto u1 = TestOperation::createNode(region, { lv2.pre }, {
vt })->output(0);
236 auto u2 = TestOperation::createNode(region, { lv3.pre }, {
vt })->output(0);
237 auto b1 = TestOperation::createNode(region, { lv3.pre, lv4.pre }, {
vt })->output(0);
239 lv2.post->divert_to(u1);
240 lv3.post->divert_to(u2);
241 lv4.post->divert_to(b1);
243 theta->set_predicate(lv1.pre);
245 auto & elv2 = GraphExport::Create(*lv2.output,
"lv2");
246 auto & elv3 = GraphExport::Create(*lv3.output,
"lv3");
247 auto & elv4 = GraphExport::Create(*lv4.output,
"lv4");
257 EXPECT_EQ(lv2.post->origin(), lv3.post->origin());
258 EXPECT_EQ(lv4.post->origin(), lv4.post->origin());
259 EXPECT_EQ(elv2.origin(), elv3.origin());
260 EXPECT_EQ(elv4.origin(), lv4.output);
263TEST(CommonNodeEliminationTests, test_theta2)
267 auto vt = TestType::createValueType();
268 auto ct = ControlType::Create(2);
271 auto & graph = rvsdgModule.
Rvsdg();
273 auto c = &GraphImport::Create(graph, ct,
"c");
274 auto x = &GraphImport::Create(graph,
vt,
"x");
276 auto theta = ThetaNode::create(&graph.GetRootRegion());
277 auto region = theta->subregion();
279 auto lv1 = theta->AddLoopVar(c);
280 auto lv2 = theta->AddLoopVar(x);
281 auto lv3 = theta->AddLoopVar(x);
283 auto u1 = TestOperation::createNode(region, { lv2.pre }, {
vt })->output(0);
284 auto u2 = TestOperation::createNode(region, { lv3.pre }, {
vt })->output(0);
285 auto b1 = TestOperation::createNode(region, { u2, u2 }, {
vt })->output(0);
287 lv2.post->divert_to(u1);
288 lv3.post->divert_to(b1);
290 theta->set_predicate(lv1.pre);
292 GraphExport::Create(*lv2.output,
"lv2");
293 GraphExport::Create(*lv3.output,
"lv3");
303 EXPECT_EQ(lv2.post->origin(), u1);
304 EXPECT_NE(lv2.pre->nusers(), 0u);
305 EXPECT_NE(lv3.pre->nusers(), 0u);
308TEST(CommonNodeEliminationTests, test_theta3)
312 auto vt = TestType::createValueType();
313 auto ct = ControlType::Create(2);
316 auto & graph = rvsdgModule.
Rvsdg();
318 auto c = &GraphImport::Create(graph, ct,
"c");
319 auto x = &GraphImport::Create(graph,
vt,
"x");
321 auto theta1 = ThetaNode::create(&graph.GetRootRegion());
322 auto r1 = theta1->subregion();
324 auto lv1 = theta1->AddLoopVar(c);
325 auto lv2 = theta1->AddLoopVar(x);
326 auto lv3 = theta1->AddLoopVar(x);
327 auto lv4 = theta1->AddLoopVar(x);
329 auto theta2 = ThetaNode::create(r1);
330 auto p1 = theta2->AddLoopVar(lv1.pre);
331 auto p2 = theta2->AddLoopVar(lv2.pre);
332 auto p3 = theta2->AddLoopVar(lv3.pre);
333 auto p4 = theta2->AddLoopVar(lv4.pre);
334 theta2->set_predicate(p1.pre);
336 auto u1 = TestOperation::createNode(r1, { p2.output }, {
vt });
337 auto b1 = TestOperation::createNode(r1, { p3.output, p3.output }, {
vt });
338 TestOperation::createNode(r1, { p4.output }, {
vt });
340 lv2.post->divert_to(u1->output(0));
341 lv3.post->divert_to(b1->output(0));
342 lv4.post->divert_to(u1->output(0));
344 theta1->set_predicate(lv1.pre);
346 auto & elv2 = GraphExport::Create(*lv2.output,
"lv2");
347 auto & elv3 = GraphExport::Create(*lv3.output,
"lv3");
348 auto & elv4 = GraphExport::Create(*lv4.output,
"lv4");
358 EXPECT_EQ(elv2.origin(), lv2.output);
359 EXPECT_EQ(elv3.origin(), lv3.output);
360 EXPECT_EQ(elv4.origin(), lv2.output);
362 EXPECT_EQ(lv1.post->origin(), lv1.pre);
363 EXPECT_EQ(lv2.post->origin(), u1->output(0));
364 EXPECT_EQ(lv3.post->origin(), b1->output(0));
365 EXPECT_EQ(lv4.post->origin(), u1->output(0));
368 EXPECT_FALSE(Region::containsNodeType<rvsdg::ThetaNode>(*theta1->subregion(),
false));
370 EXPECT_EQ(u1->input(0)->origin(), lv2.pre);
371 EXPECT_EQ(b1->input(0)->origin(), lv3.pre);
372 EXPECT_EQ(b1->input(1)->origin(), lv3.pre);
373 EXPECT_EQ(lv4.pre->nusers(), 0u);
375 EXPECT_EQ(lv1.input->origin(), c);
376 EXPECT_EQ(lv2.input->origin(), x);
377 EXPECT_EQ(lv3.input->origin(), x);
378 EXPECT_EQ(lv4.input->origin(), x);
381TEST(CommonNodeEliminationTests, test_theta4)
386 auto vt = TestType::createValueType();
387 auto ct = ControlType::Create(2);
390 auto & graph = rvsdgModule.
Rvsdg();
392 auto c = &GraphImport::Create(graph, ct,
"c");
393 auto x = &GraphImport::Create(graph,
vt,
"x");
394 auto y = &GraphImport::Create(graph,
vt,
"y");
396 auto theta = ThetaNode::create(&graph.GetRootRegion());
397 auto region = theta->subregion();
399 auto lv1 = theta->AddLoopVar(c);
400 auto lv2 = theta->AddLoopVar(x);
401 auto lv3 = theta->AddLoopVar(x);
402 auto lv4 = theta->AddLoopVar(y);
403 auto lv5 = theta->AddLoopVar(y);
404 auto lv6 = theta->AddLoopVar(x);
405 auto lv7 = theta->AddLoopVar(x);
407 auto u1 = TestOperation::createNode(region, { lv2.pre }, {
vt });
408 auto b1 = TestOperation::createNode(region, { lv3.pre, lv3.pre }, {
vt });
410 lv2.post->divert_to(lv4.pre);
411 lv3.post->divert_to(lv5.pre);
412 lv4.post->divert_to(u1->output(0));
413 lv5.post->divert_to(b1->output(0));
415 theta->set_predicate(lv1.pre);
417 auto & ex1 = GraphExport::Create(*theta->output(1),
"lv2");
418 auto & ex2 = GraphExport::Create(*theta->output(2),
"lv3");
419 GraphExport::Create(*theta->output(3),
"lv4");
420 GraphExport::Create(*theta->output(4),
"lv5");
430 EXPECT_NE(ex1.origin(), ex2.origin());
431 EXPECT_NE(lv2.pre->nusers(), 0u);
432 EXPECT_NE(lv3.pre->nusers(), 0u);
433 EXPECT_EQ(lv6.post->origin(), lv7.post->origin());
436TEST(CommonNodeEliminationTests, test_theta5)
441 auto vt = TestType::createValueType();
442 auto ct = ControlType::Create(2);
445 auto & graph = rvsdgModule.
Rvsdg();
447 auto c = &GraphImport::Create(graph, ct,
"c");
448 auto x = &GraphImport::Create(graph,
vt,
"x");
449 auto y = &GraphImport::Create(graph,
vt,
"y");
451 auto theta = ThetaNode::create(&graph.GetRootRegion());
452 auto lv0 = theta->AddLoopVar(c);
453 auto lv1 = theta->AddLoopVar(x);
454 auto lv2 = theta->AddLoopVar(x);
455 auto lv3 = theta->AddLoopVar(y);
456 auto lv4 = theta->AddLoopVar(y);
458 lv1.post->divert_to(lv3.pre);
459 lv2.post->divert_to(lv4.pre);
461 theta->set_predicate(lv0.pre);
463 auto & ex1 = GraphExport::Create(*theta->output(1),
"lv1");
464 auto & ex2 = GraphExport::Create(*theta->output(2),
"lv2");
465 auto & ex3 = GraphExport::Create(*theta->output(3),
"lv3");
466 auto & ex4 = GraphExport::Create(*theta->output(4),
"lv4");
477 EXPECT_FALSE(Region::containsNodeType<rvsdg::ThetaNode>(graph.GetRootRegion(),
true));
479 EXPECT_EQ(ex1.origin(), y);
480 EXPECT_EQ(ex1.origin(), ex2.origin());
481 EXPECT_EQ(ex2.origin(), ex3.origin());
482 EXPECT_EQ(ex3.origin(), ex4.origin());
485TEST(CommonNodeEliminationTests, MultipleThetas)
490 const auto valueType = TestType::createValueType();
493 auto & rvsdg = rvsdgModule.
Rvsdg();
495 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
498 auto thetaNode1 = ThetaNode::create(&rvsdg.GetRootRegion());
499 auto loopVariable1 = thetaNode1->AddLoopVar(&i0);
501 TestOperation::createNode(thetaNode1->subregion(), { loopVariable1.pre }, { valueType });
502 loopVariable1.post->divert_to(node1->output(0));
505 auto thetaNode2 = ThetaNode::create(&rvsdg.GetRootRegion());
506 auto predicate = &ControlConstantOperation::create(*thetaNode2->subregion(), 2, 1);
507 thetaNode2->set_predicate(predicate);
508 auto loopVariable2 = thetaNode2->AddLoopVar(&i0);
510 TestOperation::createNode(thetaNode1->subregion(), { loopVariable2.pre }, { valueType });
511 loopVariable2.post->divert_to(node2->output(0));
514 auto thetaNode3 = ThetaNode::create(&rvsdg.GetRootRegion());
515 auto loopVariable3 = thetaNode3->AddLoopVar(loopVariable1.output);
516 auto loopVariable4 = thetaNode3->AddLoopVar(loopVariable2.output);
518 auto & x1 = GraphExport::Create(*loopVariable3.output,
"x1");
519 auto & x2 = GraphExport::Create(*loopVariable4.output,
"x2");
532 EXPECT_NE(x1.origin(), x2.origin());
535TEST(CommonNodeEliminationTests, MultipleThetasPassthrough)
540 const auto valueType = TestType::createValueType();
543 auto & rvsdg = rvsdgModule.
Rvsdg();
545 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
548 auto thetaNode1 = ThetaNode::create(&rvsdg.GetRootRegion());
549 auto loopVariable1 = thetaNode1->AddLoopVar(&i0);
552 auto thetaNode2 = ThetaNode::create(&rvsdg.GetRootRegion());
553 auto predicate = &ControlConstantOperation::create(*thetaNode2->subregion(), 2, 1);
554 thetaNode2->set_predicate(predicate);
555 auto loopVariable2 = thetaNode2->AddLoopVar(&i0);
558 auto thetaNode3 = ThetaNode::create(&rvsdg.GetRootRegion());
559 auto loopVariable3 = thetaNode3->AddLoopVar(loopVariable1.output);
560 auto loopVariable4 = thetaNode3->AddLoopVar(loopVariable2.output);
562 auto & x1 = GraphExport::Create(*loopVariable3.output,
"x1");
563 auto & x2 = GraphExport::Create(*loopVariable4.output,
"x2");
577 EXPECT_EQ(x1.origin(), x2.origin());
580TEST(CommonNodeEliminationTests, test_lambda)
585 auto vt = TestType::createValueType();
586 auto ft = FunctionType::Create({
vt,
vt }, {
vt });
589 auto & graph = rvsdgModule.Rvsdg();
591 auto x = &GraphImport::Create(graph,
vt,
"x");
593 auto lambda = LambdaNode::Create(
594 graph.GetRootRegion(),
597 auto d1 = lambda->AddContextVar(*x).inner;
598 auto d2 = lambda->AddContextVar(*x).inner;
600 auto b1 = TestOperation::createNode(lambda->subregion(), { d1, d2 }, { vt })->output(0);
602 auto output = lambda->finalize({ b1 });
604 GraphExport::Create(*output,
"f");
615 EXPECT_EQ(bn1->input(0)->origin(), bn1->input(1)->origin());
618TEST(CommonNodeEliminationTests, test_phi)
623 auto vt = TestType::createValueType();
624 auto ft = FunctionType::Create({
vt,
vt }, {
vt });
627 auto & graph = rvsdgModule.Rvsdg();
629 auto & x = GraphImport::Create(graph,
vt,
"x");
632 pb.
begin(&graph.GetRootRegion());
643 auto cv1 = lambda1->AddContextVar(*d1.inner).inner;
644 auto f1 = lambda1->finalize({ cv1 });
648 auto cv2 = lambda2->AddContextVar(*d2.inner).inner;
649 auto f2 = lambda2->finalize({ cv2 });
651 r1.result->divert_to(f1);
652 r2.result->divert_to(f2);
656 GraphExport::Create(*phi->output(0),
"f1");
657 GraphExport::Create(*phi->output(1),
"f2");
672TEST(CommonNodeEliminationTests, EmptyTheta)
677 auto valueType = TestType::createValueType();
678 auto controlType = ControlType::Create(2);
681 auto & rvsdg = rvsdgModule.
Rvsdg();
683 auto & i0 = GraphImport::Create(rvsdg, controlType,
"i0");
685 auto thetaNode = ThetaNode::create(&rvsdg.GetRootRegion());
686 auto lv1 = thetaNode->AddLoopVar(&i0);
688 auto node1 = TestOperation::createNode(thetaNode->subregion(), {}, { valueType });
690 TestOperation::createNode(thetaNode->subregion(), { node1->output(0) }, { valueType });
692 TestOperation::createNode(thetaNode->subregion(), { node1->output(0) }, { valueType });
693 auto node4 = TestOperation::createNode(
694 thetaNode->subregion(),
695 { node2->output(0), node3->output(0) },
698 thetaNode->set_predicate(node4->output(0));
699 lv1.post->divert_to(node4->output(0));
701 GraphExport::Create(*lv1.output,
"e0");
713 EXPECT_EQ(thetaNode->subregion()->numNodes(), 3u);
716TEST(CommonNodeEliminationTests, GammaInTheta)
745 const auto valueType = TestType::createValueType();
748 auto & rvsdg = rvsdgModule.
Rvsdg();
750 auto & constant10 = BitConstantOperation::create(rvsdg.GetRootRegion(), { 32, 10 });
752 auto thetaNode = ThetaNode::create(&rvsdg.GetRootRegion());
753 auto loopVar1 = thetaNode->AddLoopVar(&constant10);
754 auto loopVar2 = thetaNode->AddLoopVar(&constant10);
755 auto & thetaRegion = *thetaNode->subregion();
757 auto & control0 = ControlConstantOperation::create(thetaRegion, 2, 0);
758 auto gammaNode = GammaNode::create(&control0, 2);
759 auto entryVar1 = gammaNode->AddEntryVar(loopVar1.pre);
760 auto entryVar2 = gammaNode->AddEntryVar(loopVar2.pre);
762 gammaNode->AddExitVar({ entryVar1.branchArgument[0], entryVar2.branchArgument[1] }).output;
764 auto user1 = TestOperation::createNode(&thetaRegion, { gammaOutput }, { BitType::Create(32) });
766 auto & constant7 = BitConstantOperation::create(thetaRegion, { 32, 7 });
767 loopVar1.post->divert_to(user1->output(0));
768 loopVar2.post->divert_to(&constant7);
770 GraphExport::Create(*loopVar1.output,
"e0");
777 const auto & user1Origin = *user1->input(0)->origin();
778 EXPECT_EQ(TryGetOwnerNode<GammaNode>(user1Origin), gammaNode);
781TEST(CommonNodeEliminationTests, InvariantThetaInTheta)
836 auto & graph = rvsdgModule.
Rvsdg();
838 auto controlType = ControlType::Create(2);
842 auto & theta0 = *ThetaNode::create(&graph.GetRootRegion());
843 auto loopVarX0 = theta0.AddLoopVar(&zero);
844 auto loopVarY0 = theta0.AddLoopVar(&zero);
848 auto & theta1 = *ThetaNode::create(theta0.subregion());
849 theta1.AddLoopVar(&five);
850 auto loopVarY1 = theta1.AddLoopVar(loopVarY0.pre);
851 auto & predicate1 = ControlConstantOperation::create(*theta1.subregion(), 2, 0);
852 theta1.set_predicate(&predicate1);
856 auto & xPlus1 = *plus1Node.output(0);
860 auto & yPlus2 = *plus2Node.output(0);
864 auto & predicate0 = *MatchOperation::CreateNode(slt, { { 1, 1 } }, 0, 2).output(0);
866 theta0.set_predicate(&predicate0);
867 loopVarX0.post->divert_to(&xPlus1);
868 loopVarY0.post->divert_to(&yPlus2);
870 GraphExport::Create(*loopVarX0.output,
"x");
871 GraphExport::Create(*loopVarY0.output,
"y");
880 EXPECT_FALSE(Region::containsNodeType<rvsdg::ThetaNode>(*theta0.subregion(),
false));
883 EXPECT_EQ(plus1Node.input(0)->origin(), loopVarX0.pre);
884 EXPECT_EQ(plus2Node.input(0)->origin(), loopVarY0.pre);
887TEST(CommonNodeEliminationTests, InvariantLoopOutputs)
923 auto & graph = rvsdgModule.
Rvsdg();
925 const auto bit32 = BitType::Create(32);
930 auto theta = ThetaNode::create(&graph.GetRootRegion());
931 auto region = theta->subregion();
933 auto lvX = theta->AddLoopVar(&undefValue);
934 auto lvY = theta->AddLoopVar(&zero);
935 auto lvZ = theta->AddLoopVar(&undefValue);
937 auto & controlGamma = ControlConstantOperation::create(*region, 2, 0);
938 auto gamma = GammaNode::create(&controlGamma, 2);
940 auto entryY = gamma->AddEntryVar(lvY.pre);
941 auto & exitY = *gamma->AddExitVar({ entryY.branchArgument[0], entryY.branchArgument[1] }).output;
943 lvX.post->divert_to(&exitY);
944 lvY.post->divert_to(&exitY);
945 lvZ.post->divert_to(lvY.pre);
947 auto & exportX = GraphExport::Create(*lvX.output,
"x");
948 auto & exportY = GraphExport::Create(*lvY.output,
"y");
949 auto & exportZ = GraphExport::Create(*lvZ.output,
"z");
956 EXPECT_EQ(exportX.origin(), &zero);
957 EXPECT_EQ(exportY.origin(), &zero);
958 EXPECT_EQ(exportZ.origin(), &zero);