Skip to content

Commit 5999001

Browse files
committed
[TSAR, Memory] Calculate trip count using nodes.
1 parent 65a89cd commit 5999001

File tree

4 files changed

+191
-79
lines changed

4 files changed

+191
-79
lines changed

include/tsar/Analysis/Memory/DefinedMemory.h

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
#include <llvm/Pass.h>
5353

5454
namespace llvm {
55+
class AssumptionCache;
5556
class DominatorTree;
5657
class Value;
5758
class Instruction;
@@ -92,6 +93,11 @@ class DefUseSet {
9293
/// Set of memory locations.
9394
typedef MemorySet<MemoryLocationRange> LocationSet;
9495

96+
/// Set of data flow nodes with which memory locations from the
97+
/// ExplicitAccesses set are associated.
98+
typedef llvm::DenseMap<const llvm::Value *, llvm::DenseSet<const DFNode *>>
99+
ExplicitNodeMap;
100+
95101
/// Returns set of the must defined locations.
96102
const LocationSet & getDefs() const { return mDefs; }
97103

@@ -386,6 +392,33 @@ class DefUseSet {
386392
.second;
387393
}
388394

395+
/// TODO: description
396+
void addExplicitAccessAndDFNode(const llvm::Value *Ptr, const DFNode *N) {
397+
assert(Ptr && "Location pointer must not be null!");
398+
mCollapsableExplicitAccesses.try_emplace(Ptr).first->second.insert(N);
399+
}
400+
401+
/// TODO: description
402+
const ExplicitNodeMap & getCollapsableExplicitAccesses() const {
403+
return mCollapsableExplicitAccesses;
404+
}
405+
406+
/// TODO: description
407+
void addCollapsableExplicitAccesses(const ExplicitNodeMap &ENM) {
408+
for (auto Itr = ENM.begin(); Itr != ENM.end(); ++Itr) {
409+
auto &NodeList = Itr->second;
410+
mCollapsableExplicitAccesses.try_emplace(Itr->first).
411+
first->second.insert(NodeList.begin(), NodeList.end());
412+
}
413+
}
414+
415+
/// TODO: description
416+
const llvm::DenseSet<const DFNode *> *
417+
getCollapExpAccessNodes(const llvm::Value *Ptr) const {
418+
auto Itr = mCollapsableExplicitAccesses.find(Ptr);
419+
return Itr == mCollapsableExplicitAccesses.end() ? nullptr : &Itr->second;
420+
}
421+
389422
private:
390423
LocationSet mDefs;
391424
LocationSet mMayDefs;
@@ -396,6 +429,7 @@ class DefUseSet {
396429
InstructionSet mExplicitUnknowns;
397430
InstructionSet mAddressUnknowns;
398431
TransitiveMap mAddressTransitives;
432+
ExplicitNodeMap mCollapsableExplicitAccesses;
399433
};
400434

401435
/// This presents information whether a location has definition after a node
@@ -449,29 +483,32 @@ class ReachDFFwk : private bcl::Uncopyable {
449483
ReachDFFwk(AliasTree &AT, llvm::TargetLibraryInfo &TLI,
450484
const DFRegionInfo &DFI, const llvm::DominatorTree &DT,
451485
const DelinearizeInfo &DI, llvm::ScalarEvolution &SE,
452-
const llvm::DataLayout &DL, const GlobalOptions &GO,
453-
DefinedMemoryInfo &DefInfo) :
486+
const llvm::DataLayout &DL, llvm::AssumptionCache &AC,
487+
const GlobalOptions &GO, DefinedMemoryInfo &DefInfo) :
454488
mAliasTree(&AT), mTLI(&TLI), mRegionInfo(&DFI),
455-
mDT(&DT), mDI(&DI), mSE(&SE), mDL(&DL), mGO(&GO), mDefInfo(&DefInfo) {}
489+
mDT(&DT), mDI(&DI), mSE(&SE), mDL(&DL), mAC(&AC), mGO(&GO),
490+
mDefInfo(&DefInfo) {}
456491

457492
/// Creates data-flow framework.
458493
ReachDFFwk(AliasTree &AT, llvm::TargetLibraryInfo &TLI,
459494
const DFRegionInfo &DFI, const llvm::DominatorTree &DT,
460495
const DelinearizeInfo &DI, llvm::ScalarEvolution &SE,
461-
const llvm::DataLayout &DL, const GlobalOptions &GO,
462-
DefinedMemoryInfo &DefInfo, InterprocDefUseInfo &InterprocDUInfo) :
496+
const llvm::DataLayout &DL, llvm::AssumptionCache &AC,
497+
const GlobalOptions &GO, DefinedMemoryInfo &DefInfo,
498+
InterprocDefUseInfo &InterprocDUInfo) :
463499
mAliasTree(&AT), mTLI(&TLI), mRegionInfo(&DFI), mDT(&DT),
464-
mDI(&DI), mSE(&SE), mDL(&DL), mGO(&GO), mDefInfo(&DefInfo),
500+
mDI(&DI), mSE(&SE), mDL(&DL), mAC(&AC), mGO(&GO), mDefInfo(&DefInfo),
465501
mInterprocDUInfo(&InterprocDUInfo) {}
466502

467503
/// Creates data-flow framework.
468504
ReachDFFwk(AliasTree &AT, llvm::TargetLibraryInfo &TLI,
469505
const llvm::DominatorTree &DT, const DelinearizeInfo &DI,
470506
llvm::ScalarEvolution &SE, const llvm::DataLayout &DL,
471-
const GlobalOptions &GO, DefinedMemoryInfo &DefInfo,
472-
InterprocDefUseInfo &InterprocDUInfo) :
507+
llvm::AssumptionCache &AC, const GlobalOptions &GO,
508+
DefinedMemoryInfo &DefInfo, InterprocDefUseInfo &InterprocDUInfo) :
473509
mAliasTree(&AT), mTLI(&TLI), mDT(&DT), mDI(&DI), mSE(&SE), mDL(&DL),
474-
mGO(&GO), mDefInfo(&DefInfo), mInterprocDUInfo(&InterprocDUInfo) {}
510+
mAC(&AC), mGO(&GO), mDefInfo(&DefInfo),
511+
mInterprocDUInfo(&InterprocDUInfo) {}
475512

476513
/// Return results of interprocedural analysis or nullptr.
477514
InterprocDefUseInfo * getInterprocDefUseInfo() noexcept {
@@ -510,6 +547,11 @@ class ReachDFFwk : private bcl::Uncopyable {
510547
/// Returns data layout.
511548
const llvm::DataLayout & getDataLayout() const noexcept { return *mDL; }
512549

550+
/// Returns assumption cache.
551+
llvm::AssumptionCache & getAssumptionCache() const noexcept {
552+
return *mAC;
553+
}
554+
513555
/// Returns global options.
514556
const GlobalOptions & getGlobalOptions() const noexcept { return *mGO; }
515557

@@ -526,6 +568,7 @@ class ReachDFFwk : private bcl::Uncopyable {
526568
const DelinearizeInfo *mDI;
527569
llvm::ScalarEvolution *mSE;
528570
const llvm::DataLayout *mDL;
571+
llvm::AssumptionCache *mAC;
529572
const GlobalOptions *mGO;
530573
};
531574

0 commit comments

Comments
 (0)