6 #include <gtest/gtest.h>
17 TEST(CallSummaryTests, TestCallSummaryComputationDead)
26 auto & rvsdg = rvsdgModule->Rvsdg();
29 rvsdg.GetRootRegion(),
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());
51 TEST(CallSummaryTests, TestCallSummaryComputationExport)
60 auto & rvsdg = rvsdgModule->Rvsdg();
63 rvsdg.GetRootRegion(),
71 auto lambdaOutput = lambdaNode->finalize({ result });
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());
86 TEST(CallSummaryTests, TestCallSummaryComputationDirectCalls)
97 auto & rvsdg = rvsdgModule->Rvsdg();
99 auto SetupLambdaX = [&]()
102 rvsdg.GetRootRegion(),
107 auto iOStateArgument = lambdaNode->GetFunctionArguments()[0];
108 auto memoryStateArgument = lambdaNode->GetFunctionArguments()[1];
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);
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] });
161 lambdaNode->subregion(),
162 { callXResults[0], callYResults[0] },
166 auto lambdaOutput = lambdaNode->finalize({ result, callYResults[1], callYResults[2] });
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());
204 TEST(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);
248 TEST(CallSummaryTests, TestCallSummaryComputationFunctionPointerInDelta)
254 auto rvsdg = &rvsdgModule->Rvsdg();
260 rvsdg->GetRootRegion(),
262 lambdaNode->finalize({ lambdaNode->GetFunctionArguments()[0] });
265 &rvsdg->GetRootRegion(),
273 auto argument = deltaNode->AddContextVar(*lambdaNode->output()).inner;
274 deltaNode->finalize(argument);
282 EXPECT_EQ(callSummary.NumOtherUsers(), 1u);
283 EXPECT_TRUE(callSummary.HasOnlyOtherUsages());
286 TEST(CallSummaryTests, TestCallSummaryComputationLambdaResult)
301 auto lambdaOutputG = lambdaNodeG->finalize({ lambdaNodeG->GetFunctionArguments()[0] });
306 auto lambdaGArgument = lambdaNodeF->AddContextVar(*lambdaOutputG).inner;
308 jlm::rvsdg::CreateOpNode<FunctionToPointerOperation>({ lambdaGArgument }, functionTypeG)
310 auto lambdaOutputF = lambdaNodeF->finalize({ ptr });
318 EXPECT_EQ(callSummary.NumOtherUsers(), 1u);
319 EXPECT_TRUE(callSummary.HasOnlyOtherUsages());
TEST(CallSummaryTests, TestCallSummaryComputationDead)
static std::vector< rvsdg::Output * > Create(rvsdg::Output *function, std::shared_ptr< const rvsdg::FunctionType > functionType, const std::vector< rvsdg::Output * > &arguments)
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const Linkage &linkage, std::string section, bool constant, const size_t alignment)
static std::shared_ptr< const IOStateType > Create()
const jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaIndcall() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaThree() const noexcept
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::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
jlm::llvm::LlvmRvsdgModule & module()
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 GraphExport & Create(Output &origin, std::string name)
Region & GetRootRegion() const noexcept
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
NodeOutput * output(size_t index) const noexcept
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type >> resultTypes)
static std::shared_ptr< const TestType > createValueType()
Global memory state passed between functions.
CallSummary ComputeCallSummary(const rvsdg::LambdaNode &lambdaNode)