diff options
Diffstat (limited to 'lib/Analysis/GlobalsModRef.cpp')
| -rw-r--r-- | lib/Analysis/GlobalsModRef.cpp | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/lib/Analysis/GlobalsModRef.cpp b/lib/Analysis/GlobalsModRef.cpp index 23109c67e5c3..daee93267f56 100644 --- a/lib/Analysis/GlobalsModRef.cpp +++ b/lib/Analysis/GlobalsModRef.cpp @@ -85,12 +85,17 @@ class GlobalsAAResult::FunctionInfo {    /// The bit that flags that this function may read any global. This is    /// chosen to mix together with ModRefInfo bits.    /// FIXME: This assumes ModRefInfo lattice will remain 4 bits! +  /// It overlaps with ModRefInfo::Must bit! +  /// FunctionInfo.getModRefInfo() masks out everything except ModRef so +  /// this remains correct, but the Must info is lost.    enum { MayReadAnyGlobal = 4 };    /// Checks to document the invariants of the bit packing here. -  static_assert((MayReadAnyGlobal & static_cast<int>(ModRefInfo::ModRef)) == 0, +  static_assert((MayReadAnyGlobal & static_cast<int>(ModRefInfo::MustModRef)) == +                    0,                  "ModRef and the MayReadAnyGlobal flag bits overlap."); -  static_assert(((MayReadAnyGlobal | static_cast<int>(ModRefInfo::ModRef)) >> +  static_assert(((MayReadAnyGlobal | +                  static_cast<int>(ModRefInfo::MustModRef)) >>                   AlignedMapPointerTraits::NumLowBitsAvailable) == 0,                  "Insufficient low bits to store our flag and ModRef info."); @@ -125,14 +130,22 @@ public:      return *this;    } +  /// This method clears MayReadAnyGlobal bit added by GlobalsAAResult to return +  /// the corresponding ModRefInfo. It must align in functionality with +  /// clearMust(). +  ModRefInfo globalClearMayReadAnyGlobal(int I) const { +    return ModRefInfo((I & static_cast<int>(ModRefInfo::ModRef)) | +                      static_cast<int>(ModRefInfo::NoModRef)); +  } +    /// Returns the \c ModRefInfo info for this function.    ModRefInfo getModRefInfo() const { -    return ModRefInfo(Info.getInt() & static_cast<int>(ModRefInfo::ModRef)); +    return globalClearMayReadAnyGlobal(Info.getInt());    }    /// Adds new \c ModRefInfo for this function to its state.    void addModRefInfo(ModRefInfo NewMRI) { -    Info.setInt(Info.getInt() | static_cast<int>(NewMRI)); +    Info.setInt(Info.getInt() | static_cast<int>(setMust(NewMRI)));    }    /// Returns whether this function may read any global variable, and we don't | 
