17TEST(OutputTests, TestOutputIterator)
22 auto valueType = TestType::createValueType();
26 auto i0 = &GraphImport::Create(rvsdg, valueType,
"i");
27 auto i1 = &GraphImport::Create(rvsdg, valueType,
"i");
28 auto i2 = &GraphImport::Create(rvsdg, valueType,
"i");
30 auto & node = CreateOpNode<TestOperation>(
32 std::vector<std::shared_ptr<const Type>>(),
33 std::vector<std::shared_ptr<const Type>>(5, valueType));
35 GraphExport::Create(*node.output(0),
"x0");
39 EXPECT_EQ(nodeIt.GetOutput(), node.output(0));
40 EXPECT_EQ(nodeIt->index(), node.output(0)->index());
41 EXPECT_EQ((*nodeIt).index(), node.output(0)->index());
46 EXPECT_EQ(nodeIt.GetOutput(), node.output(1));
49 EXPECT_EQ(nodeIt.GetOutput(), node.output(2));
53 EXPECT_EQ(nodeIt.GetOutput(), node.output(4));
56 EXPECT_EQ(nodeIt.GetOutput(),
nullptr);
59 EXPECT_EQ(regionIt.GetOutput(), i0);
60 EXPECT_EQ(regionIt->index(), i0->index());
61 EXPECT_EQ((*regionIt).index(), i0->index());
67 EXPECT_EQ(regionIt.GetOutput(), i2);
70 EXPECT_EQ(regionIt.GetOutput(),
nullptr);
75 EXPECT_EQ(it.GetInput(),
nullptr);
78TEST(OutputTests, RouteToRegion_Gamma)
83 const auto controlType = ControlType::Create(2);
84 const auto valueType = TestType::createValueType();
87 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
88 auto & i1 = GraphImport::Create(rvsdg, controlType,
"i1");
90 const auto gammaNode = GammaNode::create(&i1, 2);
93 const auto & output = RouteToRegion(i0, *gammaNode->subregion(1));
96 EXPECT_EQ(output.region(), gammaNode->subregion(1));
97 EXPECT_EQ(gammaNode->GetEntryVars().size(), 1u);
98 EXPECT_EQ(gammaNode->GetExitVars().size(), 0u);
101TEST(OutputTests, RouteToRegion_Theta)
106 const auto valueType = TestType::createValueType();
109 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
111 const auto thetaNode = ThetaNode::create(&rvsdg.
GetRootRegion());
114 const auto & output = RouteToRegion(i0, *thetaNode->subregion());
117 EXPECT_EQ(output.region(), thetaNode->subregion());
118 EXPECT_EQ(thetaNode->GetLoopVars().size(), 1u);
119 EXPECT_EQ(&output, thetaNode->GetLoopVars()[0].pre);
122TEST(OutputTests, RouteToRegion_Lambda)
127 auto valueType = TestType::createValueType();
128 auto functionType = FunctionType::Create({ valueType }, { valueType });
131 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
133 const auto lambdaNode =
134 LambdaNode::Create(rvsdg.GetRootRegion(), std::make_unique<LambdaOperation>(functionType));
137 const auto & output = RouteToRegion(i0, *lambdaNode->subregion());
140 EXPECT_EQ(output.region(), lambdaNode->subregion());
141 EXPECT_EQ(lambdaNode->GetContextVars().size(), 1u);
142 EXPECT_EQ(&output, lambdaNode->GetContextVars()[0].inner);
145TEST(OutputTests, RouteToRegion_Phi)
150 auto valueType = TestType::createValueType();
153 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
157 auto phiNode = phiBuilder.
end();
160 const auto & output = RouteToRegion(i0, *phiNode->subregion());
163 EXPECT_EQ(output.region(), phiNode->subregion());
164 EXPECT_EQ(phiNode->GetContextVars().size(), 1u);
165 EXPECT_EQ(&output, phiNode->GetContextVars()[0].inner);
168TEST(OutputTests, RouteToRegion_Delta)
173 auto valueType = TestType::createValueType();
176 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
178 auto deltaNode = DeltaNode::Create(
180 std::make_unique<DeltaOperation>(valueType,
true, valueType));
183 const auto & output = RouteToRegion(i0, *deltaNode->subregion());
186 EXPECT_EQ(output.region(), deltaNode->subregion());
187 EXPECT_EQ(deltaNode->GetContextVars().size(), 1u);
188 EXPECT_EQ(&output, deltaNode->GetContextVars()[0].inner);
191TEST(OutputTests, RouteToRegion_Nesting)
196 const auto controlType = ControlType::Create(2);
197 auto valueType = TestType::createValueType();
198 auto functionType = FunctionType::Create({ valueType }, { valueType });
201 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
203 const auto lambdaNode =
204 LambdaNode::Create(rvsdg.GetRootRegion(), std::make_unique<LambdaOperation>(functionType));
206 const auto controlConstant = &ControlConstantOperation::create(*lambdaNode->subregion(), 2, 0);
207 const auto gammaNode = GammaNode::create(controlConstant, 2);
210 const auto & output = RouteToRegion(i0, *gammaNode->subregion(0));
213 EXPECT_EQ(output.region(), gammaNode->subregion(0));
214 EXPECT_EQ(gammaNode->GetEntryVars().size(), 1u);
215 EXPECT_EQ(gammaNode->GetExitVars().size(), 0u);
216 EXPECT_EQ(&output, gammaNode->GetEntryVars()[0].branchArgument[0]);
218 auto origin = gammaNode->GetEntryVars()[0].input->origin();
219 EXPECT_EQ(lambdaNode->GetContextVars().size(), 1u);
220 EXPECT_EQ(origin, lambdaNode->GetContextVars()[0].inner);
223TEST(OutputTests, RouteToRegion_Failure)
228 const auto controlType = ControlType::Create(2);
229 const auto valueType = TestType::createValueType();
232 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
233 auto & i1 = GraphImport::Create(rvsdg, controlType,
"i1");
235 const auto gammaNode = GammaNode::create(&i1, 2);
236 auto entryVar = gammaNode->AddEntryVar(&i0);
240 RouteToRegion(*entryVar.branchArgument[0], *gammaNode->subregion(1)),
244TEST(OutputTests, DivertUsersWhere)
249 const auto valueType = TestType::createValueType();
252 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
253 auto & i1 = GraphImport::Create(rvsdg, valueType,
"i1");
255 auto & x0 = GraphExport::Create(i0,
"x0");
256 auto & x1 = GraphExport::Create(i0,
"x1");
257 auto & x2 = GraphExport::Create(i0,
"x2");
258 auto & x3 = GraphExport::Create(i0,
"x3");
263 auto numDivertedUsers = i0.divertUsersWhere(
269 EXPECT_EQ(numDivertedUsers, 0u);
270 EXPECT_EQ(i0.nusers(), 4u);
273 numDivertedUsers = i0.divertUsersWhere(
275 [&x0](
const Input & user)
279 EXPECT_EQ(numDivertedUsers, 1u);
280 EXPECT_EQ(i0.nusers(), 3u);
281 EXPECT_EQ(x0.origin(), &i1);
284 numDivertedUsers = i0.divertUsersWhere(
286 [&x0](
const Input & user)
290 EXPECT_EQ(numDivertedUsers, 0u);
291 EXPECT_EQ(i0.nusers(), 3u);
294 numDivertedUsers = i0.divertUsersWhere(
296 [&x1, &x2](
const Input & user)
298 return &user == &x1 || &user == &x2;
300 EXPECT_EQ(numDivertedUsers, 2u);
301 EXPECT_EQ(i0.nusers(), 1u);
302 EXPECT_EQ(x1.origin(), &i1);
303 EXPECT_EQ(x2.origin(), &i1);
306 numDivertedUsers = i0.divertUsersWhere(
308 [&x3](
const Input & user)
312 EXPECT_EQ(numDivertedUsers, 1u);
313 EXPECT_EQ(i0.nusers(), 0u);
314 EXPECT_EQ(x3.origin(), &i1);