21TEST(RegionPredicateTraceTests, TestTracing)
25 auto valueType = rvsdg::TestType::createValueType();
26 auto ctl2 = rvsdg::ControlType::Create(2);
29 auto & pred1 = rvsdg::GraphImport::Create(rvsdg, ctl2,
"pred1");
30 auto & pred2 = rvsdg::GraphImport::Create(rvsdg, ctl2,
"pred2");
33 auto gamma1 = rvsdg::GammaNode::create(&pred1, 2);
34 auto g1_left = gamma1->subregion(0);
35 auto g1_right = gamma1->subregion(1);
36 auto & g1_p0 = rvsdg::ControlConstantOperation::createTrue(*g1_left);
37 auto & g1_p1 = rvsdg::ControlConstantOperation::createFalse(*g1_right);
38 auto pred3 = gamma1->AddExitVar({ &g1_p0, &g1_p1 }).output;
41 auto gamma2 = rvsdg::GammaNode::create(pred3, 2);
42 auto g2_left = gamma2->subregion(0);
43 auto g2_right = gamma2->subregion(1);
44 auto r0 = rvsdg::TestOperation::createNode(g2_left, {}, { valueType });
45 auto r1 = rvsdg::TestOperation::createNode(g2_right, {}, { valueType });
46 auto r = gamma2->AddExitVar({ r0->output(0), r1->output(0) }).output;
47 rvsdg::GraphExport::Create(*r,
"result1");
50 auto gamma3 = rvsdg::GammaNode::create(&pred2, 2);
51 auto g3_left = gamma3->subregion(0);
52 auto g3_right = gamma3->subregion(1);
53 auto s0 = rvsdg::TestOperation::createNode(g3_left, {}, { valueType });
54 auto s1 = rvsdg::TestOperation::createNode(g3_right, {}, { valueType });
55 auto s = gamma3->AddExitVar({ s0->output(0), s1->output(0) }).output;
56 rvsdg::GraphExport::Create(*s,
"result2");
73 gamma2->predicate()->divert_to(&pred2);
87TEST(RegionPredicateTraceTests, TraceOutOfTheta)
119 auto bit32 = rvsdg::BitType::Create(32);
122 auto theta0 = rvsdg::ThetaNode::create(&rvsdg.
GetRootRegion());
124 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(rvsdg.
GetRootRegion(), bit32).output(0);
125 auto loopVar0 = theta0->AddLoopVar(undef0);
128 auto theta1 = rvsdg::ThetaNode::create(theta0->subregion());
130 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(*theta0->subregion(), bit32).output(0);
131 auto loopVar1 = theta1->AddLoopVar(undef1);
132 auto & int3Output = rvsdg::BitConstantOperation::create(*theta1->subregion(), { 32, 3 });
133 loopVar1.post->divert_to(&int3Output);
136 auto theta2 = rvsdg::ThetaNode::create(theta0->subregion());
137 auto loopVar2 = theta2->AddLoopVar(loopVar1.output);
140 auto theta3 = rvsdg::ThetaNode::create(theta0->subregion());
142 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(*theta0->subregion(), bit32).output(0);
143 auto loopVar3 = theta3->AddLoopVar(undef3);
146 auto theta4 = rvsdg::ThetaNode::create(theta3->subregion());
147 auto loopVar4 = theta4->AddLoopVar(loopVar3.pre);
148 auto & int7Output = rvsdg::BitConstantOperation::create(*theta4->subregion(), { 32, 7 });
149 loopVar4.post->divert_to(&int7Output);
150 loopVar3.post->divert_to(loopVar4.output);
153 auto & addOutput = *rvsdg::bitadd_op::create(32, loopVar2.output, loopVar3.output);
154 loopVar0.post->divert_to(&addOutput);
156 rvsdg::GraphExport::Create(*loopVar0.output,
"x");
195TEST(RegionPredicateTraceTests, TraceIntoGamma)
224 auto controlType = rvsdg::ControlType::Create(2);
227 auto & outerCtrl0 = rvsdg::ControlConstantOperation::createFalse(rvsdg.
GetRootRegion());
228 auto & gamma0 = *rvsdg::GammaNode::create(&outerCtrl0, 2);
231 auto & leftCtrl0 = rvsdg::ControlConstantOperation::createFalse(*gamma0.subregion(0));
232 auto & leftCtrl1 = rvsdg::ControlConstantOperation::createTrue(*gamma0.subregion(0));
234 auto & gamma1 = *rvsdg::GammaNode::create(&leftCtrl0, 2);
235 auto gamma1Entry0 = gamma1.AddEntryVar(&leftCtrl0);
236 auto gamma1Entry1 = gamma1.AddEntryVar(&leftCtrl1);
238 gamma1.AddExitVar({ gamma1Entry0.branchArgument[0], gamma1Entry1.branchArgument[1] });
241 auto & rightCtrl1 = rvsdg::ControlConstantOperation::createTrue(*gamma0.subregion(1));
243 auto gamma0Exit = gamma0.AddExitVar({ gamma1Exit.output, &rightCtrl1 });
245 auto & gamma2 = *rvsdg::GammaNode::create(gamma0Exit.output, 2);
263TEST(RegionPredicateTraceTests, TraceThroughGammas)
293 auto controlType2 = rvsdg::ControlType::Create(2);
294 auto controlType3 = rvsdg::ControlType::Create(3);
300 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(rvsdg.
GetRootRegion(), controlType2);
301 auto & gamma0 = *rvsdg::GammaNode::create(testOp0.output(0), 2);
302 auto & gamma0Ctrl0 = rvsdg::ControlConstantOperation::create(*gamma0.subregion(0), { 0, 3 });
303 auto & gamma0Ctrl1 = rvsdg::ControlConstantOperation::create(*gamma0.subregion(1), { 1, 3 });
304 auto gamma0ExitVar = gamma0.AddExitVar({ &gamma0Ctrl0, &gamma0Ctrl1 });
308 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(rvsdg.
GetRootRegion(), controlType2);
309 auto & gamma1 = *rvsdg::GammaNode::create(testOp1.output(0), 2);
310 auto gamma1EntryFromGamma0 = gamma1.AddEntryVar(gamma0ExitVar.output);
311 auto & gamma1Ctrl1 = rvsdg::ControlConstantOperation::create(rvsdg.
GetRootRegion(), { 1, 3 });
312 auto gamma1EntryFromCtrl1 = gamma1.AddEntryVar(&gamma1Ctrl1);
313 auto gamma1ExitVar = gamma1.AddExitVar(
314 { gamma1EntryFromGamma0.branchArgument[0], gamma1EntryFromCtrl1.branchArgument[1] });
317 auto & gamma2 = *rvsdg::GammaNode::create(gamma1ExitVar.output, 3);