6 #include <gtest/gtest.h>
18 TEST(DistributeConstantsTests, GammaSubregionUsage)
31 auto & rvsdg = rvsdgModule.Rvsdg();
34 rvsdg.GetRootRegion(),
36 auto controlArgument = lambdaNode->GetFunctionArguments()[0];
41 auto entryVariable = gammaNode->AddEntryVar(constantNode.output(0));
44 gammaNode->subregion(0),
45 { entryVariable.branchArgument[0] },
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(), 2);
72 EXPECT_EQ(gammaNode->subregion(0)->numNodes(), 2);
73 EXPECT_TRUE(IsOwnerNodeOperation<IntegerConstantOperation>(*testNode0->input(0)->origin()));
78 EXPECT_EQ(gammaNode->subregion(1)->numNodes(), 2);
79 EXPECT_TRUE(IsOwnerNodeOperation<IntegerConstantOperation>(*testNode1->input(0)->origin()));
84 EXPECT_EQ(gammaNode->subregion(2)->numNodes(), 1);
86 IsOwnerNodeOperation<IntegerConstantOperation>(*exitVariable.branchResult[2]->origin()));
90 TEST(DistributeConstantsTests, NestedGammas)
103 auto & rvsdg = rvsdgModule.Rvsdg();
106 rvsdg.GetRootRegion(),
108 auto controlArgument = lambdaNode->GetFunctionArguments()[0];
113 auto entryVarConstant = gammaNodeOuter->AddEntryVar(constantNode.output(0));
117 gammaNodeOuter->subregion(0),
118 { entryVarConstant.branchArgument[0] },
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 });
132 lambdaNode->subregion(),
133 { exitVariableOuter.output },
136 auto lambdaOutput = lambdaNode->finalize({ testNode1->output(0) });
148 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 3);
152 EXPECT_EQ(gammaNodeOuter->subregion(0)->numNodes(), 2);
153 EXPECT_TRUE(IsOwnerNodeOperation<IntegerConstantOperation>(*testNode0->input(0)->origin()));
160 EXPECT_EQ(gammaNodeOuter->subregion(1)->numNodes(), 3);
164 EXPECT_EQ(gammaNodeInner->subregion(0)->numNodes(), 0);
169 EXPECT_EQ(gammaNodeInner->subregion(1)->numNodes(), 0);
173 EXPECT_TRUE(TryGetOwnerNode<GammaNode>(*testNode1->input(0)->origin()));
176 TEST(DistributeConstantsTests, Theta)
189 auto & rvsdg = rvsdgModule.Rvsdg();
192 rvsdg.GetRootRegion(),
200 auto loopVar0 = thetaNode->AddLoopVar(constantNode0.output(0));
201 auto loopVar1 = thetaNode->AddLoopVar(constantNode0.output(0));
202 auto loopVar2 = thetaNode->AddLoopVar(constantNode2.output(0));
210 loopVar0.post->divert_to(testNode0->output(0));
211 loopVar1.post->divert_to(constantNode1.output(0));
217 lambdaNode->finalize({ testNode1->output(0), loopVar1.output, loopVar2.output });
230 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 5);
233 EXPECT_EQ(thetaNode->subregion()->numNodes(), 5);
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(), 1);
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(), 2);
277 TEST(DistributeConstantsTests, Lambda)
289 auto & rvsdg = rvsdgModule.Rvsdg();
292 rvsdg.GetRootRegion(),
297 auto lambdaOutput = lambdaNode->finalize({ constantNode0.output(0) });
310 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 1);
static jlm::util::StatisticsCollector statisticsCollector
TEST(DistributeConstantsTests, GammaSubregionUsage)
static void CreateAndRun(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector)
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
static Output & create(Region ®ion, ControlValueRepresentation value)
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
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 LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type >> resultTypes)
static ThetaNode * create(rvsdg::Region *parent)
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)