18TEST(DistributeConstantsTests, GammaSubregionUsage)
26 auto controlType = ControlType::Create(3);
27 auto bit32Type = BitType::Create(32);
28 auto functionType = FunctionType::Create({ controlType }, { bit32Type });
31 auto & rvsdg = rvsdgModule.Rvsdg();
33 auto lambdaNode = LambdaNode::Create(
34 rvsdg.GetRootRegion(),
35 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
36 auto controlArgument = lambdaNode->GetFunctionArguments()[0];
38 auto & constantNode = IntegerConstantOperation::Create(*lambdaNode->subregion(), 32, 5);
40 auto gammaNode = GammaNode::create(controlArgument, 3);
41 auto entryVariable = gammaNode->AddEntryVar(constantNode.output(0));
43 auto testNode0 = TestOperation::createNode(
44 gammaNode->subregion(0),
45 { entryVariable.branchArgument[0] },
48 auto testNode1 = TestOperation::createNode(
49 gammaNode->subregion(1),
50 { entryVariable.branchArgument[1] },
53 auto exitVariable = gammaNode->AddExitVar(
54 { testNode0->output(0), testNode1->output(0), entryVariable.branchArgument[2] });
56 auto lambdaOutput = lambdaNode->finalize({ exitVariable.output });
68 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 2u);
72 EXPECT_EQ(gammaNode->subregion(0)->numNodes(), 2u);
73 EXPECT_TRUE(IsOwnerNodeOperation<IntegerConstantOperation>(*testNode0->input(0)->origin()));
78 EXPECT_EQ(gammaNode->subregion(1)->numNodes(), 2u);
79 EXPECT_TRUE(IsOwnerNodeOperation<IntegerConstantOperation>(*testNode1->input(0)->origin()));
84 EXPECT_EQ(gammaNode->subregion(2)->numNodes(), 1u);
86 IsOwnerNodeOperation<IntegerConstantOperation>(*exitVariable.branchResult[2]->origin()));
90TEST(DistributeConstantsTests, NestedGammas)
98 auto controlType = ControlType::Create(2);
99 auto bit32Type = BitType::Create(32);
100 auto functionType = FunctionType::Create({ controlType }, { bit32Type });
103 auto & rvsdg = rvsdgModule.Rvsdg();
105 auto lambdaNode = LambdaNode::Create(
106 rvsdg.GetRootRegion(),
107 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
108 auto controlArgument = lambdaNode->GetFunctionArguments()[0];
110 auto & constantNode = IntegerConstantOperation::Create(*lambdaNode->subregion(), 32, 5);
112 auto gammaNodeOuter = GammaNode::create(controlArgument, 2);
113 auto entryVarConstant = gammaNodeOuter->AddEntryVar(constantNode.output(0));
116 auto testNode0 = TestOperation::createNode(
117 gammaNodeOuter->subregion(0),
118 { entryVarConstant.branchArgument[0] },
122 auto controlConstant = &ControlConstantOperation::create(*gammaNodeOuter->subregion(1), 2, 0);
123 auto gammaNodeInner = GammaNode::create(controlConstant, 2);
124 auto entryVariable = gammaNodeInner->AddEntryVar(entryVarConstant.branchArgument[1]);
125 auto exitVariableInner = gammaNodeInner->AddExitVar(
126 { entryVariable.branchArgument[0], entryVariable.branchArgument[1] });
128 auto exitVariableOuter =
129 gammaNodeOuter->AddExitVar({ testNode0->output(0), exitVariableInner.output });
131 auto testNode1 = TestOperation::createNode(
132 lambdaNode->subregion(),
133 { exitVariableOuter.output },
136 auto lambdaOutput = lambdaNode->finalize({ testNode1->output(0) });
148 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 3u);
152 EXPECT_EQ(gammaNodeOuter->subregion(0)->numNodes(), 2u);
153 EXPECT_TRUE(IsOwnerNodeOperation<IntegerConstantOperation>(*testNode0->input(0)->origin()));
160 EXPECT_EQ(gammaNodeOuter->subregion(1)->numNodes(), 3u);
164 EXPECT_EQ(gammaNodeInner->subregion(0)->numNodes(), 0u);
169 EXPECT_EQ(gammaNodeInner->subregion(1)->numNodes(), 0u);
173 EXPECT_TRUE(TryGetOwnerNode<GammaNode>(*testNode1->input(0)->origin()));
176TEST(DistributeConstantsTests, Theta)
184 auto controlType = ControlType::Create(3);
185 auto bit32Type = BitType::Create(32);
186 auto functionType = FunctionType::Create({}, { bit32Type, bit32Type, bit32Type });
189 auto & rvsdg = rvsdgModule.Rvsdg();
191 auto lambdaNode = LambdaNode::Create(
192 rvsdg.GetRootRegion(),
193 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
195 auto & constantNode0 = IntegerConstantOperation::Create(*lambdaNode->subregion(), 32, 0);
196 auto & constantNode2 = IntegerConstantOperation::Create(*lambdaNode->subregion(), 32, 2);
198 auto thetaNode = ThetaNode::create(lambdaNode->subregion());
200 auto loopVar0 = thetaNode->AddLoopVar(constantNode0.output(0));
201 auto loopVar1 = thetaNode->AddLoopVar(constantNode0.output(0));
202 auto loopVar2 = thetaNode->AddLoopVar(constantNode2.output(0));
205 TestOperation::createNode(thetaNode->subregion(), { loopVar0.pre }, { bit32Type });
206 auto & constantNode1 = IntegerConstantOperation::Create(*thetaNode->subregion(), 32, 1);
208 TestOperation::createNode(thetaNode->subregion(), { loopVar2.pre }, { bit32Type });
210 loopVar0.post->divert_to(testNode0->output(0));
211 loopVar1.post->divert_to(constantNode1.output(0));
214 TestOperation::createNode(thetaNode->subregion(), { loopVar0.output }, { bit32Type });
217 lambdaNode->finalize({ testNode1->output(0), loopVar1.output, loopVar2.output });
230 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 5u);
233 EXPECT_EQ(thetaNode->subregion()->numNodes(), 5u);
237 auto loopVar = thetaNode->MapOutputLoopVar(*thetaNode->output(0));
238 EXPECT_EQ(lambdaNode->subregion()->result(0)->origin(), testNode1->output(0));
239 EXPECT_EQ(loopVar.output, testNode1->input(0)->origin());
240 EXPECT_EQ(loopVar.post->origin(), testNode0->output(0));
241 EXPECT_EQ(testNode0->input(0)->origin(), loopVar.pre);
242 EXPECT_EQ(loopVar.input->origin(), constantNode0.output(0));
248 auto loopVar = thetaNode->MapOutputLoopVar(*thetaNode->output(1));
249 EXPECT_TRUE(loopVar.output->IsDead());
250 EXPECT_TRUE(loopVar.pre->IsDead());
252 auto [constantNode, constantOperation] =
253 TryGetSimpleNodeAndOptionalOp<IntegerConstantOperation>(
254 *lambdaNode->subregion()->result(1)->origin());
255 EXPECT_TRUE(constantNode && constantOperation);
256 EXPECT_EQ(constantOperation->Representation(), 1u);
261 auto [constantNode, constantOperation] =
262 TryGetSimpleNodeAndOptionalOp<IntegerConstantOperation>(
263 *lambdaNode->subregion()->result(2)->origin());
264 EXPECT_TRUE(constantNode && constantOperation);
265 EXPECT_EQ(constantNode, &constantNode2);
270 auto [constantNode, constantOperation] =
271 TryGetSimpleNodeAndOptionalOp<IntegerConstantOperation>(*testNode2->input(0)->origin());
272 EXPECT_TRUE(constantNode && constantOperation);
273 EXPECT_EQ(constantOperation->Representation(), 2u);
277TEST(DistributeConstantsTests, Lambda)
285 auto bit32Type = BitType::Create(32);
286 auto functionType = FunctionType::Create({}, { bit32Type });
289 auto & rvsdg = rvsdgModule.Rvsdg();
291 auto lambdaNode = LambdaNode::Create(
292 rvsdg.GetRootRegion(),
293 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
295 auto & constantNode0 = IntegerConstantOperation::Create(*lambdaNode->subregion(), 32, 0);
297 auto lambdaOutput = lambdaNode->finalize({ constantNode0.output(0) });
299 GraphExport::Create(*lambdaOutput,
"");
310 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 1u);