20TEST(UnusedStateRemovalTests, TestGamma)
28 auto & rvsdg = rvsdgModule->Rvsdg();
37 auto gammaInput1 = gammaNode->AddEntryVar(x);
38 auto gammaInput2 = gammaNode->AddEntryVar(y);
39 auto gammaInput3 = gammaNode->AddEntryVar(z);
40 auto gammaInput4 = gammaNode->AddEntryVar(x);
41 auto gammaInput5 = gammaNode->AddEntryVar(x);
42 auto gammaInput6 = gammaNode->AddEntryVar(x);
43 auto gammaInput7 = gammaNode->AddEntryVar(x);
45 auto gammaOutput1 = gammaNode->AddExitVar(gammaInput1.branchArgument);
47 gammaNode->AddExitVar({ gammaInput2.branchArgument[0], gammaInput3.branchArgument[1] });
49 gammaNode->AddExitVar({ gammaInput4.branchArgument[0], gammaInput5.branchArgument[1] });
51 gammaNode->AddExitVar({ gammaInput6.branchArgument[0], gammaInput6.branchArgument[1] });
53 gammaNode->AddExitVar({ gammaInput6.branchArgument[0], gammaInput7.branchArgument[1] });
66 EXPECT_EQ(gammaNode->ninputs(), 7u);
67 EXPECT_EQ(gammaNode->noutputs(), 4u);
68 EXPECT_EQ(gammaInput2.input->index(), 1u);
69 EXPECT_EQ(gammaOutput2.output->index(), 0u);
76TEST(UnusedStateRemovalTests, TestTheta)
83 auto functionType = FunctionType::Create(
84 { ControlType::Create(2), valueType, valueType, valueType },
88 auto & rvsdg = rvsdgModule->Rvsdg();
95 auto thetaNode = ThetaNode::create(&rvsdg.GetRootRegion());
97 auto loopVarP = thetaNode->AddLoopVar(importP);
98 auto loopVarX = thetaNode->AddLoopVar(importX);
99 auto loopVarY = thetaNode->AddLoopVar(importY);
100 auto loopVarZ = thetaNode->AddLoopVar(importZ);
102 loopVarY.post->divert_to(loopVarZ.pre);
103 loopVarZ.post->divert_to(loopVarY.pre);
104 thetaNode->set_predicate(loopVarP.pre);
106 auto & exportP = GraphExport::Create(*loopVarP.output,
"p");
107 auto & exportX = GraphExport::Create(*loopVarX.output,
"x");
108 auto & exportY = GraphExport::Create(*loopVarY.output,
"y");
109 auto & exportZ = GraphExport::Create(*loopVarZ.output,
"z");
116 EXPECT_EQ(thetaNode->ninputs(), 3u);
117 EXPECT_EQ(thetaNode->noutputs(), 3u);
119 EXPECT_EQ(TryGetOwnerNode<ThetaNode>(*exportP.origin()), thetaNode);
120 EXPECT_EQ(exportX.origin(), importX);
121 EXPECT_EQ(TryGetOwnerNode<ThetaNode>(*exportY.origin()), thetaNode);
122 EXPECT_EQ(TryGetOwnerNode<ThetaNode>(*exportZ.origin()), thetaNode);
125TEST(UnusedStateRemovalTests, TestLambda)
133 { valueType, valueType },
134 { valueType, valueType, valueType, valueType });
137 auto & rvsdg = rvsdgModule->Rvsdg();
142 rvsdg.GetRootRegion(),
143 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
144 auto argument0 = lambdaNode->GetFunctionArguments()[0];
145 auto argument1 = lambdaNode->GetFunctionArguments()[1];
146 auto argument2 = lambdaNode->AddContextVar(*x).inner;
147 auto argument3 = lambdaNode->AddContextVar(*x).inner;
151 std::vector<std::shared_ptr<const Type>>{ valueType },
152 std::vector<std::shared_ptr<const Type>>{ valueType })
157 std::vector<std::shared_ptr<const Type>>{ valueType },
158 std::vector<std::shared_ptr<const Type>>{ valueType })
161 auto lambdaOutput = lambdaNode->finalize({ argument0, result1, argument2, result3 });
170 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 1u);
171 auto & newLambdaNode =
173 EXPECT_EQ(newLambdaNode.ninputs(), 2u);
174 EXPECT_EQ(newLambdaNode.subregion()->narguments(), 3u);
175 EXPECT_EQ(newLambdaNode.subregion()->nresults(), 2u);
188TEST(UnusedStateRemovalTests, TestUsedMemoryState)
196 std::cout <<
"Function Setup" << std::endl;
199 { MemoryStateType::Create() });
202 rvsdgModule->Rvsdg().GetRootRegion(),
203 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
206 auto functionArguments = lambda->GetFunctionArguments();
207 auto loadOutput = LoadNonVolatileOperation::Create(
208 functionArguments[0],
209 { functionArguments[1] },
210 PointerType::Create(),
213 auto lambdaOutput = lambda->finalize({ loadOutput[1] });
225 *rvsdgModule->Rvsdg().GetRootRegion().result(0)->origin());
226 auto lambdaSubregion = jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(node)->subregion();
227 EXPECT_EQ(lambdaSubregion->nresults(), 1u);
228 EXPECT_TRUE(is<MemoryStateType>(lambdaSubregion->result(0)->Type()));
231TEST(UnusedStateRemovalTests, TestUnusedMemoryState)
239 std::cout <<
"Function Setup" << std::endl;
242 { MemoryStateType::Create(), MemoryStateType::Create() });
245 rvsdgModule->Rvsdg().GetRootRegion(),
246 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
249 auto functionArguments = lambda->GetFunctionArguments();
250 auto loadOutput = LoadNonVolatileOperation::Create(
251 functionArguments[0],
252 { functionArguments[1] },
253 PointerType::Create(),
256 auto lambdaOutput = lambda->finalize({ loadOutput[1], functionArguments[2] });
267 *rvsdgModule->Rvsdg().GetRootRegion().result(0)->origin());
268 auto lambdaSubregion = jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(node)->subregion();
270 EXPECT_EQ(lambdaSubregion->narguments(), 2u);
271 EXPECT_EQ(lambdaSubregion->nresults(), 1u);
272 EXPECT_TRUE(is<MemoryStateType>(lambdaSubregion->result(0)->Type()));
275TEST(UnusedStateRemovalTests, TestInvariantMemoryState)
283 std::cout <<
"Function Setup" << std::endl;
286 { MemoryStateType::Create() });
289 rvsdgModule->Rvsdg().GetRootRegion(),
290 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
292 auto functionArguments = lambda->GetFunctionArguments();
295 auto & memoryStateSplitNode =
296 LambdaEntryMemoryStateSplitOperation::CreateNode(*functionArguments[1], { 0, 1 });
299 auto loadOutput = LoadNonVolatileOperation::Create(
300 functionArguments[0],
301 { memoryStateSplitNode.output(0) },
302 PointerType::Create(),
306 std::vector<jlm::rvsdg::Output *> outputs;
307 auto & memoryStateMerge = LambdaExitMemoryStateMergeOperation::CreateNode(
308 *lambda->subregion(),
309 { loadOutput[1], memoryStateSplitNode.output(1) },
312 auto lambdaOutput = lambda->finalize({ memoryStateMerge.output(0) });
324 *rvsdgModule->Rvsdg().GetRootRegion().result(0)->origin());
325 auto lambdaSubregion = jlm::util::assertedCast<jlm::rvsdg::LambdaNode>(node)->subregion();
327 EXPECT_EQ(lambdaSubregion->narguments(), 2u);
328 EXPECT_EQ(lambdaSubregion->nresults(), 1u);
329 EXPECT_TRUE(is<MemoryStateType>(lambdaSubregion->result(0)->Type()));
330 EXPECT_TRUE(jlm::rvsdg::Region::containsOperation<LambdaEntryMemoryStateSplitOperation>(
333 EXPECT_TRUE(jlm::rvsdg::Region::containsOperation<LambdaExitMemoryStateMergeOperation>(