diff options
Diffstat (limited to 'llvm/include/llvm/IR/ModuleSummaryIndex.h')
-rw-r--r-- | llvm/include/llvm/IR/ModuleSummaryIndex.h | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h index be60447abd87..aa4054c8409e 100644 --- a/llvm/include/llvm/IR/ModuleSummaryIndex.h +++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -29,6 +29,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/ScaledNumber.h" #include "llvm/Support/StringSaver.h" +#include "llvm/Support/raw_ostream.h" #include <algorithm> #include <array> #include <cassert> @@ -172,7 +173,7 @@ struct ValueInfo { RefAndFlags.setInt(HaveGVs); } - operator bool() const { return getRef(); } + explicit operator bool() const { return getRef(); } GlobalValue::GUID getGUID() const { return getRef()->first; } const GlobalValue *getValue() const { @@ -547,6 +548,8 @@ public: // Indicate if the global value cannot be inlined. unsigned NoInline : 1; + // Indicate if function should be always inlined. + unsigned AlwaysInline : 1; }; /// Create an empty FunctionSummary (with specified call edges). @@ -941,6 +944,11 @@ private: /// considered live. bool WithGlobalValueDeadStripping = false; + /// Indicates that summary-based attribute propagation has run and + /// GVarFlags::MaybeReadonly / GVarFlags::MaybeWriteonly are really + /// read/write only. + bool WithAttributePropagation = false; + /// Indicates that summary-based synthetic entry count propagation has run bool HasSyntheticEntryCounts = false; @@ -987,6 +995,13 @@ public: : HaveGVs(HaveGVs), EnableSplitLTOUnit(EnableSplitLTOUnit), Saver(Alloc) { } + // Current version for the module summary in bitcode files. + // The BitcodeSummaryVersion should be bumped whenever we introduce changes + // in the way some record are interpreted, like flags for instance. + // Note that incrementing this may require changes in both BitcodeReader.cpp + // and BitcodeWriter.cpp. + static constexpr uint64_t BitcodeSummaryVersion = 8; + bool haveGVs() const { return HaveGVs; } gvsummary_iterator begin() { return GlobalValueMap.begin(); } @@ -1065,6 +1080,18 @@ public: WithGlobalValueDeadStripping = true; } + bool withAttributePropagation() const { return WithAttributePropagation; } + void setWithAttributePropagation() { + WithAttributePropagation = true; + } + + bool isReadOnly(const GlobalVarSummary *GVS) const { + return WithAttributePropagation && GVS->maybeReadOnly(); + } + bool isWriteOnly(const GlobalVarSummary *GVS) const { + return WithAttributePropagation && GVS->maybeWriteOnly(); + } + bool hasSyntheticEntryCounts() const { return HasSyntheticEntryCounts; } void setHasSyntheticEntryCounts() { HasSyntheticEntryCounts = true; } @@ -1241,9 +1268,11 @@ public: } /// Helper to obtain the unpromoted name for a global value (or the original - /// name if not promoted). + /// name if not promoted). Split off the rightmost ".llvm.${hash}" suffix, + /// because it is possible in certain clients (not clang at the moment) for + /// two rounds of ThinLTO optimization and therefore promotion to occur. static StringRef getOriginalNameBeforePromote(StringRef Name) { - std::pair<StringRef, StringRef> Pair = Name.split(".llvm."); + std::pair<StringRef, StringRef> Pair = Name.rsplit(".llvm."); return Pair.first; } @@ -1349,13 +1378,18 @@ public: void dump() const; /// Export summary to dot file for GraphViz. - void exportToDot(raw_ostream& OS) const; + void + exportToDot(raw_ostream &OS, + const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) const; /// Print out strongly connected components for debugging. void dumpSCCs(raw_ostream &OS); /// Analyze index and detect unmodified globals void propagateAttributes(const DenseSet<GlobalValue::GUID> &PreservedSymbols); + + /// Checks if we can import global variable from another module. + bool canImportGlobalVar(GlobalValueSummary *S, bool AnalyzeRefs) const; }; /// GraphTraits definition to build SCC for the index @@ -1427,15 +1461,6 @@ struct GraphTraits<ModuleSummaryIndex *> : public GraphTraits<ValueInfo> { return ValueInfo(I->haveGVs(), &P); } }; - -static inline bool canImportGlobalVar(GlobalValueSummary *S) { - assert(isa<GlobalVarSummary>(S->getBaseObject())); - - // We don't import GV with references, because it can result - // in promotion of local variables in the source module. - return !GlobalValue::isInterposableLinkage(S->linkage()) && - !S->notEligibleToImport() && S->refs().empty(); -} } // end namespace llvm #endif // LLVM_IR_MODULESUMMARYINDEX_H |