6 #include <gtest/gtest.h>
32 const auto actual = aa.
Query(p1, s1, p2, s2);
33 EXPECT_EQ(actual, expected);
36 const auto mirror = aa.
Query(p2, s2, p1, s1);
37 EXPECT_EQ(mirror, expected);
101 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
108 auto & rvsdg = rvsdgModule->Rvsdg();
110 const auto pointerType = PointerType::Create();
111 const auto intType = rvsdg::BitType::Create(32);
112 const auto ioStateType = IOStateType::Create();
113 const auto memoryStateType = MemoryStateType::Create();
115 const auto funcType = rvsdg::FunctionType::Create(
116 { pointerType, ioStateType, memoryStateType },
117 { ioStateType, memoryStateType });
119 const auto getPtrFuncType = rvsdg::FunctionType::Create(
120 { ioStateType, memoryStateType },
121 { pointerType, ioStateType, memoryStateType });
127 Linkage::externalLinkage,
128 CallingConvention::Default);
131 auto & globalDelta = *rvsdg::DeltaNode::Create(
132 &rvsdg.GetRootRegion(),
133 DeltaOperation::Create(pointerType,
"global", Linkage::externalLinkage,
"",
false, 4));
136 ConstantPointerNullOperation::Create(globalDelta.subregion(), pointerType);
137 globalDelta.finalize(nullPtr);
139 rvsdg::GraphExport::Create(globalDelta.output(),
"global");
143 auto & localDelta = *rvsdg::DeltaNode::Create(
144 &rvsdg.GetRootRegion(),
145 DeltaOperation::Create(pointerType,
"local", Linkage::internalLinkage,
"",
false, 4));
148 ConstantPointerNullOperation::Create(localDelta.subregion(), pointerType);
149 localDelta.finalize(nullPtr);
158 Linkage::externalLinkage,
164 auto & lambdaNode = *rvsdg::LambdaNode::Create(
165 rvsdg.GetRootRegion(),
166 LlvmLambdaOperation::Create(funcType,
"func", Linkage::internalLinkage));
168 Outputs_.
P = lambdaNode.GetFunctionArguments()[0];
169 auto ioState = lambdaNode.GetFunctionArguments()[1];
170 auto memoryState = lambdaNode.GetFunctionArguments()[2];
172 const auto getPtrCtxVar = lambdaNode.AddContextVar(*
Outputs_.
GetPtr).inner;
173 const auto globalCtxVar = lambdaNode.AddContextVar(*
Outputs_.
Global).inner;
174 const auto localCtxVar = lambdaNode.AddContextVar(*
Outputs_.
Local).inner;
175 const auto importedCtxVar = lambdaNode.AddContextVar(*
Outputs_.
Imported).inner;
177 const auto constantOne =
178 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 1 });
180 const auto alloca1Outputs = AllocaOperation::create(intType, constantOne, 4);
181 const auto alloca2Outputs = AllocaOperation::create(intType, constantOne, 4);
182 const auto alloca3Outputs = AllocaOperation::create(intType, constantOne, 4);
183 const auto alloca4Outputs = AllocaOperation::create(intType, constantOne, 4);
190 memoryState = MemoryStateMergeOperation::Create({ memoryState,
194 alloca4Outputs[1] });
198 LoadNonVolatileOperation::Create(
Outputs_.
P, { memoryState }, pointerType, 8);
200 memoryState = loadP[1];
205 memoryState = storeP[0];
208 const auto loadGlobal =
209 LoadNonVolatileOperation::Create(globalCtxVar, { memoryState }, pointerType, 8);
211 memoryState = loadGlobal[1];
213 const auto loadLocal =
214 LoadNonVolatileOperation::Create(localCtxVar, { memoryState }, pointerType, 8);
216 memoryState = loadLocal[1];
218 const auto loadImported =
219 LoadNonVolatileOperation::Create(importedCtxVar, { memoryState }, pointerType, 8);
221 memoryState = loadImported[1];
224 const auto storeGlobal =
225 StoreNonVolatileOperation::Create(globalCtxVar,
Outputs_.
Alloca2, { memoryState }, 8);
226 memoryState = storeGlobal[0];
228 const auto storeLocal =
229 StoreNonVolatileOperation::Create(localCtxVar,
Outputs_.
Alloca3, { memoryState }, 8);
230 memoryState = storeLocal[0];
232 const auto storeImported =
233 StoreNonVolatileOperation::Create(importedCtxVar,
Outputs_.
Alloca4, { memoryState }, 8);
234 memoryState = storeImported[0];
237 const auto callOutputs =
238 CallOperation::Create(getPtrCtxVar, getPtrFuncType, { ioState, memoryState });
240 ioState = callOutputs[1];
241 memoryState = callOutputs[2];
243 lambdaNode.finalize({ ioState, memoryState });
254 TEST(PointsToGraphAnalysisTests, TestPtGAliasAnalysis)
267 std::cout << PointsToGraph::dumpDot(*pointsToGraph) << std::endl;
375 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
382 auto & rvsdg = rvsdgModule->Rvsdg();
384 const auto pointerType = PointerType::Create();
385 const auto byteType = rvsdg::BitType::Create(8);
386 const auto int32Type = rvsdg::BitType::Create(32);
387 const auto int64Type = rvsdg::BitType::Create(64);
388 const auto ioStateType = IOStateType::Create();
389 const auto memoryStateType = MemoryStateType::Create();
391 const auto funcType = rvsdg::FunctionType::Create(
392 { pointerType, int32Type, ioStateType, memoryStateType },
393 { ioStateType, memoryStateType });
395 Outputs_.GlobalInt = &LlvmGraphImport::createGlobalImport(
400 Linkage::externalLinkage,
404 Outputs_.GlobalLong = &LlvmGraphImport::createGlobalImport(
409 Linkage::externalLinkage,
415 auto & lambdaNode = *rvsdg::LambdaNode::Create(
416 rvsdg.GetRootRegion(),
417 LlvmLambdaOperation::Create(funcType,
"func", Linkage::internalLinkage));
419 Outputs_.
P = lambdaNode.GetFunctionArguments()[0];
420 Outputs_.Offset = lambdaNode.GetFunctionArguments()[1];
421 auto ioState = lambdaNode.GetFunctionArguments()[2];
422 auto memoryState = lambdaNode.GetFunctionArguments()[3];
424 const auto globalIntCtxVar = lambdaNode.AddContextVar(*
Outputs_.GlobalInt).inner;
425 const auto globalLongCtxVar = lambdaNode.AddContextVar(*
Outputs_.GlobalLong).inner;
428 GetElementPtrOperation::create(globalIntCtxVar, {
Outputs_.Offset }, byteType);
430 GetElementPtrOperation::create(globalLongCtxVar, {
Outputs_.Offset }, byteType);
432 lambdaNode.finalize({ ioState, memoryState });
444 TEST(PointsToGraphAnalysisTests, TestPtGAliasAnalysisOffsets)
457 std::cout << PointsToGraph::dumpDot(*pointsToGraph) << std::endl;
static void Expect(jlm::llvm::aa::AliasAnalysis &aa, const jlm::rvsdg::Output &p1, size_t s1, const jlm::rvsdg::Output &p2, size_t s2, jlm::llvm::aa::AliasAnalysis::AliasQueryResponse expected)
TEST(PointsToGraphAnalysisTests, TestPtGAliasAnalysis)
const Outputs & GetOutputs() const noexcept
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
const Outputs & GetOutputs() const noexcept
std::unique_ptr< jlm::llvm::LlvmRvsdgModule > SetupRvsdg() override
Create RVSDG for this test.
jlm::llvm::LlvmRvsdgModule & module()
virtual AliasQueryResponse Query(const rvsdg::Output &p1, size_t s1, const rvsdg::Output &p2, size_t s2)=0
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Global memory state passed between functions.
static std::vector< Output * > Outputs(const Node &node, const size_t startIdx, const size_t size)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
jlm::rvsdg::Output * GlobalLoad
jlm::rvsdg::Output * Alloca2
jlm::rvsdg::Output * ImportedLoad
jlm::rvsdg::Output * Local
jlm::rvsdg::Output * Alloca4
jlm::rvsdg::Output * Global
jlm::rvsdg::Output * Alloca3
jlm::rvsdg::Output * Imported
jlm::rvsdg::Output * LocalLoad
jlm::rvsdg::Output * Func
jlm::rvsdg::Output * GetPtr
jlm::rvsdg::Output * Alloca1