6 #include <gtest/gtest.h>
23 template<
class Analysis,
class TModRefSummarizer>
28 std::is_base_of_v<jlm::llvm::aa::PointsToAnalysis, Analysis>,
29 "Analysis should be derived from PointsToAnalysis class.");
32 std::is_base_of_v<jlm::llvm::aa::ModRefSummarizer, TModRefSummarizer>,
33 "TModRefSummarizer should be derived from ModRefSummarizer class.");
39 Analysis aliasAnalysis;
43 TModRefSummarizer summarizer;
48 std::cout <<
"run encoder\n";
57 return jlm::rvsdg::is<OP>(&node) && node.
ninputs() == numInputs && node.
noutputs() == numOutputs;
60 TEST(MemoryStateEncoderTests, storeTest1AndersenAgnostic)
65 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
69 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
71 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 6, 1));
74 auto [aJoinNode, aJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
76 auto [bJoinNode, bJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
78 auto [cJoinNode, cJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
80 auto [dJoinNode, dJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
82 EXPECT_TRUE(aJoinOp && aJoinNode->output(0)->nusers() == 1);
83 EXPECT_TRUE(bJoinOp && bJoinNode->output(0)->nusers() == 1);
84 EXPECT_TRUE(cJoinOp && cJoinNode->output(0)->nusers() == 1);
85 EXPECT_TRUE(dJoinOp && dJoinNode->output(0)->nusers() == 1);
89 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(dJoinNode->output(0)->SingleUser()),
92 auto storeD = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(cJoinNode->output(0)->SingleUser());
93 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD, 3, 1));
97 auto storeC = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(bJoinNode->output(0)->SingleUser());
98 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeC, 3, 1));
102 auto storeB = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(aJoinNode->output(0)->SingleUser());
103 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
108 TEST(MemoryStateEncoderTests, storeTest1AndersenRegionAware)
113 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
117 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
119 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
122 TEST(MemoryStateEncoderTests, storeTest2AndersenAgnostic)
127 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
131 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
133 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
136 auto [aJoinNode, aJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
138 auto [bJoinNode, bJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
140 auto [xJoinNode, xJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
142 auto [yJoinNode, yJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
144 auto [pJoinNode, pJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
146 EXPECT_TRUE(aJoinOp && aJoinNode->output(0)->nusers() == 1);
147 EXPECT_TRUE(bJoinOp && bJoinNode->output(0)->nusers() == 1);
148 EXPECT_TRUE(xJoinOp && xJoinNode->output(0)->nusers() == 1);
149 EXPECT_TRUE(yJoinOp && yJoinNode->output(0)->nusers() == 1);
150 EXPECT_TRUE(pJoinOp && pJoinNode->output(0)->nusers() == 1);
153 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(aJoinNode->output(0)->SingleUser()),
156 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(bJoinNode->output(0)->SingleUser()),
161 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeA, 3, 1));
165 jlm::rvsdg::IsOwnerNodeOperation<MemoryStateJoinOperation>(*storeA->input(2)->origin()));
169 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
173 jlm::rvsdg::IsOwnerNodeOperation<MemoryStateJoinOperation>(*storeB->input(2)->origin()));
175 auto storeX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(pJoinNode->output(0)->SingleUser());
176 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeX, 3, 1));
180 jlm::rvsdg::IsOwnerNodeOperation<MemoryStateJoinOperation>(*storeX->input(2)->origin()));
182 auto storeY = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(storeX->output(0)->SingleUser());
183 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeY, 3, 1));
186 EXPECT_EQ(storeY->input(2)->origin(), storeX->output(0));
189 TEST(MemoryStateEncoderTests, storeTest2AndersenRegionAware)
194 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
198 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
200 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
203 TEST(MemoryStateEncoderTests, loadTest1AndersenAgnostic)
208 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
212 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
214 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
216 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
218 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
220 auto loadA = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
222 auto loadX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadA->input(0)->origin());
224 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadA, 3, 3));
225 EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadA->input(1)->origin()), loadX);
227 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 3, 3));
230 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadX->input(1)->origin()),
234 TEST(MemoryStateEncoderTests, loadTest1AndersenRegionAware)
239 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
243 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
245 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
247 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
249 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
251 auto loadA = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
253 auto loadX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadA->input(0)->origin());
255 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadA, 2, 2));
256 EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadA->input(1)->origin()), loadX);
258 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
261 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadX->input(1)->origin()),
265 TEST(MemoryStateEncoderTests, loadTest2AndersenAgnostic)
269 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
273 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
275 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
278 auto [aJoinNode, aJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
280 auto [bJoinNode, bJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
282 auto [xJoinNode, xJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
284 auto [yJoinNode, yJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
286 auto [pJoinNode, pJoinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
288 EXPECT_TRUE(aJoinOp && aJoinNode->output(0)->nusers() == 1);
289 EXPECT_TRUE(bJoinOp && bJoinNode->output(0)->nusers() == 1);
290 EXPECT_TRUE(xJoinOp && xJoinNode->output(0)->nusers() == 1);
291 EXPECT_TRUE(yJoinOp && yJoinNode->output(0)->nusers() == 1);
292 EXPECT_TRUE(pJoinOp && pJoinNode->output(0)->nusers() == 1);
295 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(aJoinNode->output(0)->SingleUser()),
298 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(bJoinNode->output(0)->SingleUser()),
303 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeA, 3, 1));
306 jlm::rvsdg::IsOwnerNodeOperation<MemoryStateJoinOperation>(*storeA->input(2)->origin()));
310 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
313 jlm::rvsdg::IsOwnerNodeOperation<MemoryStateJoinOperation>(*storeB->input(2)->origin()));
315 auto storeX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(pJoinNode->output(0)->SingleUser());
316 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeX, 3, 1));
320 jlm::rvsdg::IsOwnerNodeOperation<MemoryStateJoinOperation>(*storeX->input(2)->origin()));
322 auto load1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(storeX->output(0)->SingleUser());
323 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load1, 2, 2));
325 EXPECT_EQ(load1->input(1)->origin(), storeX->output(0));
327 auto load2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(load1->output(0)->SingleUser());
328 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load2, 2, 2));
329 EXPECT_EQ(load2->input(1)->origin(), storeA->output(0));
331 auto storeY = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(load2->output(0)->SingleUser());
332 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeY, 3, 1));
334 EXPECT_EQ(storeY->input(2)->origin(), storeB->output(0));
337 TEST(MemoryStateEncoderTests, loadTest2AndersenRegionAware)
342 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
346 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
348 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
351 TEST(MemoryStateEncoderTests, loadFromUndefAndersenAgnostic)
356 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
359 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
361 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
363 auto load = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
365 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 1, 1));
367 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
369 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
372 TEST(MemoryStateEncoderTests, loadFromUndefAndersenRegionAware)
377 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
381 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
383 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
385 auto load = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
387 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 1, 1));
390 TEST(MemoryStateEncoderTests, callTest1AndersenAgnostic)
395 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
399 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
401 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
403 auto loadX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
405 auto loadY = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
408 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
409 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 7));
411 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
413 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadX->input(1)->origin()),
416 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
418 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadY->input(1)->origin()),
424 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
426 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
428 auto loadX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
430 auto loadY = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
433 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
434 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 7));
436 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
438 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadX->input(1)->origin()),
441 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
442 EXPECT_TRUE(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadY->input(1)->origin()) == loadX);
447 auto callEntryMerge =
448 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*test.
CallF().
input(4)->
origin());
452 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 7, 1));
453 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 7));
456 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*test.
CallG().
input(4)->
origin());
460 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 7, 1));
461 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 7));
465 TEST(MemoryStateEncoderTests, callTest1AndersenRegionAware)
470 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
474 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
476 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
478 auto loadX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
480 auto loadY = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
483 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
484 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
486 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
488 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadX->input(1)->origin()),
491 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
493 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadY->input(1)->origin()),
499 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
501 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
503 auto loadX = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
505 auto loadY = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
508 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
509 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
511 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
513 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadX->input(1)->origin()),
516 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
517 EXPECT_EQ(jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadY->input(1)->origin()), loadX);
522 auto callEntryMerge =
523 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*test.
CallF().
input(4)->
origin());
524 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 2, 1));
529 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*test.
CallG().
input(4)->
origin());
530 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
535 TEST(MemoryStateEncoderTests, callTest2AndersenAgnostic)
539 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
545 auto stateJoin = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
547 EXPECT_TRUE(is<MemoryStateJoinOperation>(*stateJoin, 2, 1));
549 auto lambdaEntrySplit =
550 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*stateJoin->input(1)->origin());
551 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
553 auto lambdaExitMerge =
554 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(stateJoin->output(0)->SingleUser());
555 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
557 auto mallocStateLambdaEntryIndex = stateJoin->input(1)->origin()->index();
558 auto mallocStateLambdaExitIndex = stateJoin->output(0)->SingleUser().index();
559 EXPECT_EQ(mallocStateLambdaEntryIndex, mallocStateLambdaExitIndex);
573 TEST(MemoryStateEncoderTests, callTest2AndersenRegionAware)
578 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
584 auto stateJoin = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
586 EXPECT_TRUE(is<MemoryStateJoinOperation>(*stateJoin, 2, 1));
588 auto lambdaEntrySplit =
589 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*stateJoin->input(1)->origin());
590 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
592 auto lambdaExitMerge =
593 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(stateJoin->output(0)->SingleUser());
594 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
596 auto mallocStateLambdaEntryIndex = stateJoin->input(1)->origin()->index();
597 auto mallocStateLambdaExitIndex = stateJoin->output(0)->SingleUser().index();
598 EXPECT_EQ(mallocStateLambdaEntryIndex, mallocStateLambdaExitIndex);
612 TEST(MemoryStateEncoderTests, indirectCallTest1AndersenAgnostic)
617 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
623 auto lambda_exit_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
625 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 5, 1));
628 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambda_exit_mux->input(0)->origin());
629 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
631 auto call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call_exit_mux->input(0)->origin());
632 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
634 auto call_entry_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(2)->origin());
635 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
637 auto lambda_entry_mux =
638 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call_entry_mux->input(2)->origin());
639 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 5));
646 auto lambda_exit_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
648 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 5, 1));
651 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambda_exit_mux->input(0)->origin());
652 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
654 auto call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call_exit_mux->input(0)->origin());
655 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
657 auto call_entry_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(3)->origin());
658 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
661 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call_entry_mux->input(0)->origin());
662 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
664 call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call_exit_mux->input(0)->origin());
665 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
667 call_entry_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(3)->origin());
668 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
670 auto lambda_entry_mux =
671 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call_entry_mux->input(2)->origin());
672 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 5));
676 TEST(MemoryStateEncoderTests, indirectCallTest1AndersenRegionAware)
681 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
687 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
689 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
691 auto call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
693 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
695 auto callEntryMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(2)->origin());
696 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
703 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
705 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
707 auto add = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
709 EXPECT_TRUE(is<jlm::rvsdg::BinaryOperation>(*
add, 2, 1));
711 auto call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*
add->input(0)->origin());
712 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
714 auto callEntryMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(3)->origin());
715 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
717 call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*
add->input(1)->origin());
718 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
720 callEntryMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(3)->origin());
721 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
725 TEST(MemoryStateEncoderTests, indirectCallTest2AndersenAgnostic)
730 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
736 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
738 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
740 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
742 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
749 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
751 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
753 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
755 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
762 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
764 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
767 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
768 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 13));
770 auto callEntryMerge =
772 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 13, 1));
774 auto lambdaEntrySplit =
775 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*callEntryMerge->input(0)->origin());
776 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
780 TEST(MemoryStateEncoderTests, indirectCallTest2AndersenRegionAware)
785 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
791 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
793 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
800 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
802 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
809 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
811 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
813 auto callEntryMerge =
815 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
822 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
824 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
826 auto callEntryMerge =
828 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
835 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
837 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
839 auto callEntryMerge =
841 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
848 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
850 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
852 auto loadG1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
854 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1, 2, 2));
856 auto loadG2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
858 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2, 2, 2));
860 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
862 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
869 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
871 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
878 TEST(MemoryStateEncoderTests, gammaTestAndersenAgnostic)
883 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
885 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
887 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
890 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
891 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp2, 3, 3));
893 auto loadTmp1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadTmp2->input(1)->origin());
894 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp1, 3, 3));
896 auto gamma = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadTmp1->input(1)->origin());
897 EXPECT_EQ(gamma, test.
gamma);
900 TEST(MemoryStateEncoderTests, gammaTestAndersenRegionAware)
905 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
907 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
909 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
912 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
913 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp2, 2, 2));
915 auto loadTmp1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadTmp2->input(1)->origin());
916 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp1, 2, 2));
918 auto lambdaEntrySplit =
919 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadTmp1->input(1)->origin());
920 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
923 TEST(MemoryStateEncoderTests, thetaTestAndersenAgnostic)
928 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
932 auto lambda_exit_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
934 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 2, 1));
936 auto thetaOutput = lambda_exit_mux->input(0)->origin();
937 auto theta = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::ThetaNode>(*thetaOutput);
938 EXPECT_EQ(theta, test.
theta);
940 auto loopvar = theta->MapOutputLoopVar(*thetaOutput);
941 auto storeStateOutput = loopvar.post->origin();
942 auto store = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeStateOutput);
943 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 4, 2));
944 EXPECT_EQ(store->input(storeStateOutput->index() + 2)->origin(), loopvar.pre);
946 auto lambda_entry_mux = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loopvar.input->origin());
947 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 2));
950 TEST(MemoryStateEncoderTests, thetaTestAndersenRegionAware)
955 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
959 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
961 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
963 auto thetaOutput = lambdaExitMerge->input(0)->origin();
964 auto theta = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::ThetaNode>(*thetaOutput);
965 EXPECT_EQ(theta, test.
theta);
966 auto loopvar = theta->MapOutputLoopVar(*thetaOutput);
968 auto storeStateOutput = loopvar.post->origin();
969 auto store = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeStateOutput);
970 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
971 EXPECT_EQ(store->input(storeStateOutput->index() + 2)->origin(), loopvar.pre);
973 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loopvar.input->origin());
974 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
977 TEST(MemoryStateEncoderTests, deltaTest1AndersenAgnostic)
982 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
986 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
988 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 4));
992 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeF, 3, 1));
994 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeF->input(2)->origin()),
997 auto deltaStateIndex = storeF->input(2)->origin()->index();
999 auto loadF = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1001 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadF, 2, 2));
1002 EXPECT_EQ(loadF->input(1)->origin()->index(), deltaStateIndex);
1005 TEST(MemoryStateEncoderTests, deltaTest1AndersenRegionAware)
1010 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1014 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1016 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1020 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeF, 3, 1));
1022 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeF->input(2)->origin()),
1025 auto deltaStateIndex = storeF->input(2)->origin()->index();
1027 auto loadF = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1029 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadF, 2, 2));
1030 EXPECT_EQ(loadF->input(1)->origin()->index(), deltaStateIndex);
1033 TEST(MemoryStateEncoderTests, deltaTest2AndersenAgnostic)
1038 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1042 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1044 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1046 auto storeD1InF2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1048 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1050 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeD1InF2->input(2)->origin()),
1053 auto d1StateIndex = storeD1InF2->input(2)->origin()->index();
1055 auto storeD1InF1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1057 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF1, 3, 1));
1059 EXPECT_EQ(d1StateIndex, storeD1InF1->input(2)->origin()->index());
1061 auto storeD2InF2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1063 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1065 EXPECT_NE(d1StateIndex, storeD2InF2->input(2)->origin()->index());
1068 TEST(MemoryStateEncoderTests, deltaTest2AndersenRegionAware)
1073 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1079 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1081 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1084 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
1085 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeNode, 3, 1));
1087 auto lambdaEntrySplit =
1088 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeNode->input(2)->origin());
1089 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1096 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1098 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1100 auto storeD1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1102 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1, 3, 1));
1104 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeD1->input(2)->origin()),
1107 auto storeD2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1109 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD2, 3, 1));
1111 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeD2->input(2)->origin()),
1114 auto callEntryMerge =
1115 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(storeD1->output(0)->SingleUser());
1116 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1119 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callEntryMerge->output(0)->SingleUser());
1120 EXPECT_TRUE(is<CallOperation>(*callF1, 3, 2));
1122 auto callExitSplit =
1123 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callF1->output(1)->SingleUser());
1124 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1126 auto lambdaExitMerge =
1127 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callExitSplit->output(0)->SingleUser());
1128 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1132 TEST(MemoryStateEncoderTests, deltaTest3AndersenAgnostic)
1137 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1143 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1145 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1147 auto truncNode = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1149 EXPECT_TRUE(is<TruncOperation>(*truncNode, 1, 1));
1151 auto loadG1Node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*truncNode->input(0)->origin());
1152 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1Node, 2, 2));
1154 auto lambdaEntrySplit =
1155 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadG1Node->input(1)->origin());
1156 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1159 for (
size_t n = 0; n < lambdaExitMerge->ninputs(); n++)
1161 auto input = lambdaExitMerge->
input(n);
1162 auto node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*input->origin());
1163 if (is<StoreNonVolatileOperation>(node))
1169 EXPECT_NE(storeG2Node,
nullptr);
1172 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeG2Node->
input(2)->
origin());
1173 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2Node, 2, 2));
1175 auto node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadG2Node->input(1)->origin());
1176 EXPECT_EQ(node, lambdaEntrySplit);
1180 TEST(MemoryStateEncoderTests, deltaTest3AndersenRegionAware)
1185 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1191 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1193 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1195 auto truncNode = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1197 EXPECT_TRUE(is<TruncOperation>(*truncNode, 1, 1));
1199 auto loadG1Node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*truncNode->input(0)->origin());
1200 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1Node, 2, 2));
1202 auto lambdaEntrySplit =
1203 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadG1Node->input(1)->origin());
1204 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1207 for (
size_t n = 0; n < lambdaExitMerge->ninputs(); n++)
1209 auto input = lambdaExitMerge->
input(n);
1210 auto node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*input->origin());
1211 if (is<StoreNonVolatileOperation>(node))
1217 EXPECT_NE(storeG2Node,
nullptr);
1220 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeG2Node->
input(2)->
origin());
1221 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2Node, 2, 2));
1223 auto node = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*loadG2Node->input(1)->origin());
1224 EXPECT_EQ(node, lambdaEntrySplit);
1228 TEST(MemoryStateEncoderTests, importTestAndersenAgnostic)
1233 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1237 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1239 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1241 auto storeD1InF2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1243 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1245 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeD1InF2->input(2)->origin()),
1248 auto d1StateIndex = storeD1InF2->input(2)->origin()->index();
1250 auto storeD1InF1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1252 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF1, 3, 1));
1254 EXPECT_EQ(d1StateIndex, storeD1InF1->input(2)->origin()->index());
1256 auto storeD2InF2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1258 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1260 EXPECT_NE(d1StateIndex, storeD2InF2->input(2)->origin()->index());
1263 TEST(MemoryStateEncoderTests, importTestAndersenRegionAware)
1268 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1274 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1276 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1279 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
1280 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeNode, 3, 1));
1282 auto lambdaEntrySplit =
1283 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeNode->input(2)->origin());
1284 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1291 auto lambdaEntrySplit = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1293 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1295 auto storeD1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1297 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1, 3, 1));
1299 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeD1->input(2)->origin()),
1302 auto storeD2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1304 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD2, 3, 1));
1306 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*storeD2->input(2)->origin()),
1309 auto callEntryMerge =
1310 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(storeD1->output(0)->SingleUser());
1311 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1314 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callEntryMerge->output(0)->SingleUser());
1315 EXPECT_TRUE(is<CallOperation>(*callF1, 3, 2));
1317 auto callExitSplit =
1318 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callF1->output(1)->SingleUser());
1319 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1321 auto lambdaExitMerge =
1322 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callExitSplit->output(0)->SingleUser());
1323 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1327 TEST(MemoryStateEncoderTests, phiTest1AndersenAgnostic)
1332 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1334 auto [joinNode, joinOp] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
1336 EXPECT_TRUE(joinNode && joinOp);
1337 auto arrayStateIndex = joinNode->output(0)->SingleUser().index();
1339 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1341 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 4, 1));
1343 auto store = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1344 *lambdaExitMerge->input(arrayStateIndex)->origin());
1345 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1347 auto gamma = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*store->input(2)->origin());
1348 EXPECT_EQ(gamma, test.
gamma);
1350 auto gammaStateIndex = store->input(2)->origin()->index();
1352 auto load1 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1354 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load1, 2, 2));
1356 auto load2 = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*load1->input(1)->origin());
1357 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load2, 2, 2));
1359 EXPECT_EQ(load2->input(1)->origin()->index(), arrayStateIndex);
1362 TEST(MemoryStateEncoderTests, phiTest1AndersenRegionAware)
1367 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1369 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1371 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1373 auto gamma = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1375 EXPECT_EQ(gamma, test.
gamma);
1378 auto [node, op] = jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(
1380 EXPECT_EQ(op,
nullptr);
1383 TEST(MemoryStateEncoderTests, memCpyTestAndersenAgnostic)
1388 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1394 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1396 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1398 auto load = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1400 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 2, 2));
1402 auto store = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*load->input(1)->origin());
1403 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1405 auto lambdaEntrySplit =
1406 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*store->input(2)->origin());
1407 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1414 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1416 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1418 auto callExitSplit =
1419 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
1420 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 5));
1422 auto call = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*callExitSplit->input(0)->origin());
1423 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
1425 auto callEntryMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*call->input(2)->origin());
1426 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 5, 1));
1429 for (
size_t n = 0; n < callEntryMerge->ninputs(); n++)
1432 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*callEntryMerge->input(n)->origin());
1433 if (is<MemCpyNonVolatileOperation>(node))
1436 EXPECT_NE(memcpy,
nullptr);
1437 EXPECT_TRUE(is<MemCpyNonVolatileOperation>(*memcpy, 5, 2));
1439 auto lambdaEntrySplit =
1440 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*memcpy->
input(4)->
origin());
1441 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1445 TEST(MemoryStateEncoderTests, memCpyAndersenRegionAware)
1450 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1456 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1458 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1460 auto load = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1462 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 2, 2));
1464 auto store = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*load->input(1)->origin());
1465 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1467 auto lambdaEntrySplit =
1468 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*store->input(2)->origin());
1469 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1476 auto callNode = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1478 EXPECT_TRUE(is<CallOperation>(*callNode, 3, 3));
1480 auto callEntryMerge =
1481 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*callNode->input(2)->origin());
1482 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1484 auto callExitSplit =
1485 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callNode->output(2)->SingleUser());
1486 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1489 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*callEntryMerge->input(0)->origin());
1490 EXPECT_TRUE(is<MemCpyNonVolatileOperation>(*memcpyNode, 5, 2));
1492 auto lambdaEntrySplit =
1493 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*memcpyNode->input(3)->origin());
1494 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1496 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*memcpyNode->input(4)->origin()),
1499 auto lambdaExitMerge =
1500 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(callExitSplit->output(0)->SingleUser());
1501 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1505 TEST(MemoryStateEncoderTests, freeNullTestAndersenAgnostic)
1511 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1513 auto lambdaExitMerge = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1515 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1517 auto free = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(
1519 EXPECT_TRUE(is<FreeOperation>(*free, 2, 1));
1521 auto lambdaEntrySplit =
1522 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaExitMerge->input(0)->origin());
1523 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1526 TEST(MemoryStateEncoderTests, LambdaMemoryStateArgumentMultipleUsers)
1533 auto bitType32 = BitType::Create(32);
1537 auto functionTypeOne = FunctionType::Create(
1538 { ioStateType, memoryStateType },
1539 { bitType32, ioStateType, memoryStateType });
1540 auto functionTypeMain = FunctionType::Create(
1541 { pointerType, ioStateType, memoryStateType },
1542 { bitType32, ioStateType, memoryStateType });
1545 auto & rvsdg = rvsdgModule.Rvsdg();
1549 lambdaOne = LambdaNode::Create(
1550 rvsdg.GetRootRegion(),
1557 lambdaOne->
finalize({
one.output(0), ioStateArgument, memoryStateArgument });
1562 lambdaMain = LambdaNode::Create(
1563 rvsdg.GetRootRegion(),
1573 { ioStateArgument, memoryStateArgument });
1577 { memoryStateArgument },
1581 auto & addNode = CreateOpNode<IntegerAddOperation>({ callResults[0], loadNode.output(0) }, 32);
1583 lambdaMain->
finalize({ addNode.output(0), callResults[1], loadNode.output(1) });
1586 GraphExport::Create(*lambdaMain->
output(),
"main");
1588 view(rvsdg, stdout);
1591 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(rvsdgModule);
1593 view(rvsdg, stdout);
1597 auto lambdaExitMerge =
1599 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1601 auto loadNode = TryGetOwnerNode<SimpleNode>(*lambdaExitMerge->input(0)->origin());
1602 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadNode, 2, 2));
1604 auto lambdaEntrySplit = TryGetOwnerNode<SimpleNode>(*loadNode->input(1)->origin());
1605 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1607 auto addNode = TryGetOwnerNode<SimpleNode>(*lambdaMain->
GetFunctionResults()[0]->origin());
1608 EXPECT_TRUE(is<IntegerAddOperation>(*addNode, 2, 1));
1610 auto callNode = TryGetOwnerNode<SimpleNode>(*addNode->input(0)->origin());
1611 EXPECT_TRUE(is<CallOperation>(*callNode, 3, 3));
1614 auto callEntryMergeNode =
1616 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMergeNode, 0, 1));
static jlm::util::StatisticsCollector statisticsCollector
static void encodeStates(jlm::rvsdg::RvsdgModule &rvsdgModule)
TEST(MemoryStateEncoderTests, storeTest1AndersenAgnostic)
static bool is(const jlm::rvsdg::Node &node, size_t numInputs, size_t numOutputs)
static rvsdg::Input & GetMemoryStateInput(const rvsdg::Node &node) noexcept
static rvsdg::Output & GetMemoryStateOutput(const rvsdg::Node &node) noexcept
static std::vector< rvsdg::Output * > Create(rvsdg::Output *function, std::shared_ptr< const rvsdg::FunctionType > functionType, const std::vector< rvsdg::Output * > &arguments)
const rvsdg::SimpleNode & CallG() const noexcept
jlm::rvsdg::LambdaNode * lambda_g
jlm::rvsdg::LambdaNode * lambda_f
const rvsdg::SimpleNode & CallF() const noexcept
jlm::rvsdg::LambdaNode * lambda_test
jlm::rvsdg::LambdaNode * lambda_create
jlm::rvsdg::LambdaNode * lambda_destroy
rvsdg::SimpleNode * malloc
jlm::rvsdg::LambdaNode * lambda_h
rvsdg::Node * constantFive
jlm::rvsdg::LambdaNode * lambda_g
jlm::rvsdg::LambdaNode * lambda_f2
jlm::rvsdg::LambdaNode * lambda_f1
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
RVSDG module with a call to free(NULL).
rvsdg::LambdaNode & LambdaMain() const noexcept
jlm::rvsdg::LambdaNode * lambda
static std::shared_ptr< const IOStateType > Create()
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda_f2
const jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
const jlm::rvsdg::LambdaNode & GetLambdaIndcall() const noexcept
rvsdg::SimpleNode & GetCallIWithFour() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaI() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
rvsdg::SimpleNode & GetCallIWithThree() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaTest2() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaX() const noexcept
rvsdg::SimpleNode & GetIndirectCall() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaY() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaThree() const noexcept
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
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)
const jlm::rvsdg::LambdaNode & Lambda() const noexcept
static rvsdg::SimpleNode & CreateNode(rvsdg::Region ®ion, std::unique_ptr< LoadNonVolatileOperation > loadOperation, const std::vector< rvsdg::Output * > &operands)
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_p
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_y
rvsdg::SimpleNode * alloca_a
rvsdg::SimpleNode * alloca_x
rvsdg::SimpleNode * alloca_b
static rvsdg::Output & memoryStateOutput(const rvsdg::Node &node)
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaG() const noexcept
static std::shared_ptr< const MemoryStateType > Create()
rvsdg::SimpleNode * alloca
jlm::rvsdg::LambdaNode * lambda_fib
static std::shared_ptr< const PointerType > Create()
jlm::llvm::LlvmRvsdgModule & module()
rvsdg::SimpleNode * alloca_c
rvsdg::SimpleNode * alloca_a
rvsdg::SimpleNode * alloca_d
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_b
rvsdg::SimpleNode * alloca_p
jlm::rvsdg::LambdaNode * lambda
rvsdg::SimpleNode * alloca_y
rvsdg::SimpleNode * alloca_x
rvsdg::SimpleNode * alloca_b
rvsdg::SimpleNode * alloca_a
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::ThetaNode * theta
void Encode(rvsdg::RvsdgModule &rvsdgModule, const ModRefSummary &modRefSummary, util::StatisticsCollector &statisticsCollector)
static std::string dumpDot(const PointsToGraph &pointsToGraph)
std::vector< ExitVar > GetExitVars() const
Gets all exit variables for this gamma.
Region & GetRootRegion() const noexcept
rvsdg::Output * finalize(const std::vector< jlm::rvsdg::Output * > &results)
std::vector< rvsdg::Output * > GetFunctionArguments() const
rvsdg::Region * subregion() const noexcept
ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context/free variable to the lambda node.
std::vector< rvsdg::Input * > GetFunctionResults() const
rvsdg::Output * output() const noexcept
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
size_t ninputs() const noexcept
size_t noutputs() const noexcept
rvsdg::Input & SingleUser() noexcept
bool IsDead() const noexcept
size_t nusers() const noexcept
size_t numNodes() const noexcept
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
Global memory state passed between functions.
rvsdg::Input & GetMemoryStateRegionResult(const rvsdg::LambdaNode &lambdaNode) noexcept
std::string view(const rvsdg::Region *region)