23TEST(MemoryQueueTests, TestSingleLoad)
31 std::cout <<
"Function Setup" << std::endl;
37 rvsdgModule->Rvsdg().GetRootRegion(),
38 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
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]);
50 auto loadOutput = LoadNonVolatileOperation::Create(
52 { memoryStateArgument.pre },
53 PointerType::Create(),
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 =
73 jlm::util::assertedCast<const LambdaEntryMemoryStateSplitOperation>(
74 &entryMemoryStateSplitNode->GetOperation());
75 auto exitMemoryStateMergeNode =
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));
95TEST(MemoryQueueTests, TestLoadStore)
103 std::cout <<
"Function Setup" << std::endl;
107 MemoryStateType::Create() },
111 rvsdgModule->Rvsdg().GetRootRegion(),
112 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
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]);
125 auto loadOutput = LoadNonVolatileOperation::Create(
127 { memoryStateArgument.pre },
128 PointerType::Create(),
130 auto storeOutput = StoreNonVolatileOperation::Create(
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 =
154 jlm::util::assertedCast<const LambdaEntryMemoryStateSplitOperation>(
155 &entryMemoryStateSplitNode->GetOperation());
156 auto exitMemoryStateMergeNode =
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));
176TEST(MemoryQueueTests, TestAddrQueue)
184 std::cout <<
"Function Setup" << std::endl;
190 rvsdgModule->Rvsdg().GetRootRegion(),
191 LlvmLambdaOperation::Create(functionType,
"test", Linkage::externalLinkage));
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]);
203 auto loadOutput = LoadNonVolatileOperation::Create(
205 { memoryStateArgument.pre },
206 PointerType::Create(),
209 StoreNonVolatileOperation::Create(address.pre, loadOutput[0], { loadOutput[1] }, 32);
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 =
229 jlm::util::assertedCast<const LambdaEntryMemoryStateSplitOperation>(
230 &entryMemoryStateSplitNode->GetOperation());
231 auto exitMemoryStateMergeNode =
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))
260 jlm::util::assertedCast<const jlm::llvm::LoadOperation>(&loadNode->GetOperation());
263 jlm::util::assertedCast<const StateGateOperation>(&stateGate->GetOperation());
266 jlm::util::assertedCast<const AddressQueueOperation>(&addrQueue->GetOperation());