Jlm
AgnosticModRefSummarizerTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2022 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
10 #include <jlm/llvm/TestRvsdgs.hpp>
11 #include <jlm/rvsdg/view.hpp>
12 #include <jlm/util/Statistics.hpp>
13 
14 static std::unique_ptr<jlm::llvm::aa::PointsToGraph>
16 {
17  using namespace jlm::llvm;
18 
19  aa::Andersen andersen;
21  return andersen.Analyze(module, statisticsCollector);
22 }
23 
24 TEST(AgnosticModRefSummarizerTests, TestStore1)
25 {
26  /*
27  * Arrange
28  */
29  auto ValidateProvider = [](const jlm::llvm::StoreTest1 & test,
30  const jlm::llvm::aa::ModRefSummary & modRefSummary,
31  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
32  {
33  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda).Size();
34  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda).Size();
35 
36  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
37  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
38  };
39 
41  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
42 
43  auto pointsToGraph = RunAndersen(test.module());
44  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
45 
46  /*
47  * Act
48  */
49  auto modRefSummary =
51 
52  /*
53  * Assert
54  */
55  ValidateProvider(test, *modRefSummary, *pointsToGraph);
56 }
57 
58 TEST(AgnosticModRefSummarizerTests, TestStore2)
59 {
60  /*
61  * Arrange
62  */
63  auto ValidateProvider = [](const jlm::llvm::StoreTest2 & test,
64  const jlm::llvm::aa::ModRefSummary & modRefSummary,
65  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
66  {
67  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda).Size();
68  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda).Size();
69 
70  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
71  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
72  };
73 
75  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
76 
77  auto pointsToGraph = RunAndersen(test.module());
78  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
79 
80  /*
81  * Act
82  */
83  auto modRefSummary =
85 
86  /*
87  * Assert
88  */
89  ValidateProvider(test, *modRefSummary, *pointsToGraph);
90 }
91 
92 TEST(AgnosticModRefSummarizerTests, TestLoad1)
93 {
94  /*
95  * Arrange
96  */
97  auto ValidateProvider = [](const jlm::llvm::LoadTest1 & test,
98  const jlm::llvm::aa::ModRefSummary & modRefSummary,
99  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
100  {
101  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda).Size();
102  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda).Size();
103 
104  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
105  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
106  };
107 
109  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
110 
111  auto pointsToGraph = RunAndersen(test.module());
112  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
113 
114  /*
115  * Act
116  */
117  auto modRefSummary =
119 
120  /*
121  * Assert
122  */
123  ValidateProvider(test, *modRefSummary, *pointsToGraph);
124 }
125 
126 TEST(AgnosticModRefSummarizerTests, TestLoad2)
127 {
128  /*
129  * Arrange
130  */
131  auto ValidateProvider = [](const jlm::llvm::LoadTest2 & test,
132  const jlm::llvm::aa::ModRefSummary & modRefSummary,
133  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
134  {
135  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda).Size();
136  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda).Size();
137 
138  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
139  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
140  };
141 
143  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
144 
145  auto pointsToGraph = RunAndersen(test.module());
146 
147  /*
148  * Act
149  */
150  auto modRefSummary =
152 
153  /*
154  * Assert
155  */
156  ValidateProvider(test, *modRefSummary, *pointsToGraph);
157 }
158 
159 TEST(AgnosticModRefSummarizerTests, TestLoadFromUndef)
160 {
161  /*
162  * Arrange
163  */
164  auto ValidateProvider = [](const jlm::llvm::LoadFromUndefTest & test,
165  const jlm::llvm::aa::ModRefSummary & modRefSummary,
166  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
167  {
168  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.Lambda()).Size();
169  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.Lambda()).Size();
170 
171  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
172  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
173  };
174 
176  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
177 
178  auto pointsToGraph = RunAndersen(test.module());
179  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*pointsToGraph);
180 
181  /*
182  * Act
183  */
184  auto modRefSummary =
186 
187  /*
188  * Assert
189  */
190  ValidateProvider(test, *modRefSummary, *pointsToGraph);
191 }
192 
193 TEST(AgnosticModRefSummarizerTests, TestCall1)
194 {
195  /*
196  * Arrange
197  */
198  auto ValidateProvider = [](const jlm::llvm::CallTest1 & test,
199  const jlm::llvm::aa::ModRefSummary & modRefSummary,
200  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
201  {
202  /*
203  * Validate function f
204  */
205  {
206  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_f).Size();
207  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_f).Size();
208 
209  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
210  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
211  }
212 
213  /*
214  * Validate function g
215  */
216  {
217  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_g).Size();
218  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_g).Size();
219 
220  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
221  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
222  }
223 
224  /*
225  * Validate function h
226  */
227  {
228  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_h).Size();
229  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_h).Size();
230 
231  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
232  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
233 
234  auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.CallF()).Size();
235  EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
236 
237  auto numCallGNodes = modRefSummary.GetSimpleNodeModRef(test.CallG()).Size();
238  EXPECT_EQ(numCallGNodes, pointsToGraph.numMemoryNodes());
239  }
240  };
241 
243  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
244 
245  auto pointsToGraph = RunAndersen(test.module());
246  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
247 
248  /*
249  * Act
250  */
251  auto modRefSummary =
253 
254  /*
255  * Assert
256  */
257  ValidateProvider(test, *modRefSummary, *pointsToGraph);
258 }
259 
260 TEST(AgnosticModRefSummarizerTests, TestCall2)
261 {
262  /*
263  * Arrange
264  */
265  auto ValidateProvider = [](const jlm::llvm::CallTest2 & test,
266  const jlm::llvm::aa::ModRefSummary & modRefSummary,
267  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
268  {
269  /*
270  * Validate function create
271  */
272  {
273  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_create).Size();
274  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_create).Size();
275 
276  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
277  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
278  }
279 
280  /*
281  * Validate function destroy
282  */
283  {
284  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_destroy).Size();
285  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_destroy).Size();
286 
287  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
288  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
289  }
290 
291  /*
292  * Validate function test
293  */
294  {
295  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_test).Size();
296  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_test).Size();
297 
298  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
299  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
300 
301  auto numCallCreate1Nodes = modRefSummary.GetSimpleNodeModRef(test.CallCreate1()).Size();
302  EXPECT_EQ(numCallCreate1Nodes, pointsToGraph.numMemoryNodes());
303 
304  auto numCallCreate2Nodes = modRefSummary.GetSimpleNodeModRef(test.CallCreate2()).Size();
305  EXPECT_EQ(numCallCreate2Nodes, pointsToGraph.numMemoryNodes());
306 
307  auto numCallDestroy1Nodes = modRefSummary.GetSimpleNodeModRef(test.CallDestroy1()).Size();
308  EXPECT_EQ(numCallDestroy1Nodes, pointsToGraph.numMemoryNodes());
309 
310  auto numCallDestroy2Nodes = modRefSummary.GetSimpleNodeModRef(test.CallDestroy2()).Size();
311  EXPECT_EQ(numCallDestroy2Nodes, pointsToGraph.numMemoryNodes());
312  }
313  };
314 
316  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
317 
318  auto pointsToGraph = RunAndersen(test.module());
319  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
320 
321  /*
322  * Act
323  */
324  auto modRefSummary =
326 
327  /*
328  * Assert
329  */
330  ValidateProvider(test, *modRefSummary, *pointsToGraph);
331 }
332 
333 TEST(AgnosticModRefSummarizerTests, TestIndirectCall)
334 {
335  /*
336  * Arrange
337  */
338  auto ValidateProvider = [](const jlm::llvm::IndirectCallTest1 & test,
339  const jlm::llvm::aa::ModRefSummary & modRefSummary,
340  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
341  {
342  /*
343  * Validate function four
344  */
345  {
346  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.GetLambdaFour()).Size();
347  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.GetLambdaFour()).Size();
348 
349  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
350  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
351  }
352 
353  /*
354  * Validate function three
355  */
356  {
357  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.GetLambdaThree()).Size();
358  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.GetLambdaThree()).Size();
359 
360  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
361  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
362  }
363 
364  /*
365  * Validate function indcall
366  */
367  {
368  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.GetLambdaIndcall()).Size();
369  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.GetLambdaIndcall()).Size();
370 
371  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
372  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
373 
374  auto numCallIndcallNodes = modRefSummary.GetSimpleNodeModRef(test.CallIndcall()).Size();
375  EXPECT_EQ(numCallIndcallNodes, pointsToGraph.numMemoryNodes());
376  }
377 
378  /*
379  * Validate function test
380  */
381  {
382  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.GetLambdaTest()).Size();
383  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.GetLambdaTest()).Size();
384 
385  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
386  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
387 
388  auto numCallThreeNodes = modRefSummary.GetSimpleNodeModRef(test.CallThree()).Size();
389  EXPECT_EQ(numCallThreeNodes, pointsToGraph.numMemoryNodes());
390 
391  auto numCallFourNodes = modRefSummary.GetSimpleNodeModRef(test.CallFour()).Size();
392  EXPECT_EQ(numCallFourNodes, pointsToGraph.numMemoryNodes());
393  }
394  };
395 
397  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
398 
399  auto pointsToGraph = RunAndersen(test.module());
400  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
401 
402  /*
403  * Act
404  */
405  auto modRefSummary =
407 
408  /*
409  * Assert
410  */
411  ValidateProvider(test, *modRefSummary, *pointsToGraph);
412 }
413 
414 TEST(AgnosticModRefSummarizerTests, TestGamma)
415 {
416  /*
417  * Arrange
418  */
419  auto ValidateProvider = [](const jlm::llvm::GammaTest & test,
420  const jlm::llvm::aa::ModRefSummary & modRefSummary,
421  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
422  {
423  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda).Size();
424  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda).Size();
425  auto numGammaEntryNodes = modRefSummary.GetGammaEntryModRef(*test.gamma).Size();
426  auto numGammaExitNodes = modRefSummary.GetGammaExitModRef(*test.gamma).Size();
427 
428  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
429  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
430  EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
431  EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
432  };
433 
435  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
436 
437  auto pointsToGraph = RunAndersen(test.module());
438  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
439 
440  /*
441  * Act
442  */
443  auto modRefSummary =
445 
446  /*
447  * Assert
448  */
449  ValidateProvider(test, *modRefSummary, *pointsToGraph);
450 }
451 
452 TEST(AgnosticModRefSummarizerTests, TestTheta)
453 {
454  /*
455  * Arrange
456  */
457  auto ValidateProvider = [](const jlm::llvm::ThetaTest & test,
458  const jlm::llvm::aa::ModRefSummary & modRefSummary,
459  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
460  {
461  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda).Size();
462  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda).Size();
463  auto numThetaNodes = modRefSummary.GetThetaModRef(*test.theta).Size();
464 
465  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
466  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
467  EXPECT_EQ(numThetaNodes, pointsToGraph.numMemoryNodes());
468  };
469 
471  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
472 
473  auto pointsToGraph = RunAndersen(test.module());
474  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
475 
476  /*
477  * Act
478  */
479  auto modRefSummary =
481 
482  /*
483  * Assert
484  */
485  ValidateProvider(test, *modRefSummary, *pointsToGraph);
486 }
487 
488 TEST(AgnosticModRefSummarizerTests, TestDelta1)
489 {
490  /*
491  * Arrange
492  */
493  auto ValidateProvider = [](const jlm::llvm::DeltaTest1 & test,
494  const jlm::llvm::aa::ModRefSummary & modRefSummary,
495  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
496  {
497  /*
498  * Validate function g
499  */
500  {
501  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_g).Size();
502  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_g).Size();
503 
504  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
505  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
506  }
507 
508  /*
509  * Validate function h
510  */
511  {
512  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_h).Size();
513  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_h).Size();
514  auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.CallG()).Size();
515 
516  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
517  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
518  EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
519  }
520  };
521 
523  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
524 
525  auto pointsToGraph = RunAndersen(test.module());
526  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
527 
528  /*
529  * Act
530  */
531  auto modRefSummary =
533 
534  /*
535  * Assert
536  */
537  ValidateProvider(test, *modRefSummary, *pointsToGraph);
538 }
539 
540 TEST(AgnosticModRefSummarizerTests, TestDelta2)
541 {
542  /*
543  * Arrange
544  */
545  auto ValidateProvider = [](const jlm::llvm::DeltaTest2 & test,
546  const jlm::llvm::aa::ModRefSummary & modRefSummary,
547  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
548  {
549  /*
550  * Validate function f1
551  */
552  {
553  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_f1).Size();
554  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_f1).Size();
555 
556  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
557  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
558  }
559 
560  /*
561  * Validate function f2
562  */
563  {
564  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_f2).Size();
565  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_f2).Size();
566  auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.CallF1()).Size();
567 
568  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
569  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
570  EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
571  }
572  };
573 
575  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
576 
577  auto pointsToGraph = RunAndersen(test.module());
578  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
579 
580  /*
581  * Act
582  */
583  auto modRefSummary =
585 
586  /*
587  * Assert
588  */
589  ValidateProvider(test, *modRefSummary, *pointsToGraph);
590 }
591 
592 TEST(AgnosticModRefSummarizerTests, TestImports)
593 {
594  /*
595  * Arrange
596  */
597  auto ValidateProvider = [](const jlm::llvm::ImportTest & test,
598  const jlm::llvm::aa::ModRefSummary & modRefSummary,
599  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
600  {
601  /*
602  * Validate function f1
603  */
604  {
605  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_f1).Size();
606  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_f1).Size();
607 
608  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
609  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
610  }
611 
612  /*
613  * Validate function f2
614  */
615  {
616  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_f2).Size();
617  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_f2).Size();
618  auto numCallNodes = modRefSummary.GetSimpleNodeModRef(test.CallF1()).Size();
619 
620  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
621  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
622  EXPECT_EQ(numCallNodes, pointsToGraph.numMemoryNodes());
623  }
624  };
625 
627  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
628 
629  auto pointsToGraph = RunAndersen(test.module());
630  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*ptg);
631 
632  /*
633  * Act
634  */
635  auto modRefSummary =
637 
638  /*
639  * Assert
640  */
641  ValidateProvider(test, *modRefSummary, *pointsToGraph);
642 }
643 
644 TEST(AgnosticModRefSummarizerTests, TestPhi1)
645 {
646  /*
647  * Arrange
648  */
649  auto ValidateProvider = [](const jlm::llvm::PhiTest1 & test,
650  const jlm::llvm::aa::ModRefSummary & modRefSummary,
651  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
652  {
653  /*
654  * Validate function fib
655  */
656  {
657  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_fib).Size();
658  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_fib).Size();
659  auto numGammaEntryNodes = modRefSummary.GetGammaEntryModRef(*test.gamma).Size();
660  auto numGammaExitNodes = modRefSummary.GetGammaExitModRef(*test.gamma).Size();
661  auto numCallFibm1Nodes = modRefSummary.GetSimpleNodeModRef(test.CallFibm1()).Size();
662  auto numCallFibm2Nodes = modRefSummary.GetSimpleNodeModRef(test.CallFibm2()).Size();
663 
664  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
665  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
666  EXPECT_EQ(numGammaEntryNodes, pointsToGraph.numMemoryNodes());
667  EXPECT_EQ(numGammaExitNodes, pointsToGraph.numMemoryNodes());
668  EXPECT_EQ(numCallFibm1Nodes, pointsToGraph.numMemoryNodes());
669  EXPECT_EQ(numCallFibm2Nodes, pointsToGraph.numMemoryNodes());
670  }
671 
672  /*
673  * Validate function test
674  */
675  {
676  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(*test.lambda_test).Size();
677  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(*test.lambda_test).Size();
678  auto numCallFibNodes = modRefSummary.GetSimpleNodeModRef(test.CallFib()).Size();
679 
680  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
681  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
682  EXPECT_EQ(numCallFibNodes, pointsToGraph.numMemoryNodes());
683  }
684  };
685 
686  jlm::llvm::PhiTest1 test;
687  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
688 
689  auto pointsToGraph = RunAndersen(test.module());
690  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
691 
692  /*
693  * Act
694  */
695  auto modRefSummary =
697 
698  /*
699  * Assert
700  */
701  ValidateProvider(test, *modRefSummary, *pointsToGraph);
702 }
703 
704 TEST(AgnosticModRefSummarizerTests, TestMemcpy)
705 {
706  /*
707  * Arrange
708  */
709  auto ValidateProvider = [](const jlm::llvm::MemcpyTest & test,
710  const jlm::llvm::aa::ModRefSummary & modRefSummary,
711  const jlm::llvm::aa::PointsToGraph & pointsToGraph)
712  {
713  /*
714  * Validate function f
715  */
716  {
717  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.LambdaF()).Size();
718  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.LambdaF()).Size();
719 
720  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
721  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
722  }
723 
724  /*
725  * Validate function g
726  */
727  {
728  auto numLambdaEntryNodes = modRefSummary.GetLambdaEntryModRef(test.LambdaG()).Size();
729  auto numLambdaExitNodes = modRefSummary.GetLambdaExitModRef(test.LambdaG()).Size();
730  auto numCallFNodes = modRefSummary.GetSimpleNodeModRef(test.CallF()).Size();
731  auto numMemcpyNodes = modRefSummary.GetSimpleNodeModRef(test.Memcpy()).Size();
732 
733  EXPECT_EQ(numLambdaEntryNodes, pointsToGraph.numMemoryNodes());
734  EXPECT_EQ(numLambdaExitNodes, pointsToGraph.numMemoryNodes());
735  EXPECT_EQ(numCallFNodes, pointsToGraph.numMemoryNodes());
736  EXPECT_EQ(numMemcpyNodes, 2u);
737  }
738  };
739 
741  // jlm::rvsdg::view(test.graph().GetRootRegion(), stdout);
742 
743  auto pointsToGraph = RunAndersen(test.module());
744  // std::cout << jlm::llvm::aa::PointsToGraph::dumpGraph(*PointsToGraph);
745 
746  /*
747  * Act
748  */
749  auto modRefSummary =
751 
752  /*
753  * Assert
754  */
755  ValidateProvider(test, *modRefSummary, *pointsToGraph);
756 }
757 
758 TEST(AgnosticModRefSummarizerTests, TestStatistics)
759 {
760  // Arrange
762  auto pointsToGraph = RunAndersen(test.module());
763 
764  jlm::util::StatisticsCollectorSettings statisticsCollectorSettings(
766  jlm::util::StatisticsCollector statisticsCollector(statisticsCollectorSettings);
767 
768  // Act
770  test.module(),
771  *pointsToGraph,
773 
774  // Assert
776 
777  auto & statistics = dynamic_cast<const jlm::llvm::aa::AgnosticModRefSummarizer::Statistics &>(
779 
780  EXPECT_EQ(statistics.GetSourceFile(), test.module().SourceFileName());
781  EXPECT_EQ(statistics.NumPointsToGraphMemoryNodes(), 2u);
782  EXPECT_NE(statistics.GetTime(), 0u);
783 }
TEST(AgnosticModRefSummarizerTests, TestStore1)
static std::unique_ptr< jlm::llvm::aa::PointsToGraph > RunAndersen(const jlm::llvm::LlvmRvsdgModule &module)
static jlm::util::StatisticsCollector statisticsCollector
CallTest1 class.
Definition: TestRvsdgs.hpp:425
const rvsdg::SimpleNode & CallG() const noexcept
Definition: TestRvsdgs.hpp:438
jlm::rvsdg::LambdaNode * lambda_g
Definition: TestRvsdgs.hpp:444
jlm::rvsdg::LambdaNode * lambda_f
Definition: TestRvsdgs.hpp:443
const rvsdg::SimpleNode & CallF() const noexcept
Definition: TestRvsdgs.hpp:432
jlm::rvsdg::LambdaNode * lambda_h
Definition: TestRvsdgs.hpp:445
CallTest2 class.
Definition: TestRvsdgs.hpp:488
jlm::rvsdg::LambdaNode * lambda_test
Definition: TestRvsdgs.hpp:516
const rvsdg::SimpleNode & CallCreate2() const noexcept
Definition: TestRvsdgs.hpp:497
jlm::rvsdg::LambdaNode * lambda_create
Definition: TestRvsdgs.hpp:514
const rvsdg::SimpleNode & CallDestroy2() const noexcept
Definition: TestRvsdgs.hpp:509
jlm::rvsdg::LambdaNode * lambda_destroy
Definition: TestRvsdgs.hpp:515
const rvsdg::SimpleNode & CallDestroy1() const noexcept
Definition: TestRvsdgs.hpp:503
const rvsdg::SimpleNode & CallCreate1() const noexcept
Definition: TestRvsdgs.hpp:491
DeltaTest1 class.
jlm::rvsdg::LambdaNode * lambda_h
jlm::rvsdg::LambdaNode * lambda_g
const rvsdg::SimpleNode & CallG() const noexcept
DeltaTest2 class.
jlm::rvsdg::LambdaNode * lambda_f2
jlm::rvsdg::LambdaNode * lambda_f1
const rvsdg::SimpleNode & CallF1() const noexcept
GammaTest class.
Definition: TestRvsdgs.hpp:961
rvsdg::GammaNode * gamma
Definition: TestRvsdgs.hpp:969
jlm::rvsdg::LambdaNode * lambda
Definition: TestRvsdgs.hpp:967
ImportTest class.
jlm::rvsdg::LambdaNode * lambda_f1
jlm::rvsdg::LambdaNode * lambda_f2
const rvsdg::SimpleNode & CallF1() const noexcept
IndirectCallTest1 class.
Definition: TestRvsdgs.hpp:566
const jlm::rvsdg::LambdaNode & GetLambdaTest() const noexcept
Definition: TestRvsdgs.hpp:605
const jlm::rvsdg::LambdaNode & GetLambdaIndcall() const noexcept
Definition: TestRvsdgs.hpp:599
const rvsdg::SimpleNode & CallThree() const noexcept
Definition: TestRvsdgs.hpp:575
const jlm::rvsdg::LambdaNode & GetLambdaFour() const noexcept
Definition: TestRvsdgs.hpp:593
const rvsdg::SimpleNode & CallIndcall() const noexcept
Definition: TestRvsdgs.hpp:569
const jlm::rvsdg::LambdaNode & GetLambdaThree() const noexcept
Definition: TestRvsdgs.hpp:587
const rvsdg::SimpleNode & CallFour() const noexcept
Definition: TestRvsdgs.hpp:581
const util::FilePath & SourceFileName() const noexcept
LoadFromUndefTest class.
Definition: TestRvsdgs.hpp:236
const jlm::rvsdg::LambdaNode & Lambda() const noexcept
Definition: TestRvsdgs.hpp:243
LoadTest1 class.
Definition: TestRvsdgs.hpp:161
jlm::rvsdg::LambdaNode * lambda
Definition: TestRvsdgs.hpp:167
LoadTest2 class.
Definition: TestRvsdgs.hpp:200
jlm::rvsdg::LambdaNode * lambda
Definition: TestRvsdgs.hpp:206
MemcpyTest class.
const rvsdg::SimpleNode & CallF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaF() const noexcept
const jlm::rvsdg::LambdaNode & LambdaG() const noexcept
const rvsdg::SimpleNode & Memcpy() const noexcept
PhiTest1 class.
rvsdg::GammaNode * gamma
jlm::rvsdg::LambdaNode * lambda_test
const rvsdg::SimpleNode & CallFibm2() const noexcept
jlm::rvsdg::LambdaNode * lambda_fib
const rvsdg::SimpleNode & CallFib() const noexcept
const rvsdg::SimpleNode & CallFibm1() const noexcept
jlm::llvm::LlvmRvsdgModule & module()
Definition: TestRvsdgs.hpp:34
StoreTest1 class.
Definition: TestRvsdgs.hpp:89
jlm::rvsdg::LambdaNode * lambda
Definition: TestRvsdgs.hpp:95
StoreTest2 class.
Definition: TestRvsdgs.hpp:127
jlm::rvsdg::LambdaNode * lambda
Definition: TestRvsdgs.hpp:133
ThetaTest class.
jlm::rvsdg::LambdaNode * lambda
jlm::rvsdg::ThetaNode * theta
static std::unique_ptr< ModRefSummary > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector)
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Definition: Andersen.cpp:1531
StatisticsRange CollectedStatistics() const noexcept
Definition: Statistics.hpp:528
size_t NumCollectedStatistics() const noexcept
Definition: Statistics.hpp:535
Global memory state passed between functions.