6 #include <gtest/gtest.h>
23 TEST(MemoryQueueTests, TestSingleLoad)
31 std::cout <<
"Function Setup" << std::endl;
37 rvsdgModule->Rvsdg().GetRootRegion(),
44 theta->set_predicate(matchNode.output(0));
47 auto functionArguments = lambda->GetFunctionArguments();
48 auto loadAddress = theta->AddLoopVar(functionArguments[0]);
49 auto memoryStateArgument = theta->AddLoopVar(functionArguments[1]);
52 { memoryStateArgument.pre },
55 loadAddress.post->divert_to(loadOutput[0]);
56 memoryStateArgument.post->divert_to(loadOutput[1]);
58 auto lambdaOutput = lambda->finalize({ theta->output(0), theta->output(1) });
61 auto lambdaRegion = lambda->subregion();
70 auto & entryMemoryStateSplitInput = lambdaRegion->argument(1)->SingleUser();
71 auto * entryMemoryStateSplitNode =
72 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(entryMemoryStateSplitInput);
73 jlm::util::assertedCast<const LambdaEntryMemoryStateSplitOperation>(
74 &entryMemoryStateSplitNode->GetOperation());
75 auto exitMemoryStateMergeNode =
76 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*lambdaRegion->result(1)->origin());
77 jlm::util::assertedCast<const LambdaExitMemoryStateMergeOperation>(
78 &exitMemoryStateMergeNode->GetOperation());
84 EXPECT_TRUE(jlm::rvsdg::Region::ContainsNodeType<LoopNode>(*lambdaRegion,
true));
91 EXPECT_TRUE(jlm::rvsdg::Region::ContainsOperation<StateGateOperation>(*lambdaRegion,
true));
92 EXPECT_FALSE(jlm::rvsdg::Region::ContainsOperation<AddressQueueOperation>(*lambdaRegion,
true));
95 TEST(MemoryQueueTests, TestLoadStore)
103 std::cout <<
"Function Setup" << std::endl;
111 rvsdgModule->Rvsdg().GetRootRegion(),
118 theta->set_predicate(matchNode.output(0));
121 auto functionArguments = lambda->GetFunctionArguments();
122 auto loadAddress = theta->AddLoopVar(functionArguments[0]);
123 auto storeAddress = theta->AddLoopVar(functionArguments[1]);
124 auto memoryStateArgument = theta->AddLoopVar(functionArguments[2]);
127 { memoryStateArgument.pre },
136 loadAddress.post->divert_to(loadOutput[0]);
137 memoryStateArgument.post->divert_to(storeOutput[0]);
139 auto lambdaOutput = lambda->finalize({ theta->output(0), theta->output(2) });
142 auto lambdaRegion = lambda->subregion();
151 auto & entryMemoryStateSplitInput = lambdaRegion->argument(2)->SingleUser();
152 auto * entryMemoryStateSplitNode =
153 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(entryMemoryStateSplitInput);
154 jlm::util::assertedCast<const LambdaEntryMemoryStateSplitOperation>(
155 &entryMemoryStateSplitNode->GetOperation());
156 auto exitMemoryStateMergeNode =
157 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*lambdaRegion->result(1)->origin());
158 jlm::util::assertedCast<const LambdaExitMemoryStateMergeOperation>(
159 &exitMemoryStateMergeNode->GetOperation());
165 EXPECT_TRUE(jlm::rvsdg::Region::ContainsNodeType<LoopNode>(*lambdaRegion,
true));
172 EXPECT_TRUE(jlm::rvsdg::Region::ContainsOperation<StateGateOperation>(*lambdaRegion,
true));
173 EXPECT_FALSE(jlm::rvsdg::Region::ContainsOperation<AddressQueueOperation>(*lambdaRegion,
true));
176 TEST(MemoryQueueTests, TestAddrQueue)
184 std::cout <<
"Function Setup" << std::endl;
190 rvsdgModule->Rvsdg().GetRootRegion(),
197 theta->set_predicate(matchNode.output(0));
200 auto functionArguments = lambda->GetFunctionArguments();
201 auto address = theta->AddLoopVar(functionArguments[0]);
202 auto memoryStateArgument = theta->AddLoopVar(functionArguments[1]);
205 { memoryStateArgument.pre },
211 address.post->divert_to(loadOutput[0]);
212 memoryStateArgument.post->divert_to(storeOutput[0]);
214 auto lambdaOutput = lambda->finalize({ theta->output(0), theta->output(1) });
217 auto lambdaRegion = lambda->subregion();
226 auto & entryMemoryStateSplitInput = lambdaRegion->argument(1)->SingleUser();
227 auto * entryMemoryStateSplitNode =
228 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(entryMemoryStateSplitInput);
229 jlm::util::assertedCast<const LambdaEntryMemoryStateSplitOperation>(
230 &entryMemoryStateSplitNode->GetOperation());
231 auto exitMemoryStateMergeNode =
232 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*lambdaRegion->result(1)->origin());
233 jlm::util::assertedCast<const LambdaExitMemoryStateMergeOperation>(
234 &exitMemoryStateMergeNode->GetOperation());
240 EXPECT_TRUE(jlm::rvsdg::Region::ContainsNodeType<LoopNode>(*lambdaRegion,
true));
247 EXPECT_TRUE(jlm::rvsdg::Region::ContainsOperation<StateGateOperation>(*lambdaRegion,
true));
248 EXPECT_TRUE(jlm::rvsdg::Region::ContainsOperation<AddressQueueOperation>(*lambdaRegion,
true));
256 if (is<StoreNonVolatileOperation>(node))
259 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*node->input(1)->origin());
260 jlm::util::assertedCast<const jlm::llvm::LoadOperation>(&loadNode->GetOperation());
262 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*loadNode->input(0)->origin());
263 jlm::util::assertedCast<const StateGateOperation>(&stateGate->GetOperation());
265 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*stateGate->input(0)->origin());
266 jlm::util::assertedCast<const AddressQueueOperation>(&addrQueue->GetOperation());
static jlm::util::StatisticsCollector statisticsCollector
TEST(MemoryQueueTests, TestSingleLoad)
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::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *state, std::shared_ptr< const rvsdg::Type > loadedType, size_t alignment)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *value, const Variable *state, size_t alignment)
static Output & create(Region ®ion, BitValueRepresentation value)
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)
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
static Node & CreateNode(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
static ThetaNode * create(rvsdg::Region *parent)
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)