6#include <gtest/gtest.h>
23template<
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";
60TEST(MemoryStateEncoderTests, storeTest1AndersenAgnostic)
65 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
71 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 6, 1));
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);
93 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD, 3, 1));
98 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeC, 3, 1));
103 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
108TEST(MemoryStateEncoderTests, storeTest1AndersenRegionAware)
113 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
119 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
122TEST(MemoryStateEncoderTests, storeTest2AndersenAgnostic)
127 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
133 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
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);
161 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeA, 3, 1));
169 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
176 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeX, 3, 1));
183 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeY, 3, 1));
186 EXPECT_EQ(storeY->input(2)->origin(), storeX->output(0));
189TEST(MemoryStateEncoderTests, storeTest2AndersenRegionAware)
194 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
200 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
203TEST(MemoryStateEncoderTests, loadTest1AndersenAgnostic)
208 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
214 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
218 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
224 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadA, 3, 3));
227 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 3, 3));
234TEST(MemoryStateEncoderTests, loadTest1AndersenRegionAware)
239 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
245 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
249 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
255 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadA, 2, 2));
258 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
265TEST(MemoryStateEncoderTests, loadTest2AndersenAgnostic)
269 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
275 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
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);
303 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeA, 3, 1));
310 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeB, 3, 1));
316 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeX, 3, 1));
323 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load1, 2, 2));
325 EXPECT_EQ(load1->input(1)->origin(), storeX->output(0));
328 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load2, 2, 2));
329 EXPECT_EQ(load2->input(1)->origin(), storeA->output(0));
332 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeY, 3, 1));
334 EXPECT_EQ(storeY->input(2)->origin(), storeB->output(0));
337TEST(MemoryStateEncoderTests, loadTest2AndersenRegionAware)
342 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
348 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
351TEST(MemoryStateEncoderTests, loadFromUndefAndersenAgnostic)
356 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
361 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
365 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 1, 1));
369 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
372TEST(MemoryStateEncoderTests, loadFromUndefAndersenRegionAware)
377 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
383 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
387 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 1, 1));
390TEST(MemoryStateEncoderTests, callTest1AndersenAgnostic)
395 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
408 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
409 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 7));
411 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
416 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
433 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 7, 1));
434 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 7));
436 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
441 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
447 auto callEntryMerge =
452 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 7, 1));
453 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 7));
460 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 7, 1));
461 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 7));
465TEST(MemoryStateEncoderTests, callTest1AndersenRegionAware)
470 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
483 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
484 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
486 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
491 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
508 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
509 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
511 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadX, 2, 2));
516 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadY, 2, 2));
522 auto callEntryMerge =
524 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 2, 1));
530 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
535TEST(MemoryStateEncoderTests, callTest2AndersenAgnostic)
539 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
546 MallocOperation::memoryStateOutput(*test.
malloc).SingleUser());
547 EXPECT_TRUE(is<MemoryStateJoinOperation>(*stateJoin, 2, 1));
549 auto lambdaEntrySplit =
551 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
553 auto lambdaExitMerge =
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);
573TEST(MemoryStateEncoderTests, callTest2AndersenRegionAware)
578 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
585 MallocOperation::memoryStateOutput(*test.
malloc).SingleUser());
586 EXPECT_TRUE(is<MemoryStateJoinOperation>(*stateJoin, 2, 1));
588 auto lambdaEntrySplit =
590 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
592 auto lambdaExitMerge =
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);
612TEST(MemoryStateEncoderTests, indirectCallTest1AndersenAgnostic)
617 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
625 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 5, 1));
629 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
632 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
635 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
637 auto lambda_entry_mux =
639 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 5));
648 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 5, 1));
652 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
655 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
658 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
662 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*call_exit_mux, 1, 5));
665 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
668 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*call_entry_mux, 5, 1));
670 auto lambda_entry_mux =
672 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 5));
676TEST(MemoryStateEncoderTests, indirectCallTest1AndersenRegionAware)
681 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
689 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
693 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
696 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
705 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
709 EXPECT_TRUE(is<jlm::rvsdg::BinaryOperation>(*add, 2, 1));
712 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
715 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
718 EXPECT_TRUE(is<CallOperation>(*call, 4, 3));
721 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
725TEST(MemoryStateEncoderTests, indirectCallTest2AndersenAgnostic)
730 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
738 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
742 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
751 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
755 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
764 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 13, 1));
768 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 13));
770 auto callEntryMerge =
772 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 13, 1));
774 auto lambdaEntrySplit =
776 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 13));
780TEST(MemoryStateEncoderTests, indirectCallTest2AndersenRegionAware)
785 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
793 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
802 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
811 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
813 auto callEntryMerge =
815 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
824 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
826 auto callEntryMerge =
828 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
837 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
839 auto callEntryMerge =
841 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 0, 1));
853 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
859 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1, 1, 1));
863 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2, 1, 1));
875 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 0, 1));
879TEST(MemoryStateEncoderTests, gammaTestAndersenAgnostic)
884 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
888 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
892 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp2, 3, 3));
895 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp1, 3, 3));
898 EXPECT_EQ(gamma, test.
gamma);
901TEST(MemoryStateEncoderTests, gammaTestAndersenRegionAware)
906 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
910 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
914 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp2, 2, 2));
917 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadTmp1, 2, 2));
919 auto lambdaEntrySplit =
921 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
924TEST(MemoryStateEncoderTests, thetaTestAndersenAgnostic)
929 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
935 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambda_exit_mux, 2, 1));
937 auto thetaOutput = lambda_exit_mux->input(0)->origin();
939 EXPECT_EQ(theta, test.
theta);
941 auto loopvar = theta->MapOutputLoopVar(*thetaOutput);
942 auto storeStateOutput = loopvar.post->origin();
944 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 4, 2));
945 EXPECT_EQ(store->input(storeStateOutput->index() + 2)->origin(), loopvar.pre);
948 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambda_entry_mux, 1, 2));
951TEST(MemoryStateEncoderTests, thetaTestAndersenRegionAware)
956 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
962 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
964 auto thetaOutput = lambdaExitMerge->input(0)->origin();
966 EXPECT_EQ(theta, test.
theta);
967 auto loopvar = theta->MapOutputLoopVar(*thetaOutput);
969 auto storeStateOutput = loopvar.post->origin();
971 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
972 EXPECT_EQ(store->input(storeStateOutput->index() + 2)->origin(), loopvar.pre);
975 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
978TEST(MemoryStateEncoderTests, deltaTest1AndersenAgnostic)
983 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
989 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 4));
993 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeF, 3, 1));
998 auto deltaStateIndex = storeF->input(2)->origin()->index();
1002 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadF, 2, 2));
1003 EXPECT_EQ(loadF->input(1)->origin()->index(), deltaStateIndex);
1006TEST(MemoryStateEncoderTests, deltaTest1AndersenRegionAware)
1011 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1017 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1021 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeF, 3, 1));
1026 auto deltaStateIndex = storeF->input(2)->origin()->index();
1030 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadF, 2, 2));
1031 EXPECT_EQ(loadF->input(1)->origin()->index(), deltaStateIndex);
1034TEST(MemoryStateEncoderTests, deltaTest2AndersenAgnostic)
1039 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1045 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1049 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1054 auto d1StateIndex = storeD1InF2->input(2)->origin()->index();
1058 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF1, 3, 1));
1060 EXPECT_EQ(d1StateIndex, storeD1InF1->input(2)->origin()->index());
1064 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1066 EXPECT_NE(d1StateIndex, storeD2InF2->input(2)->origin()->index());
1069TEST(MemoryStateEncoderTests, deltaTest2AndersenRegionAware)
1074 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1082 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1086 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeNode, 3, 1));
1088 auto lambdaEntrySplit =
1090 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1099 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1103 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1, 3, 1));
1110 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD2, 3, 1));
1115 auto callEntryMerge =
1117 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1121 EXPECT_TRUE(is<CallOperation>(*callF1, 3, 2));
1123 auto callExitSplit =
1125 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1127 auto lambdaExitMerge =
1129 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1133TEST(MemoryStateEncoderTests, deltaTest3AndersenAgnostic)
1138 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1146 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1150 EXPECT_TRUE(is<TruncOperation>(*truncNode, 1, 1));
1153 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1Node, 2, 2));
1155 auto lambdaEntrySplit =
1157 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1160 for (
size_t n = 0; n < lambdaExitMerge->ninputs(); n++)
1162 auto input = lambdaExitMerge->
input(n);
1164 if (is<StoreNonVolatileOperation>(node))
1170 EXPECT_NE(storeG2Node,
nullptr);
1174 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2Node, 2, 2));
1177 EXPECT_EQ(node, lambdaEntrySplit);
1181TEST(MemoryStateEncoderTests, deltaTest3AndersenRegionAware)
1186 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1194 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1198 EXPECT_TRUE(is<TruncOperation>(*truncNode, 1, 1));
1202 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG1Node, 1, 1));
1205 for (
size_t n = 0; n < lambdaExitMerge->ninputs(); n++)
1207 auto input = lambdaExitMerge->
input(n);
1209 if (is<StoreNonVolatileOperation>(node))
1215 EXPECT_NE(storeG2Node,
nullptr);
1219 EXPECT_TRUE(is<LoadNonVolatileOperation>(*loadG2Node, 2, 2));
1222 auto lambdaEntrySplit =
1224 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1228TEST(MemoryStateEncoderTests, importTestAndersenAgnostic)
1233 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1239 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1243 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1248 auto d1StateIndex = storeD1InF2->input(2)->origin()->index();
1252 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF1, 3, 1));
1254 EXPECT_EQ(d1StateIndex, storeD1InF1->input(2)->origin()->index());
1258 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1InF2, 3, 1));
1260 EXPECT_NE(d1StateIndex, storeD2InF2->input(2)->origin()->index());
1263TEST(MemoryStateEncoderTests, importTestAndersenRegionAware)
1268 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1276 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1280 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeNode, 3, 1));
1282 auto lambdaEntrySplit =
1284 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1293 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1297 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD1, 3, 1));
1304 EXPECT_TRUE(is<StoreNonVolatileOperation>(*storeD2, 3, 1));
1309 auto callEntryMerge =
1311 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1315 EXPECT_TRUE(is<CallOperation>(*callF1, 3, 2));
1317 auto callExitSplit =
1319 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1321 auto lambdaExitMerge =
1323 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1327TEST(MemoryStateEncoderTests, phiTest1AndersenAgnostic)
1332 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1336 EXPECT_TRUE(joinNode && joinOp);
1337 auto arrayStateIndex = joinNode->output(0)->SingleUser().index();
1341 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 4, 1));
1344 *lambdaExitMerge->input(arrayStateIndex)->origin());
1345 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1348 EXPECT_EQ(gamma, test.
gamma);
1350 auto gammaStateIndex = store->input(2)->origin()->index();
1354 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load1, 2, 2));
1357 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load2, 2, 2));
1359 EXPECT_EQ(load2->input(1)->origin()->index(), arrayStateIndex);
1362TEST(MemoryStateEncoderTests, phiTest1AndersenRegionAware)
1367 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1371 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1375 EXPECT_EQ(gamma, test.
gamma);
1380 EXPECT_EQ(op,
nullptr);
1383TEST(MemoryStateEncoderTests, memCpyTestAndersenAgnostic)
1388 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1396 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1400 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 2, 2));
1403 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1405 auto lambdaEntrySplit =
1407 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1416 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 5, 1));
1418 auto callExitSplit =
1420 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 5));
1423 EXPECT_TRUE(is<CallOperation>(*call, 3, 3));
1426 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 5, 1));
1429 for (
size_t n = 0; n < callEntryMerge->ninputs(); n++)
1433 if (is<MemCpyNonVolatileOperation>(node))
1436 EXPECT_NE(memcpy,
nullptr);
1437 EXPECT_TRUE(is<MemCpyNonVolatileOperation>(*memcpy, 5, 2));
1439 auto lambdaEntrySplit =
1441 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 5));
1445TEST(MemoryStateEncoderTests, memCpyAndersenRegionAware)
1450 encodeStates<aa::Andersen, aa::RegionAwareModRefSummarizer>(test.
module());
1458 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 1, 1));
1462 EXPECT_TRUE(is<LoadNonVolatileOperation>(*load, 2, 2));
1465 EXPECT_TRUE(is<StoreNonVolatileOperation>(*store, 3, 1));
1467 auto lambdaEntrySplit =
1469 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 1));
1478 EXPECT_TRUE(is<CallOperation>(*callNode, 3, 3));
1480 auto callEntryMerge =
1482 EXPECT_TRUE(is<CallEntryMemoryStateMergeOperation>(*callEntryMerge, 1, 1));
1484 auto callExitSplit =
1486 EXPECT_TRUE(is<CallExitMemoryStateSplitOperation>(*callExitSplit, 1, 1));
1490 EXPECT_TRUE(is<MemCpyNonVolatileOperation>(*memcpyNode, 5, 2));
1492 auto lambdaEntrySplit =
1494 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1499 auto lambdaExitMerge =
1501 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1505TEST(MemoryStateEncoderTests, freeNullTestAndersenAgnostic)
1511 encodeStates<aa::Andersen, aa::AgnosticModRefSummarizer>(test.
module());
1515 EXPECT_TRUE(is<LambdaExitMemoryStateMergeOperation>(*lambdaExitMerge, 2, 1));
1519 EXPECT_TRUE(is<FreeOperation>(*free, 2, 1));
1521 auto lambdaEntrySplit =
1523 EXPECT_TRUE(is<LambdaEntryMemoryStateSplitOperation>(*lambdaEntrySplit, 1, 2));
1526TEST(MemoryStateEncoderTests, LambdaMemoryStateArgumentMultipleUsers)
1533 auto bitType32 = BitType::Create(32);
1534 auto ioStateType = IOStateType::Create();
1535 auto memoryStateType = MemoryStateType::Create();
1536 auto pointerType = PointerType::Create();
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(),
1551 LlvmLambdaOperation::Create(functionTypeOne,
"one", Linkage::privateLinkage));
1555 auto & one = IntegerConstantOperation::Create(*lambdaOne->
subregion(), 32, 1);
1557 lambdaOne->
finalize({ one.output(0), ioStateArgument, memoryStateArgument });
1562 lambdaMain = LambdaNode::Create(
1563 rvsdg.GetRootRegion(),
1564 LlvmLambdaOperation::Create(functionTypeMain,
"main", Linkage::externalLinkage));
1570 auto callResults = CallOperation::Create(
1573 { ioStateArgument, memoryStateArgument });
1575 auto & loadNode = LoadNonVolatileOperation::CreateNode(
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 =
1598 TryGetOwnerNode<SimpleNode>(*GetMemoryStateRegionResult(*lambdaMain).
origin());
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));
1612 EXPECT_TRUE(CallOperation::GetMemoryStateOutput(*callNode).IsDead());
1614 auto callEntryMergeNode =
1615 TryGetOwnerNode<SimpleNode>(*CallOperation::GetMemoryStateInput(*callNode).origin());
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)
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
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.