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);
86TEST(RegionPredicateTraceTests, TraceOutOfTheta)
118 auto bit32 = rvsdg::BitType::Create(32);
121 auto theta0 = rvsdg::ThetaNode::create(&rvsdg.
GetRootRegion());
123 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(rvsdg.
GetRootRegion(), bit32).output(0);
124 auto loopVar0 = theta0->AddLoopVar(undef0);
127 auto theta1 = rvsdg::ThetaNode::create(theta0->subregion());
129 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(*theta0->subregion(), bit32).output(0);
130 auto loopVar1 = theta1->AddLoopVar(undef1);
131 auto & int3Output = rvsdg::BitConstantOperation::create(*theta1->subregion(), { 32, 3 });
132 loopVar1.post->divert_to(&int3Output);
135 auto theta2 = rvsdg::ThetaNode::create(theta0->subregion());
136 auto loopVar2 = theta2->AddLoopVar(loopVar1.output);
139 auto theta3 = rvsdg::ThetaNode::create(theta0->subregion());
141 rvsdg::CreateOpNode<rvsdg::TestNullaryOperation>(*theta0->subregion(), bit32).output(0);
142 auto loopVar3 = theta3->AddLoopVar(undef3);
145 auto theta4 = rvsdg::ThetaNode::create(theta3->subregion());
146 auto loopVar4 = theta4->AddLoopVar(loopVar3.pre);
147 auto & int7Output = rvsdg::BitConstantOperation::create(*theta4->subregion(), { 32, 7 });
148 loopVar4.post->divert_to(&int7Output);
149 loopVar3.post->divert_to(loopVar4.output);
152 auto & addOutput = *rvsdg::bitadd_op::create(32, loopVar2.output, loopVar3.output);
153 loopVar0.post->divert_to(&addOutput);
155 rvsdg::GraphExport::Create(*loopVar0.output,
"x");
194TEST(RegionPredicateTraceTests, TraceIntoGamma)
223 auto controlType = rvsdg::ControlType::Create(2);
226 auto & outerCtrl0 = rvsdg::ControlConstantOperation::createFalse(rvsdg.
GetRootRegion());
227 auto & gamma0 = *rvsdg::GammaNode::create(&outerCtrl0, 2);
230 auto & leftCtrl0 = rvsdg::ControlConstantOperation::createFalse(*gamma0.subregion(0));
231 auto & leftCtrl1 = rvsdg::ControlConstantOperation::createTrue(*gamma0.subregion(0));
233 auto & gamma1 = *rvsdg::GammaNode::create(&leftCtrl0, 2);
234 auto gamma1Entry0 = gamma1.AddEntryVar(&leftCtrl0);
235 auto gamma1Entry1 = gamma1.AddEntryVar(&leftCtrl1);
237 gamma1.AddExitVar({ gamma1Entry0.branchArgument[0], gamma1Entry1.branchArgument[1] });
240 auto & rightCtrl1 = rvsdg::ControlConstantOperation::createTrue(*gamma0.subregion(1));
242 auto gamma0Exit = gamma0.AddExitVar({ gamma1Exit.output, &rightCtrl1 });
244 auto & gamma2 = *rvsdg::GammaNode::create(gamma0Exit.output, 2);