summaryrefslogtreecommitdiffstats
path: root/llvm/include/llvm/IR/ModuleSummaryIndex.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include/llvm/IR/ModuleSummaryIndex.h')
-rw-r--r--llvm/include/llvm/IR/ModuleSummaryIndex.h65
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
OpenPOWER on IntegriCloud