@@ -472,6 +472,14 @@ class ReachDFFwk : private bcl::Uncopyable {
472472 // / This covers IN and OUT value for a must/may reach definition analysis.
473473 typedef DFValue<ReachDFFwk, DefinitionInfo> ReachSet;
474474
475+ typedef llvm::Optional<int64_t > AssumptionBound;
476+ struct AssumptionBounds {
477+ AssumptionBound Lower = llvm::None;
478+ AssumptionBound Upper = llvm::None;
479+ };
480+
481+ typedef llvm::DenseMap<llvm::Value *, AssumptionBounds> AssumptionMap;
482+
475483 // / This represents results of reach definition analysis results.
476484 typedef llvm::DenseMap<DFNode *,
477485 std::tuple<std::unique_ptr<DefUseSet>, std::unique_ptr<ReachSet>>,
@@ -495,8 +503,9 @@ class ReachDFFwk : private bcl::Uncopyable {
495503 const llvm::DataLayout &DL, llvm::AssumptionCache &AC,
496504 const GlobalOptions &GO, DefinedMemoryInfo &DefInfo) :
497505 mAliasTree (&AT), mTLI (&TLI), mRegionInfo (&DFI),
498- mDT (&DT), mDI (&DI), mSE (&SE), mDL (&DL), mAC (&AC), mGO (&GO),
499- mDefInfo (&DefInfo) {}
506+ mDT (&DT), mDI (&DI), mSE (&SE), mDL (&DL), mGO (&GO), mDefInfo (&DefInfo) {
507+ initializeAssumptions (AC);
508+ }
500509
501510 // / Creates data-flow framework.
502511 ReachDFFwk (AliasTree &AT, llvm::TargetLibraryInfo &TLI,
@@ -506,8 +515,10 @@ class ReachDFFwk : private bcl::Uncopyable {
506515 const GlobalOptions &GO, DefinedMemoryInfo &DefInfo,
507516 InterprocDefUseInfo &InterprocDUInfo) :
508517 mAliasTree (&AT), mTLI (&TLI), mRegionInfo (&DFI), mDT (&DT),
509- mDI (&DI), mSE (&SE), mDL (&DL), mAC (&AC), mGO (&GO), mDefInfo (&DefInfo),
510- mInterprocDUInfo (&InterprocDUInfo) {}
518+ mDI (&DI), mSE (&SE), mDL (&DL), mGO (&GO), mDefInfo (&DefInfo),
519+ mInterprocDUInfo (&InterprocDUInfo) {
520+ initializeAssumptions (AC);
521+ }
511522
512523 // / Creates data-flow framework.
513524 ReachDFFwk (AliasTree &AT, llvm::TargetLibraryInfo &TLI,
@@ -516,8 +527,9 @@ class ReachDFFwk : private bcl::Uncopyable {
516527 llvm::AssumptionCache &AC, const GlobalOptions &GO,
517528 DefinedMemoryInfo &DefInfo, InterprocDefUseInfo &InterprocDUInfo) :
518529 mAliasTree (&AT), mTLI (&TLI), mDT (&DT), mDI (&DI), mSE (&SE), mDL (&DL),
519- mAC (&AC), mGO (&GO), mDefInfo (&DefInfo),
520- mInterprocDUInfo (&InterprocDUInfo) {}
530+ mGO (&GO), mDefInfo (&DefInfo), mInterprocDUInfo (&InterprocDUInfo) {
531+ initializeAssumptions (AC);
532+ }
521533
522534 // / Return results of interprocedural analysis or nullptr.
523535 InterprocDefUseInfo * getInterprocDefUseInfo () noexcept {
@@ -557,8 +569,8 @@ class ReachDFFwk : private bcl::Uncopyable {
557569 const llvm::DataLayout & getDataLayout () const noexcept { return *mDL ; }
558570
559571 // / Returns assumption cache.
560- llvm::AssumptionCache & getAssumptionCache () const noexcept {
561- return * mAC ;
572+ const AssumptionMap & getAssumptionMap () const noexcept {
573+ return mAM ;
562574 }
563575
564576 // / Returns global options.
@@ -568,6 +580,8 @@ class ReachDFFwk : private bcl::Uncopyable {
568580 // / in a data-flow graph of an outer region.
569581 void collapse (DFRegion *R);
570582private:
583+ void initializeAssumptions (llvm::AssumptionCache &AC);
584+
571585 AliasTree *mAliasTree ;
572586 llvm::TargetLibraryInfo *mTLI ;
573587 const llvm::DominatorTree *mDT ;
@@ -577,7 +591,7 @@ class ReachDFFwk : private bcl::Uncopyable {
577591 const DelinearizeInfo *mDI ;
578592 llvm::ScalarEvolution *mSE ;
579593 const llvm::DataLayout *mDL ;
580- llvm::AssumptionCache * mAC ;
594+ AssumptionMap mAM ;
581595 const GlobalOptions *mGO ;
582596};
583597
0 commit comments