6 #include <gtest/gtest.h>
36 const auto actual = aa.
Query(p1, s1, p2, s2);
37 EXPECT_EQ(actual, expected);
40 const auto mirror = aa.
Query(p2, s2, p1, s1);
41 EXPECT_EQ(mirror, expected);
109 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
116 auto & rvsdg = rvsdgModule->Rvsdg();
118 const auto pointerType = PointerType::Create();
119 const auto intType = rvsdg::BitType::Create(32);
120 const auto shortType = rvsdg::BitType::Create(16);
121 const auto byteType = rvsdg::BitType::Create(8);
122 const auto intArrayType = ArrayType::Create(intType, 10);
123 const auto ioStateType = IOStateType::Create();
124 const auto memoryStateType = MemoryStateType::Create();
126 const auto funcType = rvsdg::FunctionType::Create(
127 { pointerType, ioStateType, memoryStateType },
128 { ioStateType, memoryStateType });
130 const auto getPtrFuncType = rvsdg::FunctionType::Create(
131 { ioStateType, memoryStateType },
132 { pointerType, ioStateType, memoryStateType });
138 Linkage::externalLinkage,
139 CallingConvention::Default);
146 Linkage::externalLinkage,
154 Linkage::externalLinkage,
162 Linkage::externalLinkage,
168 auto & lambdaNode = *rvsdg::LambdaNode::Create(
169 rvsdg.GetRootRegion(),
170 LlvmLambdaOperation::Create(funcType,
"func", Linkage::internalLinkage));
172 Outputs_.
P = lambdaNode.GetFunctionArguments()[0];
173 auto ioState = lambdaNode.GetFunctionArguments()[1];
174 auto memoryState = lambdaNode.GetFunctionArguments()[2];
176 const auto getPtrCtxVar = lambdaNode.AddContextVar(*
Outputs_.
GetPtr).inner;
177 const auto arrayCtxVar = lambdaNode.AddContextVar(*
Outputs_.
Array).inner;
178 const auto globalCtxVar = lambdaNode.AddContextVar(*
Outputs_.
Global).inner;
180 const auto constantOne =
181 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 1 });
182 const auto constantTwo =
183 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 2 });
184 const auto constantThree =
185 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 3 });
186 const auto constantFour =
187 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 4 });
188 const auto constantMinusTwo =
189 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, -2 });
191 const auto alloca1Outputs = AllocaOperation::create(intType, constantOne, 4);
192 const auto alloca2Outputs = AllocaOperation::create(intType, constantOne, 4);
198 MemoryStateMergeOperation::Create({ memoryState, alloca1Outputs[1], alloca2Outputs[1] });
202 LoadNonVolatileOperation::Create(
Outputs_.
P, { memoryState }, pointerType, 8);
203 memoryState = loadP[1];
205 Outputs_.
Q = GetElementPtrOperation::create(loadP[0], { constantTwo }, intType);
206 Outputs_.
QPlus2 = GetElementPtrOperation::create(loadP[0], { constantFour }, intType);
208 GetElementPtrOperation::create(
Outputs_.
QPlus2, { constantMinusTwo }, intType);
211 Outputs_.
Arr1 = GetElementPtrOperation::create(arrayCtxVar, { constantOne }, intType);
212 Outputs_.
Arr2 = GetElementPtrOperation::create(arrayCtxVar, { constantTwo }, intType);
213 Outputs_.
Arr3 = GetElementPtrOperation::create(arrayCtxVar, { constantThree }, intType);
216 const auto loadGlobal =
217 LoadNonVolatileOperation::Create(globalCtxVar, { memoryState }, intType, 4);
218 memoryState = loadGlobal[1];
220 GetElementPtrOperation::create(arrayCtxVar, { loadGlobal[0] }, byteType);
223 const auto storeOutputs =
225 memoryState = storeOutputs[0];
228 const auto callOutputs =
229 CallOperation::Create(getPtrCtxVar, getPtrFuncType, { ioState, memoryState });
231 ioState = callOutputs[1];
232 memoryState = callOutputs[2];
235 GetElementPtrOperation::create(
Outputs_.
BytePtr, { constantTwo }, byteType);
237 lambdaNode.finalize({ ioState, memoryState });
247 TEST(LocalAliasAnalysisTests, TestLocalAliasAnalysis)
382 std::unique_ptr<jlm::llvm::LlvmRvsdgModule>
389 auto & rvsdg = rvsdgModule->Rvsdg();
391 const auto pointerType = PointerType::Create();
392 const auto int1Type = rvsdg::BitType::Create(1);
393 const auto int32Type = rvsdg::BitType::Create(32);
394 const auto int64Type = rvsdg::BitType::Create(64);
395 const auto intArrayType = ArrayType::Create(int32Type, 2);
396 const auto ioStateType = IOStateType::Create();
397 const auto memoryStateType = MemoryStateType::Create();
399 const auto funcType = rvsdg::FunctionType::Create(
400 { int1Type, pointerType, ioStateType, memoryStateType },
401 { ioStateType, memoryStateType });
405 auto & lambdaNode = *rvsdg::LambdaNode::Create(
406 rvsdg.GetRootRegion(),
407 LlvmLambdaOperation::Create(funcType,
"func", Linkage::internalLinkage));
409 Outputs_.X = lambdaNode.GetFunctionArguments()[0];
410 Outputs_.Ptr = lambdaNode.GetFunctionArguments()[1];
411 auto ioState = lambdaNode.GetFunctionArguments()[2];
412 auto memoryState = lambdaNode.GetFunctionArguments()[3];
414 const auto constantZero =
415 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 0 });
416 const auto constantOne =
417 &rvsdg::BitConstantOperation::create(*lambdaNode.subregion(), { 32, 1 });
419 const auto alloca1Outputs = AllocaOperation::create(int32Type, constantOne, 4);
420 const auto alloca2Outputs = AllocaOperation::create(int64Type, constantOne, 4);
421 const auto alloca3Outputs = AllocaOperation::create(intArrayType, constantOne, 4);
425 Outputs_.Alloca3 = alloca3Outputs[0];
427 memoryState = MemoryStateMergeOperation::Create(
428 { memoryState, alloca1Outputs[1], alloca2Outputs[1], alloca3Outputs[1] });
430 const auto matchResult = rvsdg::MatchOperation::Create(*
Outputs_.X, { { 1, 1 } }, 0, 2);
431 const auto gamma = rvsdg::GammaNode::create(matchResult, 2);
435 gamma->AddExitVar({ entryVarA1.branchArgument[0], entryVarA2.branchArgument[1] });
436 Outputs_.AllocaUnknown = exitVar.output;
439 GetElementPtrOperation::create(
Outputs_.AllocaUnknown, { constantOne }, int32Type);
441 Outputs_.Alloca3Plus1 = GetElementPtrOperation::create(
443 { constantZero, constantOne },
446 Outputs_.Alloca3UnknownOffset = rvsdg::CreateOpNode<SelectOperation>(
452 rvsdg::CreateOpNode<SelectOperation>(
457 lambdaNode.finalize({ ioState, memoryState });
467 TEST(LocalAliasAnalysisTests, TestLocalAliasAnalysisMultipleOrigins)
516 Expect(aa, *
outputs.Alloca3UnknownOffset, 4, *
outputs.AllocaUnknown, 4, AliasAnalysis::NoAlias);
521 Expect(aa, *
outputs.Alloca3UnknownOffset, 4, *
outputs.Alloca3Plus1, 4, AliasAnalysis::MayAlias);
526 Expect(aa, *
outputs.Alloca3UnknownOffset, 8, *
outputs.Alloca3Plus1, 4, AliasAnalysis::MayAlias);
TEST(LocalAliasAnalysisTests, TestLocalAliasAnalysis)
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)
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.
const rvsdg::Graph & graph()
virtual AliasQueryResponse Query(const rvsdg::Output &p1, size_t s1, const rvsdg::Output &p2, size_t s2)=0
Region & GetRootRegion() const noexcept
Global memory state passed between functions.
static std::vector< Output * > Outputs(const Node &node, const size_t startIdx, const size_t size)
std::string view(const rvsdg::Region *region)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
jlm::rvsdg::Output * Func
jlm::rvsdg::Output * QAgain
jlm::rvsdg::Output * Alloca1
jlm::rvsdg::Output * Array
jlm::rvsdg::Output * BytePtrPlus2
jlm::rvsdg::Output * Arr2
jlm::rvsdg::Output * QPlus2
jlm::rvsdg::Output * Alloca2
jlm::rvsdg::Output * Global
jlm::rvsdg::Output * Arr1
jlm::rvsdg::Output * BytePtr
jlm::rvsdg::Output * GlobalShort
jlm::rvsdg::Output * Arr3
jlm::rvsdg::Output * GetPtr
jlm::rvsdg::Output * ArrUnknown