6 #include <gtest/gtest.h>
17 TEST(OutputTests, TestOutputIterator)
30 auto & node = CreateOpNode<TestOperation>(
32 std::vector<std::shared_ptr<const Type>>(),
33 std::vector<std::shared_ptr<const Type>>(5, valueType));
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);
78 TEST(OutputTests, RouteToRegion_Gamma)
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);
101 TEST(OutputTests, RouteToRegion_Theta)
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);
122 TEST(OutputTests, RouteToRegion_Lambda)
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);
145 TEST(OutputTests, RouteToRegion_Phi)
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);
168 TEST(OutputTests, RouteToRegion_Delta)
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);
191 TEST(OutputTests, RouteToRegion_Nesting)
203 const auto lambdaNode =
204 LambdaNode::Create(rvsdg.GetRootRegion(), std::make_unique<LambdaOperation>(functionType));
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);
223 TEST(OutputTests, RouteToRegion_Failure)
236 auto entryVar = gammaNode->AddEntryVar(&i0);
240 RouteToRegion(*entryVar.branchArgument[0], *gammaNode->subregion(1)),
244 TEST(OutputTests, DivertUsersWhere)
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);
TEST(OutputTests, TestOutputIterator)
static Output & create(Region ®ion, ControlValueRepresentation value)
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
static DeltaNode * Create(rvsdg::Region *parent, std::unique_ptr< DeltaOperation > op)
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
static GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
static GraphExport & Create(Output &origin, std::string name)
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Region & GetRootRegion() const noexcept
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
void begin(rvsdg::Region *parent)
static std::shared_ptr< const TestType > createValueType()
static ThetaNode * create(rvsdg::Region *parent)
Output & RouteToRegion(Output &output, Region ®ion)