5252#include < llvm/Pass.h>
5353
5454namespace llvm {
55+ class AssumptionCache ;
5556class DominatorTree ;
5657class Value ;
5758class 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+
389422private:
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