/builds/2mk6rsew/0/parcoach/parcoach/src/include/parcoach/MemoryRegion.h
Line | Count | Source |
1 | | #pragma once |
2 | | |
3 | | #include "llvm/ADT/DenseMap.h" |
4 | | #include "llvm/IR/Value.h" |
5 | | #include "llvm/Passes/PassBuilder.h" |
6 | | |
7 | | #include <map> |
8 | | #include <set> |
9 | | |
10 | | class Andersen; |
11 | | |
12 | | class MemRegEntry { |
13 | | unsigned id_; |
14 | | bool cudaShared_; |
15 | | std::string name_; |
16 | | |
17 | | public: |
18 | | llvm::Value const *Val; |
19 | | MemRegEntry(llvm::Value const *V); |
20 | 90 | llvm::StringRef getName() const { return name_; } |
21 | 42.3k | bool isCudaShared() const { return cudaShared_; } |
22 | | static unsigned generateId(); |
23 | | }; |
24 | | |
25 | | using MemRegSet = std::set<MemRegEntry *>; |
26 | | using MemRegVector = std::vector<MemRegEntry *>; |
27 | | using FunctionToMemRegSetMap = |
28 | | llvm::ValueMap<llvm::Function const *, MemRegSet>; |
29 | | using FunctionToValueSetMap = |
30 | | llvm::ValueMap<llvm::Function const *, std::set<llvm::Value const *>>; |
31 | | |
32 | | class MemReg { |
33 | | llvm::ValueMap<llvm::Value const *, std::unique_ptr<MemRegEntry>> |
34 | | valueToRegMap; |
35 | | MemRegSet sharedCudaRegions; |
36 | | FunctionToMemRegSetMap func2SharedOmpRegs; |
37 | | |
38 | | void createRegion(llvm::Value const *v); |
39 | | void setOmpSharedRegions(llvm::Function const *F, MemRegVector ®s); |
40 | | |
41 | | public: |
42 | | #ifndef NDEBUG |
43 | | void dumpRegions() const; |
44 | | #endif |
45 | | MemRegEntry *getValueRegion(llvm::Value const *v) const; |
46 | | void getValuesRegion(std::vector<llvm::Value const *> &ptsSet, |
47 | | MemRegVector ®s) const; |
48 | | MemRegSet const &getCudaSharedRegions() const; |
49 | | FunctionToMemRegSetMap const &getOmpSharedRegions() const; |
50 | | MemReg(llvm::Module &M, Andersen const &A); |
51 | | static FunctionToValueSetMap func2SharedOmpVar; |
52 | | }; |
53 | | |
54 | | class MemRegAnalysis : public llvm::AnalysisInfoMixin<MemRegAnalysis> { |
55 | | friend llvm::AnalysisInfoMixin<MemRegAnalysis>; |
56 | | static llvm::AnalysisKey Key; |
57 | | |
58 | | public: |
59 | | using Result = std::unique_ptr<MemReg>; |
60 | | |
61 | | static Result run(llvm::Module &M, llvm::ModuleAnalysisManager &); |
62 | | }; |