diff options
Diffstat (limited to 'llvm/include/llvm/IR/ModuleSummaryIndex.h')
-rw-r--r-- | llvm/include/llvm/IR/ModuleSummaryIndex.h | 65 |
1 files changed, 15 insertions, 50 deletions
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h index a81338e576a..c931842fd46 100644 --- a/llvm/include/llvm/IR/ModuleSummaryIndex.h +++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -162,8 +162,7 @@ using GlobalValueSummaryMapTy = /// Struct that holds a reference to a particular GUID in a global value /// summary. struct ValueInfo { - enum Flags { HaveGV = 1, ReadOnly = 2, WriteOnly = 4 }; - PointerIntPair<const GlobalValueSummaryMapTy::value_type *, 3, int> + PointerIntPair<const GlobalValueSummaryMapTy::value_type *, 2, int> RefAndFlags; ValueInfo() = default; @@ -189,33 +188,9 @@ struct ValueInfo { : getRef()->second.U.Name; } - bool haveGVs() const { return RefAndFlags.getInt() & HaveGV; } - bool isReadOnly() const { - assert(isValidAccessSpecifier()); - return RefAndFlags.getInt() & ReadOnly; - } - bool isWriteOnly() const { - assert(isValidAccessSpecifier()); - return RefAndFlags.getInt() & WriteOnly; - } - unsigned getAccessSpecifier() const { - assert(isValidAccessSpecifier()); - return RefAndFlags.getInt() & (ReadOnly | WriteOnly); - } - bool isValidAccessSpecifier() const { - unsigned BadAccessMask = ReadOnly | WriteOnly; - return (RefAndFlags.getInt() & BadAccessMask) != BadAccessMask; - } - void setReadOnly() { - // We expect ro/wo attribute to set only once during - // ValueInfo lifetime. - assert(getAccessSpecifier() == 0); - RefAndFlags.setInt(RefAndFlags.getInt() | ReadOnly); - } - void setWriteOnly() { - assert(getAccessSpecifier() == 0); - RefAndFlags.setInt(RefAndFlags.getInt() | WriteOnly); - } + bool haveGVs() const { return RefAndFlags.getInt() & 0x1; } + bool isReadOnly() const { return RefAndFlags.getInt() & 0x2; } + void setReadOnly() { RefAndFlags.setInt(RefAndFlags.getInt() | 0x2); } const GlobalValueSummaryMapTy::value_type *getRef() const { return RefAndFlags.getPointer(); @@ -609,8 +584,8 @@ public: std::move(TypeTestAssumeConstVCalls), std::move(TypeCheckedLoadConstVCalls)}); } - // Gets the number of readonly and writeonly refs in RefEdgeList - std::pair<unsigned, unsigned> specialRefCounts() const; + // Gets the number of immutable refs in RefEdgeList + unsigned immutableRefCount() const; /// Check if this is a function summary. static bool classof(const GlobalValueSummary *GVS) { @@ -738,12 +713,9 @@ using VTableFuncList = std::vector<VirtFuncOffset>; /// Global variable summary information to aid decisions and /// implementation of importing. /// -/// Global variable summary has two extra flag, telling if it is -/// readonly or writeonly. Both readonly and writeonly variables -/// can be optimized in the backed: readonly variables can be -/// const-folded, while writeonly vars can be completely eliminated -/// together with corresponding stores. We let both things happen -/// by means of internalizing such variables after ThinLTO import. +/// Global variable summary has extra flag, telling if it is +/// modified during the program run or not. This affects ThinLTO +/// internalization class GlobalVarSummary : public GlobalValueSummary { private: /// For vtable definitions this holds the list of functions and @@ -752,14 +724,9 @@ private: public: struct GVarFlags { - GVarFlags(bool ReadOnly, bool WriteOnly) - : MaybeReadOnly(ReadOnly), MaybeWriteOnly(WriteOnly) {} - - // In permodule summaries both MaybeReadOnly and MaybeWriteOnly - // bits are set, because attribute propagation occurs later on - // thin link phase. - unsigned MaybeReadOnly : 1; - unsigned MaybeWriteOnly : 1; + GVarFlags(bool ReadOnly = false) : ReadOnly(ReadOnly) {} + + unsigned ReadOnly : 1; } VarFlags; GlobalVarSummary(GVFlags Flags, GVarFlags VarFlags, @@ -773,10 +740,8 @@ public: } GVarFlags varflags() const { return VarFlags; } - void setReadOnly(bool RO) { VarFlags.MaybeReadOnly = RO; } - void setWriteOnly(bool WO) { VarFlags.MaybeWriteOnly = WO; } - bool maybeReadOnly() const { return VarFlags.MaybeReadOnly; } - bool maybeWriteOnly() const { return VarFlags.MaybeWriteOnly; } + void setReadOnly(bool RO) { VarFlags.ReadOnly = RO; } + bool isReadOnly() const { return VarFlags.ReadOnly; } void setVTableFuncs(VTableFuncList Funcs) { assert(!VTableFuncs); @@ -1347,7 +1312,7 @@ public: void dumpSCCs(raw_ostream &OS); /// Analyze index and detect unmodified globals - void propagateAttributes(const DenseSet<GlobalValue::GUID> &PreservedSymbols); + void propagateConstants(const DenseSet<GlobalValue::GUID> &PreservedSymbols); }; /// GraphTraits definition to build SCC for the index |