17TEST(CallSummaryTests, TestCallSummaryComputationDead)
22 auto vt = rvsdg::TestType::createValueType();
26 auto & rvsdg = rvsdgModule->Rvsdg();
29 rvsdg.GetRootRegion(),
35 auto result = rvsdg::TestOperation::createNode(lambdaNode->subregion(), {}, { vt })->output(0);
37 lambdaNode->finalize({ result });
43 EXPECT_TRUE(callSummary.IsDead());
45 EXPECT_FALSE(callSummary.IsExported());
46 EXPECT_FALSE(callSummary.IsOnlyExported());
47 EXPECT_EQ(callSummary.GetRvsdgExport(),
nullptr);
48 EXPECT_FALSE(callSummary.HasOnlyDirectCalls());
51TEST(CallSummaryTests, TestCallSummaryComputationExport)
56 auto vt = rvsdg::TestType::createValueType();
60 auto & rvsdg = rvsdgModule->Rvsdg();
63 rvsdg.GetRootRegion(),
69 auto result = rvsdg::TestOperation::createNode(lambdaNode->subregion(), {}, { vt })->output(0);
71 auto lambdaOutput = lambdaNode->finalize({ result });
72 auto & rvsdgExport = rvsdg::GraphExport::Create(*lambdaOutput,
"f");
78 EXPECT_TRUE(callSummary.IsExported());
79 EXPECT_TRUE(callSummary.IsOnlyExported());
80 EXPECT_EQ(callSummary.GetRvsdgExport(), &rvsdgExport);
82 EXPECT_FALSE(callSummary.IsDead());
83 EXPECT_FALSE(callSummary.HasOnlyDirectCalls());
86TEST(CallSummaryTests, TestCallSummaryComputationDirectCalls)
91 auto vt = rvsdg::TestType::createValueType();
97 auto & rvsdg = rvsdgModule->Rvsdg();
99 auto SetupLambdaX = [&]()
102 rvsdg.GetRootRegion(),
107 auto iOStateArgument = lambdaNode->GetFunctionArguments()[0];
108 auto memoryStateArgument = lambdaNode->GetFunctionArguments()[1];
110 auto result = rvsdg::TestOperation::createNode(lambdaNode->subregion(), {}, { vt })->output(0);
112 return lambdaNode->finalize({ result, iOStateArgument, memoryStateArgument });
118 rvsdg.GetRootRegion(),
123 auto iOStateArgument = lambdaNode->GetFunctionArguments()[0];
124 auto memoryStateArgument = lambdaNode->GetFunctionArguments()[1];
125 auto lambdaXCv = lambdaNode->AddContextVar(lambdaX).inner;
130 { iOStateArgument, memoryStateArgument });
132 auto lambdaOutput = lambdaNode->finalize(callResults);
133 rvsdg::GraphExport::Create(*lambdaOutput,
"y");
141 rvsdg.GetRootRegion(),
146 auto iOStateArgument = lambdaNode->GetFunctionArguments()[0];
147 auto memoryStateArgument = lambdaNode->GetFunctionArguments()[1];
148 auto lambdaXCv = lambdaNode->AddContextVar(lambdaX).inner;
149 auto lambdaYCv = lambdaNode->AddContextVar(lambdaY).inner;
154 { iOStateArgument, memoryStateArgument });
158 { callXResults[1], callXResults[2] });
160 auto result = rvsdg::TestOperation::createNode(
161 lambdaNode->subregion(),
162 { callXResults[0], callYResults[0] },
166 auto lambdaOutput = lambdaNode->finalize({ result, callYResults[1], callYResults[2] });
167 rvsdg::GraphExport::Create(*lambdaOutput,
"z");
172 auto lambdaX = SetupLambdaX();
173 auto lambdaY = SetupLambdaY(*lambdaX);
174 auto lambdaZ = SetupLambdaZ(*lambdaX, *lambdaY);
177 auto lambdaXCallSummary =
179 auto lambdaYCallSummary =
181 auto lambdaZCallSummary =
185 EXPECT_TRUE(lambdaXCallSummary.HasOnlyDirectCalls());
186 EXPECT_EQ(lambdaXCallSummary.NumDirectCalls(), 2u);
187 EXPECT_FALSE(lambdaXCallSummary.IsDead());
188 EXPECT_FALSE(lambdaXCallSummary.IsExported());
189 EXPECT_FALSE(lambdaXCallSummary.IsOnlyExported());
191 EXPECT_FALSE(lambdaYCallSummary.IsDead());
192 EXPECT_FALSE(lambdaYCallSummary.HasOnlyDirectCalls());
193 EXPECT_EQ(lambdaYCallSummary.NumDirectCalls(), 1u);
194 EXPECT_TRUE(lambdaYCallSummary.IsExported());
195 EXPECT_FALSE(lambdaYCallSummary.IsOnlyExported());
197 EXPECT_FALSE(lambdaZCallSummary.IsDead());
198 EXPECT_FALSE(lambdaZCallSummary.HasOnlyDirectCalls());
199 EXPECT_EQ(lambdaZCallSummary.NumDirectCalls(), 0u);
200 EXPECT_TRUE(lambdaZCallSummary.IsExported());
201 EXPECT_TRUE(lambdaZCallSummary.IsOnlyExported());
204TEST(CallSummaryTests, TestCallSummaryComputationIndirectCalls)
219 EXPECT_FALSE(lambdaThreeCallSummary.HasOnlyDirectCalls());
220 EXPECT_EQ(lambdaThreeCallSummary.NumDirectCalls(), 0u);
221 EXPECT_FALSE(lambdaThreeCallSummary.IsDead());
222 EXPECT_FALSE(lambdaThreeCallSummary.IsExported());
223 EXPECT_FALSE(lambdaThreeCallSummary.IsOnlyExported());
224 EXPECT_EQ(lambdaThreeCallSummary.NumOtherUsers(), 1u);
226 EXPECT_FALSE(lambdaFourCallSummary.HasOnlyDirectCalls());
227 EXPECT_EQ(lambdaFourCallSummary.NumDirectCalls(), 0u);
228 EXPECT_FALSE(lambdaFourCallSummary.IsDead());
229 EXPECT_FALSE(lambdaFourCallSummary.IsExported());
230 EXPECT_FALSE(lambdaFourCallSummary.IsOnlyExported());
231 EXPECT_EQ(lambdaFourCallSummary.NumOtherUsers(), 1u);
233 EXPECT_TRUE(lambdaIndcallCallSummary.HasOnlyDirectCalls());
234 EXPECT_EQ(lambdaIndcallCallSummary.NumDirectCalls(), 2u);
235 EXPECT_FALSE(lambdaIndcallCallSummary.IsDead());
236 EXPECT_FALSE(lambdaIndcallCallSummary.IsExported());
237 EXPECT_FALSE(lambdaIndcallCallSummary.IsOnlyExported());
238 EXPECT_EQ(lambdaIndcallCallSummary.NumOtherUsers(), 0u);
240 EXPECT_FALSE(lambdaTestCallSummary.HasOnlyDirectCalls());
241 EXPECT_EQ(lambdaTestCallSummary.NumDirectCalls(), 0u);
242 EXPECT_FALSE(lambdaTestCallSummary.IsDead());
243 EXPECT_TRUE(lambdaTestCallSummary.IsExported());
244 EXPECT_TRUE(lambdaTestCallSummary.IsOnlyExported());
245 EXPECT_EQ(lambdaTestCallSummary.NumOtherUsers(), 0u);
248TEST(CallSummaryTests, TestCallSummaryComputationFunctionPointerInDelta)
254 auto rvsdg = &rvsdgModule->Rvsdg();
260 rvsdg->GetRootRegion(),
261 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
262 lambdaNode->finalize({ lambdaNode->GetFunctionArguments()[0] });
265 &rvsdg->GetRootRegion(),
266 LlvmDeltaOperation::Create(functionType,
"fp", Linkage::externalLinkage,
"",
false, 4));
267 auto argument = deltaNode->AddContextVar(*lambdaNode->output()).inner;
268 deltaNode->finalize(argument);
276 EXPECT_EQ(callSummary.NumOtherUsers(), 1u);
277 EXPECT_TRUE(callSummary.HasOnlyOtherUsages());
280TEST(CallSummaryTests, TestCallSummaryComputationLambdaResult)
287 auto pointerType = PointerType::Create();
295 auto lambdaOutputG = lambdaNodeG->finalize({ lambdaNodeG->GetFunctionArguments()[0] });
300 auto lambdaGArgument = lambdaNodeF->AddContextVar(*lambdaOutputG).inner;
304 auto lambdaOutputF = lambdaNodeF->finalize({ ptr });
312 EXPECT_EQ(callSummary.NumOtherUsers(), 1u);
313 EXPECT_TRUE(callSummary.HasOnlyOtherUsages());