6#include <gtest/gtest.h>
24template<
class Analysis,
class TModRefSummarizer>
29 std::is_base_of_v<jlm::llvm::aa::PointsToAnalysis, Analysis>,
30 "Analysis should be derived from PointsToAnalysis class.");
33 std::is_base_of_v<jlm::llvm::aa::ModRefSummarizer, TModRefSummarizer>,
34 "TModRefSummarizer should be derived from ModRefSummarizer class.");
40 Analysis aliasAnalysis;
44 TModRefSummarizer summarizer;
49 std::cout <<
"run encoder\n";
61TEST(MemoryStateEncoderTests, storeTest1AndersenAgnostic)
66 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
72 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 6, 1));
83 EXPECT_TRUE(aJoinOp && aJoinNode->output(0)->nusers() == 1);
84 EXPECT_TRUE(bJoinOp && bJoinNode->output(0)->nusers() == 1);
85 EXPECT_TRUE(cJoinOp && cJoinNode->output(0)->nusers() == 1);
86 EXPECT_TRUE(dJoinOp && dJoinNode->output(0)->nusers() == 1);
94 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD, 3, 1));
99 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeC, 3, 1));
104 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
109TEST(MemoryStateEncoderTests, storeTest1AndersenRegionAware)
114 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
120 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
123TEST(MemoryStateEncoderTests, storeTest2AndersenAgnostic)
128 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
134 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
147 EXPECT_TRUE(aJoinOp && aJoinNode->output(0)->nusers() == 1);
148 EXPECT_TRUE(bJoinOp && bJoinNode->output(0)->nusers() == 1);
149 EXPECT_TRUE(xJoinOp && xJoinNode->output(0)->nusers() == 1);
150 EXPECT_TRUE(yJoinOp && yJoinNode->output(0)->nusers() == 1);
151 EXPECT_TRUE(pJoinOp && pJoinNode->output(0)->nusers() == 1);
162 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeA, 3, 1));
170 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
177 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeX, 3, 1));
184 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeY, 3, 1));
187 EXPECT_EQ(storeY->input(2)->origin(), storeX->output(0));
190TEST(MemoryStateEncoderTests, storeTest2AndersenRegionAware)
195 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
201 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
204TEST(MemoryStateEncoderTests, loadTest1AndersenAgnostic)
209 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
215 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
219 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
225 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadA, 3, 3));
228 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 3, 3));
235TEST(MemoryStateEncoderTests, loadTest1AndersenRegionAware)
240 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
246 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
250 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
256 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadA, 2, 2));
259 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
266TEST(MemoryStateEncoderTests, loadTest2AndersenAgnostic)
270 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
276 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
289 EXPECT_TRUE(aJoinOp && aJoinNode->output(0)->nusers() == 1);
290 EXPECT_TRUE(bJoinOp && bJoinNode->output(0)->nusers() == 1);
291 EXPECT_TRUE(xJoinOp && xJoinNode->output(0)->nusers() == 1);
292 EXPECT_TRUE(yJoinOp && yJoinNode->output(0)->nusers() == 1);
293 EXPECT_TRUE(pJoinOp && pJoinNode->output(0)->nusers() == 1);
304 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeA, 3, 1));
311 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
317 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeX, 3, 1));
324 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load1, 2, 2));
326 EXPECT_EQ(load1->input(1)->origin(), storeX->output(0));
329 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load2, 2, 2));
330 EXPECT_EQ(load2->input(1)->origin(), storeA->output(0));
333 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeY, 3, 1));
335 EXPECT_EQ(storeY->input(2)->origin(), storeB->output(0));
338TEST(MemoryStateEncoderTests, loadTest2AndersenRegionAware)
343 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
349 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
352TEST(MemoryStateEncoderTests, loadFromUndefAndersenAgnostic)
357 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
362 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
366 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 1, 1));
370 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
373TEST(MemoryStateEncoderTests, loadFromUndefAndersenRegionAware)
378 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
384 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
388 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 1, 1));
391TEST(MemoryStateEncoderTests, callTest1AndersenAgnostic)
396 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
409 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
410 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 7));
412 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
417 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
434 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
435 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 7));
437 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
442 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
448 auto callEntryMerge =
453 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 7, 1));
454 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 7));
461 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 7, 1));
462 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 7));
466TEST(MemoryStateEncoderTests, callTest1AndersenRegionAware)
471 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
484 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
485 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
487 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
492 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
509 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
510 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
512 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
517 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
523 auto callEntryMerge =
525 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 2, 1));
531 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
536TEST(MemoryStateEncoderTests, callTest2AndersenAgnostic)
540 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
547 MallocOperation::memoryStateOutput(*test.
malloc).SingleUser());
548 EXPECT_TRUE(is<MemoryStateJoinOperation>(*stateJoin, 2, 1));
550 auto lambdaEntrySplit =
552 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
554 auto lambdaExitMerge =
556 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
558 auto mallocStateLambdaEntryIndex = stateJoin->input(1)->origin()->index();
559 auto mallocStateLambdaExitIndex = stateJoin->output(0)->SingleUser().index();
560 EXPECT_EQ(mallocStateLambdaEntryIndex, mallocStateLambdaExitIndex);
574TEST(MemoryStateEncoderTests, callTest2AndersenRegionAware)
579 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
586 MallocOperation::memoryStateOutput(*test.
malloc).SingleUser());
587 EXPECT_TRUE(is<MemoryStateJoinOperation>(*stateJoin, 2, 1));
589 auto lambdaEntrySplit =
591 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
593 auto lambdaExitMerge =
595 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
597 auto mallocStateLambdaEntryIndex = stateJoin->input(1)->origin()->index();
598 auto mallocStateLambdaExitIndex = stateJoin->output(0)->SingleUser().index();
599 EXPECT_EQ(mallocStateLambdaEntryIndex, mallocStateLambdaExitIndex);
613TEST(MemoryStateEncoderTests, indirectCallTest1AndersenAgnostic)
618 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
626 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 5, 1));
630 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
633 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
636 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
638 auto lambda_entry_mux =
640 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 5));
649 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 5, 1));
653 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
656 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
659 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
663 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
666 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
669 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
671 auto lambda_entry_mux =
673 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 5));
677TEST(MemoryStateEncoderTests, indirectCallTest1AndersenRegionAware)
682 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
690 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
694 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
697 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
706 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
710 EXPECT_TRUE(is<jlm::rvsdg::BinaryOperation>(*add, 2, 1));
713 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
716 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
719 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
722 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
726TEST(MemoryStateEncoderTests, indirectCallTest2AndersenAgnostic)
731 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
739 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
743 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
752 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
756 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
765 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
769 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 13));
771 auto callEntryMerge =
773 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 13, 1));
775 auto lambdaEntrySplit =
777 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
781TEST(MemoryStateEncoderTests, indirectCallTest2AndersenRegionAware)
786 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
794 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
803 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
812 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
814 auto callEntryMerge =
816 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
825 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
827 auto callEntryMerge =
829 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
838 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
840 auto callEntryMerge =
842 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
854 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
860 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1, 1, 1));
864 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2, 1, 1));
876 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
880TEST(MemoryStateEncoderTests, gammaTestAndersenAgnostic)
885 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
889 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
893 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp2, 3, 3));
896 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp1, 3, 3));
899 EXPECT_EQ(gamma, test.
gamma);
902TEST(MemoryStateEncoderTests, gammaTestAndersenRegionAware)
907 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
911 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
915 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp2, 2, 2));
918 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp1, 2, 2));
920 auto lambdaEntrySplit =
922 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
925TEST(MemoryStateEncoderTests, thetaTestAndersenAgnostic)
930 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
941 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 2, 1));
943 auto thetaOutput = lambda_exit_mux->input(0)->origin();
945 EXPECT_EQ(theta, test.
theta);
947 auto loopvar = theta->MapOutputLoopVar(*thetaOutput);
948 auto storeStateOutput = loopvar.post->origin();
950 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 4, 2));
951 EXPECT_EQ(store->input(storeStateOutput->index() + 2)->origin(), loopvar.pre);
954 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 2));
957TEST(MemoryStateEncoderTests, thetaTestAndersenRegionAware)
962 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
973 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
975 auto thetaOutput = lambdaExitMerge->input(0)->origin();
977 EXPECT_EQ(theta, test.
theta);
978 auto loopvar = theta->MapOutputLoopVar(*thetaOutput);
980 auto storeStateOutput = loopvar.post->origin();
982 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
983 EXPECT_EQ(store->input(storeStateOutput->index() + 2)->origin(), loopvar.pre);
986 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
989TEST(MemoryStateEncoderTests, deltaTest1AndersenAgnostic)
994 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1000 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 4));
1004 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeF, 3, 1));
1009 auto deltaStateIndex = storeF->input(2)->origin()->index();
1013 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadF, 2, 2));
1014 EXPECT_EQ(loadF->input(1)->origin()->index(), deltaStateIndex);
1017TEST(MemoryStateEncoderTests, deltaTest1AndersenRegionAware)
1022 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1028 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1032 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeF, 3, 1));
1037 auto deltaStateIndex = storeF->input(2)->origin()->index();
1041 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadF, 2, 2));
1042 EXPECT_EQ(loadF->input(1)->origin()->index(), deltaStateIndex);
1045TEST(MemoryStateEncoderTests, deltaTest2AndersenAgnostic)
1050 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1056 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1060 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1065 auto d1StateIndex = storeD1InF2->input(2)->origin()->index();
1069 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF1, 3, 1));
1071 EXPECT_EQ(d1StateIndex, storeD1InF1->input(2)->origin()->index());
1075 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1077 EXPECT_NE(d1StateIndex, storeD2InF2->input(2)->origin()->index());
1080TEST(MemoryStateEncoderTests, deltaTest2AndersenRegionAware)
1085 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1093 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1097 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeNode, 3, 1));
1099 auto lambdaEntrySplit =
1101 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1110 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1114 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1, 3, 1));
1121 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD2, 3, 1));
1126 auto callEntryMerge =
1128 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1132 EXPECT_TRUE(is<CallOperation>(*callF1, 3, 2));
1134 auto callExitSplit =
1136 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1138 auto lambdaExitMerge =
1140 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1144TEST(MemoryStateEncoderTests, deltaTest3AndersenAgnostic)
1149 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1157 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1161 EXPECT_TRUE(is<TruncOperation>(*truncNode, 1, 1));
1164 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1Node, 2, 2));
1166 auto lambdaEntrySplit =
1168 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1171 for (
size_t n = 0; n < lambdaExitMerge->ninputs(); n++)
1173 auto input = lambdaExitMerge->
input(n);
1175 if (is<StoreNonVolatileOperation>(node))
1181 EXPECT_NE(storeG2Node,
nullptr);
1185 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2Node, 2, 2));
1188 EXPECT_EQ(node, lambdaEntrySplit);
1192TEST(MemoryStateEncoderTests, deltaTest3AndersenRegionAware)
1197 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1205 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1209 EXPECT_TRUE(is<TruncOperation>(*truncNode, 1, 1));
1213 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1Node, 1, 1));
1216 for (
size_t n = 0; n < lambdaExitMerge->ninputs(); n++)
1218 auto input = lambdaExitMerge->
input(n);
1220 if (is<StoreNonVolatileOperation>(node))
1226 EXPECT_NE(storeG2Node,
nullptr);
1230 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2Node, 2, 2));
1233 auto lambdaEntrySplit =
1235 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1239TEST(MemoryStateEncoderTests, importTestAndersenAgnostic)
1244 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1250 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1254 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1259 auto d1StateIndex = storeD1InF2->input(2)->origin()->index();
1263 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF1, 3, 1));
1265 EXPECT_EQ(d1StateIndex, storeD1InF1->input(2)->origin()->index());
1269 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1271 EXPECT_NE(d1StateIndex, storeD2InF2->input(2)->origin()->index());
1274TEST(MemoryStateEncoderTests, importTestAndersenRegionAware)
1279 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1287 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1291 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeNode, 3, 1));
1293 auto lambdaEntrySplit =
1295 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1304 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1308 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1, 3, 1));
1315 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD2, 3, 1));
1320 auto callEntryMerge =
1322 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1326 EXPECT_TRUE(is<CallOperation>(*callF1, 3, 2));
1328 auto callExitSplit =
1330 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1332 auto lambdaExitMerge =
1334 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1338TEST(MemoryStateEncoderTests, phiTest1AndersenAgnostic)
1343 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1347 EXPECT_TRUE(joinNode && joinOp);
1348 auto arrayStateIndex = joinNode->output(0)->SingleUser().index();
1352 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 4, 1));
1355 *lambdaExitMerge->input(arrayStateIndex)->origin());
1356 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1359 EXPECT_EQ(gamma, test.
gamma);
1361 auto gammaStateIndex = store->input(2)->origin()->index();
1365 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load1, 2, 2));
1368 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load2, 2, 2));
1370 EXPECT_EQ(load2->input(1)->origin()->index(), arrayStateIndex);
1373TEST(MemoryStateEncoderTests, phiTest1AndersenRegionAware)
1378 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1382 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1386 EXPECT_EQ(gamma, test.
gamma);
1391 EXPECT_EQ(op,
nullptr);
1394TEST(MemoryStateEncoderTests, memCpyTestAndersenAgnostic)
1399 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1407 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1411 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 2, 2));
1414 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1416 auto lambdaEntrySplit =
1418 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1427 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1429 auto callExitSplit =
1431 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 5));
1434 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
1437 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 5, 1));
1440 for (
size_t n = 0; n < callEntryMerge->ninputs(); n++)
1444 if (is<MemCpyNonVolatileOperation>(node))
1447 EXPECT_NE(memcpy,
nullptr);
1448 EXPECT_TRUE(is<MemCpyNonVolatileOperation>(*memcpy, 5, 2));
1450 auto lambdaEntrySplit =
1452 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1456TEST(MemoryStateEncoderTests, memCpyAndersenRegionAware)
1461 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1469 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1473 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 2, 2));
1476 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1478 auto lambdaEntrySplit =
1480 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1489 EXPECT_TRUE(is<CallOperation>(*callNode, 3, 3));
1491 auto callEntryMerge =
1493 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1495 auto callExitSplit =
1497 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1501 EXPECT_TRUE(is<MemCpyNonVolatileOperation>(*memcpyNode, 5, 2));
1503 auto lambdaEntrySplit =
1505 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1510 auto lambdaExitMerge =
1512 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1516TEST(MemoryStateEncoderTests, freeNullTestAndersenAgnostic)
1522 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1526 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1530 EXPECT_TRUE(is<FreeOperation>(*free, 2, 1));
1532 auto lambdaEntrySplit =
1534 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1537TEST(MemoryStateEncoderTests, LambdaMemoryStateArgumentMultipleUsers)
1544 auto bitType32 = BitType::Create(32);
1545 auto ioStateType = IOStateType::Create();
1546 auto memoryStateType = MemoryStateType::Create();
1547 auto pointerType = PointerType::Create();
1548 auto functionTypeOne = FunctionType::Create(
1549 { ioStateType, memoryStateType },
1550 { bitType32, ioStateType, memoryStateType });
1551 auto functionTypeMain = FunctionType::Create(
1552 { pointerType, ioStateType, memoryStateType },
1553 { bitType32, ioStateType, memoryStateType });
1556 auto & rvsdg = rvsdgModule.Rvsdg();
1560 lambdaOne = LambdaNode::Create(
1561 rvsdg.GetRootRegion(),
1562 LlvmLambdaOperation::Create(functionTypeOne,
"one", Linkage::privateLinkage));
1566 auto & one = IntegerConstantOperation::Create(*lambdaOne->
subregion(), 32, 1);
1568 lambdaOne->
finalize({ one.output(0), ioStateArgument, memoryStateArgument });
1573 lambdaMain = LambdaNode::Create(
1574 rvsdg.GetRootRegion(),
1575 LlvmLambdaOperation::Create(functionTypeMain,
"main", Linkage::externalLinkage));
1581 auto callResults = CallOperation::Create(
1584 { ioStateArgument, memoryStateArgument });
1586 auto & loadNode = LoadNonVolatileOperation::CreateNode(
1588 { memoryStateArgument },
1592 auto & addNode = CreateOpNode<IntegerAddOperation>({ callResults[0], loadNode.output(0) }, 32);
1594 lambdaMain->
finalize({ addNode.output(0), callResults[1], loadNode.output(1) });
1597 GraphExport::Create(*lambdaMain->
output(),
"main");
1599 view(rvsdg, stdout);
1602 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(rvsdgModule);
1604 view(rvsdg, stdout);
1608 auto lambdaExitMerge =
1609 TryGetOwnerNode<SimpleNode>(*GetMemoryStateRegionResult(*lambdaMain).
origin());
1610 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1612 auto loadNode = TryGetOwnerNode<SimpleNode>(*lambdaExitMerge->input(0)->origin());
1613 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadNode, 2, 2));
1615 auto lambdaEntrySplit = TryGetOwnerNode<SimpleNode>(*loadNode->input(1)->origin());
1616 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1618 auto addNode = TryGetOwnerNode<SimpleNode>(*lambdaMain->
GetFunctionResults()[0]->origin());
1619 EXPECT_TRUE(is<IntegerAddOperation>(*addNode, 2, 1));
1621 auto callNode = TryGetOwnerNode<SimpleNode>(*addNode->input(0)->origin());
1622 EXPECT_TRUE(is<CallOperation>(*callNode, 3, 3));
1623 EXPECT_TRUE(CallOperation::GetMemoryStateOutput(*callNode).IsDead());
1625 auto callEntryMergeNode =
1626 TryGetOwnerNode<SimpleNode>(*CallOperation::GetMemoryStateInput(*callNode).origin());
1627 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMergeNode, 0, 1));
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 jlm::util::StatisticsCollector statisticsCollector
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
Dead Node Elimination Optimization.
void run(rvsdg::Region ®ion)
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
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 & GetCallIWithThree() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaY() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaTest2() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
rvsdg::SimpleNode & GetIndirectCall() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaThree() const noexcept
rvsdg::SimpleNode & GetCallIWithFour() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaX() const noexcept
jlm::rvsdg::LambdaNode & GetLambdaI() const noexcept
const jlm::rvsdg::LambdaNode & Lambda() const noexcept
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
const jlm::rvsdg::LambdaNode & LambdaG() const noexcept
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
rvsdg::SimpleNode * alloca
jlm::rvsdg::LambdaNode * lambda_fib
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
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
rvsdg::Region * subregion() 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
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.
std::string view(const rvsdg::Region *region)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.