[llvm] 452a14e - Revert "[MemProf] ThinLTO summary support"
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 15 07:41:32 PST 2022
Author: Teresa Johnson
Date: 2022-11-15T07:39:40-08:00
New Revision: 452a14efc84edf808d1e2953dad2c694972b312f
URL: https://github.com/llvm/llvm-project/commit/452a14efc84edf808d1e2953dad2c694972b312f
DIFF: https://github.com/llvm/llvm-project/commit/452a14efc84edf808d1e2953dad2c694972b312f.diff
LOG: Revert "[MemProf] ThinLTO summary support"
This reverts commit 47459455009db4790ffc3765a2ec0f8b4934c2a4.
Revert while I try to fix a couple of non-Linux build failures.
Added:
Modified:
llvm/include/llvm/Analysis/MemoryProfileInfo.h
llvm/include/llvm/AsmParser/LLParser.h
llvm/include/llvm/AsmParser/LLToken.h
llvm/include/llvm/AsmParser/Parser.h
llvm/include/llvm/Bitcode/BitcodeReader.h
llvm/include/llvm/Bitcode/LLVMBitCodes.h
llvm/include/llvm/IR/ModuleSummaryIndex.h
llvm/include/llvm/IR/ModuleSummaryIndexYAML.h
llvm/lib/Analysis/MemoryProfileInfo.cpp
llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
llvm/lib/AsmParser/LLLexer.cpp
llvm/lib/AsmParser/LLParser.cpp
llvm/lib/AsmParser/Parser.cpp
llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
llvm/lib/IR/AsmWriter.cpp
llvm/lib/LTO/LTO.cpp
llvm/unittests/Analysis/MemoryProfileInfoTest.cpp
Removed:
llvm/test/Assembler/thinlto-memprof-summary.ll
llvm/test/ThinLTO/X86/memprof-summary.ll
################################################################################
diff --git a/llvm/include/llvm/Analysis/MemoryProfileInfo.h b/llvm/include/llvm/Analysis/MemoryProfileInfo.h
index 4758cbc23fe3c..1b12e78eaeba3 100644
--- a/llvm/include/llvm/Analysis/MemoryProfileInfo.h
+++ b/llvm/include/llvm/Analysis/MemoryProfileInfo.h
@@ -17,12 +17,18 @@
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
-#include "llvm/IR/ModuleSummaryIndex.h"
#include <map>
namespace llvm {
namespace memprof {
+// Allocation type assigned to an allocation reached by a given context.
+// More can be added but initially this is just noncold and cold.
+// Values should be powers of two so that they can be ORed, in particular to
+// track allocations that have
diff erent behavior with
diff erent calling
+// contexts.
+enum class AllocationType : uint8_t { None = 0, NotCold = 1, Cold = 2 };
+
/// Return the allocation type for a given set of memory profile values.
AllocationType getAllocType(uint64_t MaxAccessCount, uint64_t MinSize,
uint64_t MinLifetime);
@@ -100,62 +106,6 @@ class CallStackTrie {
bool buildAndAttachMIBMetadata(CallBase *CI);
};
-/// Helper class to iterate through stack ids in both metadata (memprof MIB and
-/// callsite) and the corresponding ThinLTO summary data structures
-/// (CallsiteInfo and MIBInfo). This simplifies implementation of client code
-/// which doesn't need to worry about whether we are operating with IR (Regular
-/// LTO), or summary (ThinLTO).
-template <class NodeT, class IteratorT> class CallStack {
-public:
- CallStack(const NodeT *N = nullptr) : N(N) {}
-
- // Implement minimum required methods for range-based for loop.
- // The default implementation assumes we are operating on ThinLTO data
- // structures, which have a vector of StackIdIndices. There are specialized
- // versions provided to iterate through metadata.
- struct CallStackIterator {
- const NodeT *N = nullptr;
- IteratorT Iter;
- CallStackIterator(const NodeT *N, bool End) : N(N) {
- if (!N)
- return;
- Iter = End ? N->StackIdIndices.end() : N->StackIdIndices.begin();
- }
- uint64_t operator*() {
- assert(Iter != N->StackIdIndices.end());
- return *Iter;
- }
- bool operator==(const CallStackIterator &rhs) { return Iter == rhs.Iter; }
- bool operator!=(const CallStackIterator &rhs) { return !(*this == rhs); }
- void operator++() { ++Iter; }
- };
-
- bool empty() const { return N == nullptr; }
-
- CallStackIterator begin() const {
- return CallStackIterator(N, /*End*/ false);
- }
- CallStackIterator end() const { return CallStackIterator(N, /*End*/ true); }
-
- CallStackIterator beginAfterSharedPrefix(CallStack &Other) {
- CallStackIterator Cur = begin();
- for (CallStackIterator OtherCur = Other.begin();
- Cur != end() && OtherCur != Other.end(); ++Cur, ++OtherCur)
- assert(*Cur == *OtherCur);
- return Cur;
- }
-
-private:
- const NodeT *N = nullptr;
-};
-
-/// Specializations for iterating through IR metadata stack contexts.
-template <>
-CallStack<MDNode, MDNode::op_iterator>::CallStackIterator::CallStackIterator(
- const MDNode *N, bool End);
-template <>
-uint64_t CallStack<MDNode, MDNode::op_iterator>::CallStackIterator::operator*();
-
} // end namespace memprof
} // end namespace llvm
diff --git a/llvm/include/llvm/AsmParser/LLParser.h b/llvm/include/llvm/AsmParser/LLParser.h
index d936c6f36b6f5..e9813c34ce373 100644
--- a/llvm/include/llvm/AsmParser/LLParser.h
+++ b/llvm/include/llvm/AsmParser/LLParser.h
@@ -406,10 +406,6 @@ namespace llvm {
void addGlobalValueToIndex(std::string Name, GlobalValue::GUID,
GlobalValue::LinkageTypes Linkage, unsigned ID,
std::unique_ptr<GlobalValueSummary> Summary);
- bool parseOptionalAllocs(std::vector<AllocInfo> &Allocs);
- bool parseMemProfs(std::vector<MIBInfo> &MIBs);
- bool parseAllocType(uint8_t &AllocType);
- bool parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites);
// Type Parsing.
bool parseType(Type *&Result, const Twine &Msg, bool AllowVoid = false);
diff --git a/llvm/include/llvm/AsmParser/LLToken.h b/llvm/include/llvm/AsmParser/LLToken.h
index 8a679007a504f..5fc192f145aaf 100644
--- a/llvm/include/llvm/AsmParser/LLToken.h
+++ b/llvm/include/llvm/AsmParser/LLToken.h
@@ -406,15 +406,6 @@ enum Kind {
kw_byte,
kw_bit,
kw_varFlags,
- // The following are used by MemProf summary info.
- kw_callsites,
- kw_clones,
- kw_stackIds,
- kw_allocs,
- kw_versions,
- kw_memProf,
- kw_notcold,
- kw_notcoldandcold,
// GV's with __attribute__((no_sanitize("address"))), or things in
// -fsanitize-ignorelist when built with ASan.
diff --git a/llvm/include/llvm/AsmParser/Parser.h b/llvm/include/llvm/AsmParser/Parser.h
index 336e95c2399f0..6710ae6e358d4 100644
--- a/llvm/include/llvm/AsmParser/Parser.h
+++ b/llvm/include/llvm/AsmParser/Parser.h
@@ -105,17 +105,6 @@ ParsedModuleAndIndex parseAssemblyFileWithIndexNoUpgradeDebugInfo(
std::unique_ptr<ModuleSummaryIndex>
parseSummaryIndexAssemblyFile(StringRef Filename, SMDiagnostic &Err);
-/// The function is a secondary interface to the LLVM Assembly Parser. It parses
-/// an ASCII string that (presumably) contains LLVM Assembly code for a module
-/// summary. It returns a a ModuleSummaryIndex with the corresponding features.
-/// Note that this does not verify that the generated Index is valid, so you
-/// should run the verifier after parsing the file to check that it is okay.
-/// Parse LLVM Assembly from a string
-/// \param AsmString The string containing assembly
-/// \param Err Error result info.
-std::unique_ptr<ModuleSummaryIndex>
-parseSummaryIndexAssemblyString(StringRef AsmString, SMDiagnostic &Err);
-
/// parseAssemblyFile and parseAssemblyString are wrappers around this function.
/// Parse LLVM Assembly from a MemoryBuffer.
/// \param F The MemoryBuffer containing assembly
diff --git a/llvm/include/llvm/Bitcode/BitcodeReader.h b/llvm/include/llvm/Bitcode/BitcodeReader.h
index bc1f88f732290..39ea48c33fc36 100644
--- a/llvm/include/llvm/Bitcode/BitcodeReader.h
+++ b/llvm/include/llvm/Bitcode/BitcodeReader.h
@@ -16,7 +16,6 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Bitstream/BitCodeEnums.h"
-#include "llvm/IR/GlobalValue.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorOr.h"
@@ -118,10 +117,8 @@ typedef llvm::function_ref<Optional<std::string>(StringRef)>
/// Parse the specified bitcode buffer and merge its module summary index
/// into CombinedIndex.
- Error
- readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath,
- uint64_t ModuleId,
- std::function<bool(GlobalValue::GUID)> IsPrevailing = nullptr);
+ Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath,
+ uint64_t ModuleId);
};
struct BitcodeFileContents {
diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
index 2b474b67425c8..74a51d5ce6907 100644
--- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h
+++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
@@ -301,22 +301,6 @@ enum GlobalValueSummarySymtabCodes {
// Range information for accessed offsets for every argument.
// [n x (paramno, range, numcalls, numcalls x (callee_guid, paramno, range))]
FS_PARAM_ACCESS = 25,
- // Summary of per-module memprof callsite metadata.
- // [valueid, n x stackidindex]
- FS_PERMODULE_CALLSITE_INFO = 26,
- // Summary of per-module allocation memprof metadata.
- // [n x (alloc type, nummib, nummib x stackidindex)]
- FS_PERMODULE_ALLOC_INFO = 27,
- // Summary of combined index memprof callsite metadata.
- // [valueid, numstackindices, numver,
- // numstackindices x stackidindex, numver x version]
- FS_COMBINED_CALLSITE_INFO = 28,
- // Summary of combined index allocation memprof metadata.
- // [nummib, numver,
- // nummib x (alloc type, numstackids, numstackids x stackidindex),
- // numver x version]
- FS_COMBINED_ALLOC_INFO = 29,
- FS_STACK_IDS = 30,
};
enum MetadataCodes {
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h
index 4bcf21edfecb4..9f25b5a1e5503 100644
--- a/llvm/include/llvm/IR/ModuleSummaryIndex.h
+++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h
@@ -19,7 +19,6 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
@@ -285,79 +284,6 @@ template <> struct DenseMapInfo<ValueInfo> {
static unsigned getHashValue(ValueInfo I) { return (uintptr_t)I.getRef(); }
};
-/// Summary of memprof callsite metadata.
-struct CallsiteInfo {
- // Actual callee function.
- ValueInfo Callee;
-
- // Used to record whole program analysis cloning decisions.
- // The ThinLTO backend will need to create as many clones as there are entries
- // in the vector (it is expected and should be confirmed that all such
- // summaries in the same FunctionSummary have the same number of entries).
- // Each index records version info for the corresponding clone of this
- // function. The value is the callee clone it calls (becomes the appended
- // suffix id). Index 0 is the original version, and a value of 0 calls the
- // original callee.
- SmallVector<unsigned> Clones{0};
-
- // Represents stack ids in this context, recorded as indices into the
- // StackIds vector in the summary index, which in turn holds the full 64-bit
- // stack ids. This reduces memory as there are in practice far fewer unique
- // stack ids than stack id references.
- SmallVector<unsigned> StackIdIndices;
-
- CallsiteInfo(ValueInfo Callee, SmallVector<unsigned> StackIdIndices)
- : Callee(Callee), StackIdIndices(std::move(StackIdIndices)) {}
- CallsiteInfo(ValueInfo Callee, SmallVector<unsigned> Clones,
- SmallVector<unsigned> StackIdIndices)
- : Callee(Callee), Clones(std::move(Clones)),
- StackIdIndices(std::move(StackIdIndices)) {}
-};
-
-// Allocation type assigned to an allocation reached by a given context.
-// More can be added but initially this is just noncold and cold.
-// Values should be powers of two so that they can be ORed, in particular to
-// track allocations that have
diff erent behavior with
diff erent calling
-// contexts.
-enum class AllocationType : uint8_t { None = 0, NotCold = 1, Cold = 2 };
-
-/// Summary of a single MIB in a memprof metadata on allocations.
-struct MIBInfo {
- // The allocation type for this profiled context.
- AllocationType AllocType;
-
- // Represents stack ids in this context, recorded as indices into the
- // StackIds vector in the summary index, which in turn holds the full 64-bit
- // stack ids. This reduces memory as there are in practice far fewer unique
- // stack ids than stack id references.
- SmallVector<unsigned> StackIdIndices;
-
- MIBInfo(AllocationType AllocType, SmallVector<unsigned> StackIdIndices)
- : AllocType(AllocType), StackIdIndices(std::move(StackIdIndices)) {}
-};
-
-/// Summary of memprof metadata on allocations.
-struct AllocInfo {
- // Used to record whole program analysis cloning decisions.
- // The ThinLTO backend will need to create as many clones as there are entries
- // in the vector (it is expected and should be confirmed that all such
- // summaries in the same FunctionSummary have the same number of entries).
- // Each index records version info for the corresponding clone of this
- // function. The value is the allocation type of the corresponding allocation.
- // Index 0 is the original version. Before cloning, index 0 may have more than
- // one allocation type.
- SmallVector<uint8_t> Versions;
-
- // Vector of MIBs in this memprof metadata.
- std::vector<MIBInfo> MIBs;
-
- AllocInfo(std::vector<MIBInfo> MIBs) : MIBs(std::move(MIBs)) {
- Versions.push_back(0);
- }
- AllocInfo(SmallVector<uint8_t> Versions, std::vector<MIBInfo> MIBs)
- : Versions(std::move(Versions)), MIBs(std::move(MIBs)) {}
-};
-
/// Function and variable summary information to aid decisions and
/// implementation of importing.
class GlobalValueSummary {
@@ -752,8 +678,7 @@ class FunctionSummary : public GlobalValueSummary {
std::vector<FunctionSummary::VFuncId>(),
std::vector<FunctionSummary::ConstVCall>(),
std::vector<FunctionSummary::ConstVCall>(),
- std::vector<FunctionSummary::ParamAccess>(),
- std::vector<CallsiteInfo>(), std::vector<AllocInfo>());
+ std::vector<FunctionSummary::ParamAccess>());
}
/// A dummy node to reference external functions that aren't in the index
@@ -781,25 +706,6 @@ class FunctionSummary : public GlobalValueSummary {
using ParamAccessesTy = std::vector<ParamAccess>;
std::unique_ptr<ParamAccessesTy> ParamAccesses;
- /// Optional list of memprof callsite metadata summaries. The correspondence
- /// between the callsite summary and the callsites in the function is implied
- /// by the order in the vector (and can be validated by comparing the stack
- /// ids in the CallsiteInfo to those in the instruction callsite metadata).
- /// As a memory savings optimization, we only create these for the prevailing
- /// copy of a symbol when creating the combined index during LTO.
- using CallsitesTy = std::vector<CallsiteInfo>;
- std::unique_ptr<CallsitesTy> Callsites;
-
- /// Optional list of allocation memprof metadata summaries. The correspondence
- /// between the alloc memprof summary and the allocation callsites in the
- /// function is implied by the order in the vector (and can be validated by
- /// comparing the stack ids in the AllocInfo to those in the instruction
- /// memprof metadata).
- /// As a memory savings optimization, we only create these for the prevailing
- /// copy of a symbol when creating the combined index during LTO.
- using AllocsTy = std::vector<AllocInfo>;
- std::unique_ptr<AllocsTy> Allocs;
-
public:
FunctionSummary(GVFlags Flags, unsigned NumInsts, FFlags FunFlags,
uint64_t EntryCount, std::vector<ValueInfo> Refs,
@@ -809,8 +715,7 @@ class FunctionSummary : public GlobalValueSummary {
std::vector<VFuncId> TypeCheckedLoadVCalls,
std::vector<ConstVCall> TypeTestAssumeConstVCalls,
std::vector<ConstVCall> TypeCheckedLoadConstVCalls,
- std::vector<ParamAccess> Params, CallsitesTy CallsiteList,
- AllocsTy AllocList)
+ std::vector<ParamAccess> Params)
: GlobalValueSummary(FunctionKind, Flags, std::move(Refs)),
InstCount(NumInsts), FunFlags(FunFlags), EntryCount(EntryCount),
CallGraphEdgeList(std::move(CGEdges)) {
@@ -824,10 +729,6 @@ class FunctionSummary : public GlobalValueSummary {
std::move(TypeCheckedLoadConstVCalls)});
if (!Params.empty())
ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(Params));
- if (!CallsiteList.empty())
- Callsites = std::make_unique<CallsitesTy>(std::move(CallsiteList));
- if (!AllocList.empty())
- Allocs = std::make_unique<AllocsTy>(std::move(AllocList));
}
// Gets the number of readonly and writeonly refs in RefEdgeList
std::pair<unsigned, unsigned> specialRefCounts() const;
@@ -931,18 +832,6 @@ class FunctionSummary : public GlobalValueSummary {
const TypeIdInfo *getTypeIdInfo() const { return TIdInfo.get(); };
- ArrayRef<CallsiteInfo> callsites() const {
- if (Callsites)
- return *Callsites;
- return {};
- }
-
- ArrayRef<AllocInfo> allocs() const {
- if (Allocs)
- return *Allocs;
- return {};
- }
-
friend struct GraphTraits<ValueInfo>;
};
@@ -1274,16 +1163,6 @@ class ModuleSummaryIndex {
// the total number of basic blocks in the LTO unit in the combined index.
uint64_t BlockCount;
- // List of unique stack ids (hashes). We use a 4B index of the id in the
- // stack id lists on the alloc and callsite summaries for memory savings,
- // since the number of unique ids is in practice much smaller than the
- // number of stack id references in the summaries.
- std::vector<uint64_t> StackIds;
-
- // Temporary map while building StackIds list. Clear when index is completely
- // built via releaseTemporaryMemory.
- std::map<uint64_t, unsigned> StackIdToIndex;
-
// YAML I/O support.
friend yaml::MappingTraits<ModuleSummaryIndex>;
@@ -1326,31 +1205,6 @@ class ModuleSummaryIndex {
const_gvsummary_iterator end() const { return GlobalValueMap.end(); }
size_t size() const { return GlobalValueMap.size(); }
- const std::vector<uint64_t> &stackIds() const { return StackIds; }
-
- unsigned addOrGetStackIdIndex(uint64_t StackId) {
- auto Inserted = StackIdToIndex.insert({StackId, StackIds.size()});
- if (Inserted.second)
- StackIds.push_back(StackId);
- return Inserted.first->second;
- }
-
- uint64_t getStackIdAtIndex(unsigned Index) const {
- assert(StackIds.size() > Index);
- return StackIds[Index];
- }
-
- // Facility to release memory from data structures only needed during index
- // construction (including while building combined index). Currently this only
- // releases the temporary map used while constructing a correspondence between
- // stack ids and their index in the StackIds vector. Mostly impactful when
- // building a large combined index.
- void releaseTemporaryMemory() {
- assert(StackIdToIndex.size() == StackIds.size());
- StackIdToIndex.clear();
- StackIds.shrink_to_fit();
- }
-
/// Convenience function for doing a DFS on a ValueInfo. Marks the function in
/// the FunctionHasParent map.
static void discoverNodes(ValueInfo V,
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h b/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h
index 33e57e5f2102f..74e92797f15ce 100644
--- a/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h
+++ b/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h
@@ -234,8 +234,7 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
std::move(FSum.TypeCheckedLoadVCalls),
std::move(FSum.TypeTestAssumeConstVCalls),
std::move(FSum.TypeCheckedLoadConstVCalls),
- ArrayRef<FunctionSummary::ParamAccess>{}, ArrayRef<CallsiteInfo>{},
- ArrayRef<AllocInfo>{}));
+ ArrayRef<FunctionSummary::ParamAccess>{}));
}
}
static void output(IO &io, GlobalValueSummaryMapTy &V) {
diff --git a/llvm/lib/Analysis/MemoryProfileInfo.cpp b/llvm/lib/Analysis/MemoryProfileInfo.cpp
index f42fff5f195f8..f28ddbbfc8498 100644
--- a/llvm/lib/Analysis/MemoryProfileInfo.cpp
+++ b/llvm/lib/Analysis/MemoryProfileInfo.cpp
@@ -224,21 +224,3 @@ bool CallStackTrie::buildAndAttachMIBMetadata(CallBase *CI) {
CI->setMetadata(LLVMContext::MD_memprof, MDNode::get(Ctx, MIBNodes));
return true;
}
-
-template <>
-CallStack<MDNode, MDNode::op_iterator>::CallStackIterator::CallStackIterator(
- const MDNode *N, bool End)
- : N(N) {
- if (!N)
- return;
- Iter = End ? N->op_end() : N->op_begin();
-}
-
-template <>
-uint64_t
-CallStack<MDNode, MDNode::op_iterator>::CallStackIterator::operator*() {
- assert(Iter != N->op_end());
- ConstantInt *StackIdCInt = mdconst::dyn_extract<ConstantInt>(*Iter);
- assert(StackIdCInt);
- return StackIdCInt->getZExtValue();
-}
diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
index e8309f51a4987..52827c210b5ad 100644
--- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
+++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
@@ -24,7 +24,6 @@
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/IndirectCallPromotionAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
-#include "llvm/Analysis/MemoryProfileInfo.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/StackSafetyAnalysis.h"
#include "llvm/Analysis/TypeMetadataUtils.h"
@@ -57,7 +56,6 @@
#include <vector>
using namespace llvm;
-using namespace llvm::memprof;
#define DEBUG_TYPE "module-summary-analysis"
@@ -277,9 +275,6 @@ static void computeFunctionSummary(
std::vector<const Instruction *> NonVolatileLoads;
std::vector<const Instruction *> NonVolatileStores;
- std::vector<CallsiteInfo> Callsites;
- std::vector<AllocInfo> Allocs;
-
bool HasInlineAsmMaybeReferencingInternal = false;
bool HasIndirBranchToBlockAddress = false;
bool HasUnknownCall = false;
@@ -422,57 +417,6 @@ static void computeFunctionSummary(
CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)]
.updateHotness(getHotness(Candidate.Count, PSI));
}
-
- // TODO: Skip indirect calls for now. Need to handle these better, likely
- // by creating multiple Callsites, one per target, then speculatively
- // devirtualize while applying clone info in the ThinLTO backends. This
- // will also be important because we will have a
diff erent set of clone
- // versions per target. This handling needs to match that in the ThinLTO
- // backend so we handle things consistently for matching of callsite
- // summaries to instructions.
- if (!CalledFunction)
- continue;
-
- // Compute the list of stack ids first (so we can trim them from the stack
- // ids on any MIBs).
- CallStack<MDNode, MDNode::op_iterator> InstCallsite(
- I.getMetadata(LLVMContext::MD_callsite));
- auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof);
- if (MemProfMD) {
- std::vector<MIBInfo> MIBs;
- for (auto &MDOp : MemProfMD->operands()) {
- auto *MIBMD = cast<const MDNode>(MDOp);
- MDNode *StackNode = getMIBStackNode(MIBMD);
- assert(StackNode);
- SmallVector<unsigned> StackIdIndices;
- CallStack<MDNode, MDNode::op_iterator> StackContext(StackNode);
- // Collapse out any on the allocation call (inlining).
- for (auto ContextIter =
- StackContext.beginAfterSharedPrefix(InstCallsite);
- ContextIter != StackContext.end(); ++ContextIter) {
- unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);
- // If this is a direct recursion, simply skip the duplicate
- // entries. If this is mutual recursion, handling is left to
- // the LTO link analysis client.
- if (StackIdIndices.empty() || StackIdIndices.back() != StackIdIdx)
- StackIdIndices.push_back(StackIdIdx);
- }
- MIBs.push_back(
- MIBInfo(getMIBAllocType(MIBMD), std::move(StackIdIndices)));
- }
- Allocs.push_back(AllocInfo(std::move(MIBs)));
- } else if (!InstCallsite.empty()) {
- SmallVector<unsigned> StackIdIndices;
- for (auto StackId : InstCallsite)
- StackIdIndices.push_back(Index.addOrGetStackIdIndex(StackId));
- // Use the original CalledValue, in case it was an alias. We want
- // to record the call edge to the alias in that case. Eventually
- // an alias summary will be created to associate the alias and
- // aliasee.
- auto CalleeValueInfo =
- Index.getOrInsertValueInfo(cast<GlobalValue>(CalledValue));
- Callsites.push_back({CalleeValueInfo, StackIdIndices});
- }
}
}
Index.addBlockCount(F.size());
@@ -564,8 +508,7 @@ static void computeFunctionSummary(
CallGraphEdges.takeVector(), TypeTests.takeVector(),
TypeTestAssumeVCalls.takeVector(), TypeCheckedLoadVCalls.takeVector(),
TypeTestAssumeConstVCalls.takeVector(),
- TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),
- std::move(Callsites), std::move(Allocs));
+ TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses));
if (NonRenamableLocal)
CantBePromoted.insert(F.getGUID());
Index.addGlobalValueSummary(F, std::move(FuncSummary));
@@ -814,8 +757,7 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
ArrayRef<FunctionSummary::VFuncId>{},
ArrayRef<FunctionSummary::ConstVCall>{},
ArrayRef<FunctionSummary::ConstVCall>{},
- ArrayRef<FunctionSummary::ParamAccess>{},
- ArrayRef<CallsiteInfo>{}, ArrayRef<AllocInfo>{});
+ ArrayRef<FunctionSummary::ParamAccess>{});
Index.addGlobalValueSummary(*GV, std::move(Summary));
} else {
std::unique_ptr<GlobalVarSummary> Summary =
diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp
index c33dc9710f35a..2a171df168fca 100644
--- a/llvm/lib/AsmParser/LLLexer.cpp
+++ b/llvm/lib/AsmParser/LLLexer.cpp
@@ -772,14 +772,6 @@ lltok::Kind LLLexer::LexIdentifier() {
KEYWORD(byte);
KEYWORD(bit);
KEYWORD(varFlags);
- KEYWORD(callsites);
- KEYWORD(clones);
- KEYWORD(stackIds);
- KEYWORD(allocs);
- KEYWORD(versions);
- KEYWORD(memProf);
- KEYWORD(notcold);
- KEYWORD(notcoldandcold);
#undef KEYWORD
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp
index dde0672da8e48..7fc51682533f6 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -8682,8 +8682,6 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
FunctionSummary::TypeIdInfo TypeIdInfo;
std::vector<FunctionSummary::ParamAccess> ParamAccesses;
std::vector<ValueInfo> Refs;
- std::vector<CallsiteInfo> Callsites;
- std::vector<AllocInfo> Allocs;
// Default is all-zeros (conservative values).
FunctionSummary::FFlags FFlags = {};
if (parseToken(lltok::colon, "expected ':' here") ||
@@ -8718,14 +8716,6 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
if (parseOptionalParamAccesses(ParamAccesses))
return true;
break;
- case lltok::kw_allocs:
- if (parseOptionalAllocs(Allocs))
- return true;
- break;
- case lltok::kw_callsites:
- if (parseOptionalCallsites(Callsites))
- return true;
- break;
default:
return error(Lex.getLoc(), "expected optional function summary field");
}
@@ -8741,7 +8731,7 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
std::move(TypeIdInfo.TypeCheckedLoadVCalls),
std::move(TypeIdInfo.TypeTestAssumeConstVCalls),
std::move(TypeIdInfo.TypeCheckedLoadConstVCalls),
- std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
+ std::move(ParamAccesses));
FS->setModulePath(ModulePath);
@@ -9693,220 +9683,3 @@ bool LLParser::parseGVReference(ValueInfo &VI, unsigned &GVId) {
VI.setWriteOnly();
return false;
}
-
-/// OptionalAllocs
-/// := 'allocs' ':' '(' Alloc [',' Alloc]* ')'
-/// Alloc ::= '(' 'versions' ':' '(' Version [',' Version]* ')'
-/// ',' MemProfs ')'
-/// Version ::= UInt32
-bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
- assert(Lex.getKind() == lltok::kw_allocs);
- Lex.Lex();
-
- if (parseToken(lltok::colon, "expected ':' in allocs") ||
- parseToken(lltok::lparen, "expected '(' in allocs"))
- return true;
-
- // parse each alloc
- do {
- if (parseToken(lltok::lparen, "expected '(' in alloc") ||
- parseToken(lltok::kw_versions, "expected 'versions' in alloc") ||
- parseToken(lltok::colon, "expected ':'") ||
- parseToken(lltok::lparen, "expected '(' in versions"))
- return true;
-
- SmallVector<uint8_t> Versions;
- do {
- uint8_t V = 0;
- if (parseAllocType(V))
- return true;
- Versions.push_back(V);
- } while (EatIfPresent(lltok::comma));
-
- if (parseToken(lltok::rparen, "expected ')' in versions") ||
- parseToken(lltok::comma, "expected ',' in alloc"))
- return true;
-
- std::vector<MIBInfo> MIBs;
- if (parseMemProfs(MIBs))
- return true;
-
- Allocs.push_back({Versions, MIBs});
-
- if (parseToken(lltok::rparen, "expected ')' in alloc"))
- return true;
- } while (EatIfPresent(lltok::comma));
-
- if (parseToken(lltok::rparen, "expected ')' in allocs"))
- return true;
-
- return false;
-}
-
-/// MemProfs
-/// := 'memProf' ':' '(' MemProf [',' MemProf]* ')'
-/// MemProf ::= '(' 'type' ':' AllocType
-/// ',' 'stackIds' ':' '(' StackId [',' StackId]* ')' ')'
-/// StackId ::= UInt64
-bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
- assert(Lex.getKind() == lltok::kw_memProf);
- Lex.Lex();
-
- if (parseToken(lltok::colon, "expected ':' in memprof") ||
- parseToken(lltok::lparen, "expected '(' in memprof"))
- return true;
-
- // parse each MIB
- do {
- if (parseToken(lltok::lparen, "expected '(' in memprof") ||
- parseToken(lltok::kw_type, "expected 'type' in memprof") ||
- parseToken(lltok::colon, "expected ':'"))
- return true;
-
- uint8_t AllocType;
- if (parseAllocType(AllocType))
- return true;
-
- if (parseToken(lltok::comma, "expected ',' in memprof") ||
- parseToken(lltok::kw_stackIds, "expected 'stackIds' in memprof") ||
- parseToken(lltok::colon, "expected ':'") ||
- parseToken(lltok::lparen, "expected '(' in stackIds"))
- return true;
-
- SmallVector<unsigned> StackIdIndices;
- do {
- uint64_t StackId = 0;
- if (parseUInt64(StackId))
- return true;
- StackIdIndices.push_back(Index->addOrGetStackIdIndex(StackId));
- } while (EatIfPresent(lltok::comma));
-
- if (parseToken(lltok::rparen, "expected ')' in stackIds"))
- return true;
-
- MIBs.push_back({(AllocationType)AllocType, StackIdIndices});
-
- if (parseToken(lltok::rparen, "expected ')' in memprof"))
- return true;
- } while (EatIfPresent(lltok::comma));
-
- if (parseToken(lltok::rparen, "expected ')' in memprof"))
- return true;
-
- return false;
-}
-
-/// AllocType
-/// := ('none'|'notcold'|'cold'|'notcoldandcold')
-bool LLParser::parseAllocType(uint8_t &AllocType) {
- switch (Lex.getKind()) {
- case lltok::kw_none:
- AllocType = (uint8_t)AllocationType::None;
- break;
- case lltok::kw_notcold:
- AllocType = (uint8_t)AllocationType::NotCold;
- break;
- case lltok::kw_cold:
- AllocType = (uint8_t)AllocationType::Cold;
- break;
- case lltok::kw_notcoldandcold:
- AllocType =
- (uint8_t)AllocationType::NotCold | (uint8_t)AllocationType::Cold;
- break;
- default:
- return error(Lex.getLoc(), "invalid alloc type");
- }
- Lex.Lex();
- return false;
-}
-
-/// OptionalCallsites
-/// := 'callsites' ':' '(' Callsite [',' Callsite]* ')'
-/// Callsite ::= '(' 'callee' ':' GVReference
-/// ',' 'clones' ':' '(' Version [',' Version]* ')'
-/// ',' 'stackIds' ':' '(' StackId [',' StackId]* ')' ')'
-/// Version ::= UInt32
-/// StackId ::= UInt64
-bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
- assert(Lex.getKind() == lltok::kw_callsites);
- Lex.Lex();
-
- if (parseToken(lltok::colon, "expected ':' in callsites") ||
- parseToken(lltok::lparen, "expected '(' in callsites"))
- return true;
-
- IdToIndexMapType IdToIndexMap;
- // parse each callsite
- do {
- if (parseToken(lltok::lparen, "expected '(' in callsite") ||
- parseToken(lltok::kw_callee, "expected 'callee' in callsite") ||
- parseToken(lltok::colon, "expected ':'"))
- return true;
-
- ValueInfo VI;
- unsigned GVId = 0;
- LocTy Loc = Lex.getLoc();
- if (!EatIfPresent(lltok::kw_null)) {
- if (parseGVReference(VI, GVId))
- return true;
- }
-
- if (parseToken(lltok::comma, "expected ',' in callsite") ||
- parseToken(lltok::kw_clones, "expected 'clones' in callsite") ||
- parseToken(lltok::colon, "expected ':'") ||
- parseToken(lltok::lparen, "expected '(' in clones"))
- return true;
-
- SmallVector<unsigned> Clones;
- do {
- unsigned V = 0;
- if (parseUInt32(V))
- return true;
- Clones.push_back(V);
- } while (EatIfPresent(lltok::comma));
-
- if (parseToken(lltok::rparen, "expected ')' in clones") ||
- parseToken(lltok::comma, "expected ',' in callsite") ||
- parseToken(lltok::kw_stackIds, "expected 'stackIds' in callsite") ||
- parseToken(lltok::colon, "expected ':'") ||
- parseToken(lltok::lparen, "expected '(' in stackIds"))
- return true;
-
- SmallVector<unsigned> StackIdIndices;
- do {
- uint64_t StackId = 0;
- if (parseUInt64(StackId))
- return true;
- StackIdIndices.push_back(Index->addOrGetStackIdIndex(StackId));
- } while (EatIfPresent(lltok::comma));
-
- if (parseToken(lltok::rparen, "expected ')' in stackIds"))
- return true;
-
- // Keep track of the Callsites array index needing a forward reference.
- // We will save the location of the ValueInfo needing an update, but
- // can only do so once the SmallVector is finalized.
- if (VI.getRef() == FwdVIRef)
- IdToIndexMap[GVId].push_back(std::make_pair(Callsites.size(), Loc));
- Callsites.push_back({VI, Clones, StackIdIndices});
-
- if (parseToken(lltok::rparen, "expected ')' in callsite"))
- return true;
- } while (EatIfPresent(lltok::comma));
-
- // Now that the Callsites vector is finalized, it is safe to save the
- // locations of any forward GV references that need updating later.
- for (auto I : IdToIndexMap) {
- auto &Infos = ForwardRefValueInfos[I.first];
- for (auto P : I.second) {
- assert(Callsites[P.first].Callee.getRef() == FwdVIRef &&
- "Forward referenced ValueInfo expected to be empty");
- Infos.emplace_back(&Callsites[P.first].Callee, P.second);
- }
- }
-
- if (parseToken(lltok::rparen, "expected ')' in callsites"))
- return true;
-
- return false;
-}
diff --git a/llvm/lib/AsmParser/Parser.cpp b/llvm/lib/AsmParser/Parser.cpp
index 4458ae757c160..95b9079f0f9cc 100644
--- a/llvm/lib/AsmParser/Parser.cpp
+++ b/llvm/lib/AsmParser/Parser.cpp
@@ -177,12 +177,6 @@ llvm::parseSummaryIndexAssemblyFile(StringRef Filename, SMDiagnostic &Err) {
return parseSummaryIndexAssembly(FileOrErr.get()->getMemBufferRef(), Err);
}
-std::unique_ptr<ModuleSummaryIndex>
-llvm::parseSummaryIndexAssemblyString(StringRef AsmString, SMDiagnostic &Err) {
- MemoryBufferRef F(AsmString, "<string>");
- return parseSummaryIndexAssembly(F, Err);
-}
-
Constant *llvm::parseConstantValue(StringRef Asm, SMDiagnostic &Err,
const Module &M, const SlotMapping *Slots) {
SourceMgr SM;
diff --git a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
index 97bc828066a50..dd3cac8b8a6fb 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
@@ -315,11 +315,6 @@ static Optional<const char *> GetCodeName(unsigned CodeID, unsigned BlockID,
STRINGIFY_CODE(FS, TYPE_ID_METADATA)
STRINGIFY_CODE(FS, BLOCK_COUNT)
STRINGIFY_CODE(FS, PARAM_ACCESS)
- STRINGIFY_CODE(FS, PERMODULE_CALLSITE_INFO)
- STRINGIFY_CODE(FS, PERMODULE_ALLOC_INFO)
- STRINGIFY_CODE(FS, COMBINED_CALLSITE_INFO)
- STRINGIFY_CODE(FS, COMBINED_ALLOC_INFO)
- STRINGIFY_CODE(FS, STACK_IDS)
}
case bitc::METADATA_ATTACHMENT_ID:
switch (CodeID) {
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index c4805602d1ad1..0a2415cbfdefa 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -883,10 +883,8 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase {
// they are recorded in the summary index being built.
// We save a GUID which refers to the same global as the ValueInfo, but
// ignoring the linkage, i.e. for values other than local linkage they are
- // identical (this is the second tuple member).
- // The third tuple member is the real GUID of the ValueInfo.
- DenseMap<unsigned,
- std::tuple<ValueInfo, GlobalValue::GUID, GlobalValue::GUID>>
+ // identical.
+ DenseMap<unsigned, std::tuple<ValueInfo, GlobalValue::GUID>>
ValueIdToValueInfoMap;
/// Map populated during module path string table parsing, from the
@@ -906,19 +904,10 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase {
/// this module by the client.
unsigned ModuleId;
- /// Callback to ask whether a symbol is the prevailing copy when invoked
- /// during combined index building.
- std::function<bool(GlobalValue::GUID)> IsPrevailing;
-
- /// Saves the stack ids from the STACK_IDS record to consult when adding stack
- /// ids from the lists in the callsite and alloc entries to the index.
- std::vector<uint64_t> StackIds;
-
public:
- ModuleSummaryIndexBitcodeReader(
- BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
- StringRef ModulePath, unsigned ModuleId,
- std::function<bool(GlobalValue::GUID)> IsPrevailing = nullptr);
+ ModuleSummaryIndexBitcodeReader(BitstreamCursor Stream, StringRef Strtab,
+ ModuleSummaryIndex &TheIndex,
+ StringRef ModulePath, unsigned ModuleId);
Error parseModule();
@@ -942,8 +931,7 @@ class ModuleSummaryIndexBitcodeReader : public BitcodeReaderBase {
std::vector<FunctionSummary::ParamAccess>
parseParamAccesses(ArrayRef<uint64_t> Record);
- template <bool AllowNullValueInfo = false>
- std::tuple<ValueInfo, GlobalValue::GUID, GlobalValue::GUID>
+ std::tuple<ValueInfo, GlobalValue::GUID>
getValueInfoFromValueId(unsigned ValueId);
void addThisModule();
@@ -6655,10 +6643,9 @@ std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes() const {
ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
- StringRef ModulePath, unsigned ModuleId,
- std::function<bool(GlobalValue::GUID)> IsPrevailing)
+ StringRef ModulePath, unsigned ModuleId)
: BitcodeReaderBase(std::move(Cursor), Strtab), TheIndex(TheIndex),
- ModulePath(ModulePath), ModuleId(ModuleId), IsPrevailing(IsPrevailing) {}
+ ModulePath(ModulePath), ModuleId(ModuleId) {}
void ModuleSummaryIndexBitcodeReader::addThisModule() {
TheIndex.addModule(ModulePath, ModuleId);
@@ -6669,15 +6656,10 @@ ModuleSummaryIndexBitcodeReader::getThisModule() {
return TheIndex.getModule(ModulePath);
}
-template <bool AllowNullValueInfo>
-std::tuple<ValueInfo, GlobalValue::GUID, GlobalValue::GUID>
+std::tuple<ValueInfo, GlobalValue::GUID>
ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(unsigned ValueId) {
auto VGI = ValueIdToValueInfoMap[ValueId];
- // We can have a null value info for memprof callsite info records in
- // distributed ThinLTO index files when the callee function summary is not
- // included in the index. The bitcode writer records 0 in that case,
- // and the caller of this helper will set AllowNullValueInfo to true.
- assert(AllowNullValueInfo || std::get<0>(VGI));
+ assert(std::get<0>(VGI));
return VGI;
}
@@ -6700,7 +6682,7 @@ void ModuleSummaryIndexBitcodeReader::setValueGUID(
ValueIdToValueInfoMap[ValueID] = std::make_tuple(
TheIndex.getOrInsertValueInfo(
ValueGUID, UseStrtab ? ValueName : TheIndex.saveString(ValueName)),
- OriginalNameID, ValueGUID);
+ OriginalNameID);
}
// Specialized value symbol table parser used when reading module index
@@ -6788,8 +6770,8 @@ Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
GlobalValue::GUID RefGUID = Record[1];
// The "original name", which is the second value of the pair will be
// overriden later by a FS_COMBINED_ORIGINAL_NAME in the combined index.
- ValueIdToValueInfoMap[ValueID] = std::make_tuple(
- TheIndex.getOrInsertValueInfo(RefGUID), RefGUID, RefGUID);
+ ValueIdToValueInfoMap[ValueID] =
+ std::make_tuple(TheIndex.getOrInsertValueInfo(RefGUID), RefGUID);
break;
}
}
@@ -7134,9 +7116,6 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
PendingTypeCheckedLoadConstVCalls;
std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
- std::vector<CallsiteInfo> PendingCallsites;
- std::vector<AllocInfo> PendingAllocs;
-
while (true) {
Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
if (!MaybeEntry)
@@ -7175,8 +7154,8 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
case bitc::FS_VALUE_GUID: { // [valueid, refguid]
uint64_t ValueID = Record[0];
GlobalValue::GUID RefGUID = Record[1];
- ValueIdToValueInfoMap[ValueID] = std::make_tuple(
- TheIndex.getOrInsertValueInfo(RefGUID), RefGUID, RefGUID);
+ ValueIdToValueInfoMap[ValueID] =
+ std::make_tuple(TheIndex.getOrInsertValueInfo(RefGUID), RefGUID);
break;
}
// FS_PERMODULE: [valueid, flags, instcount, fflags, numrefs,
@@ -7228,13 +7207,6 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
IsOldProfileFormat, HasProfile, HasRelBF);
setSpecialRefs(Refs, NumRORefs, NumWORefs);
- auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
- // In order to save memory, only record the memprof summaries if this is
- // the prevailing copy of a symbol.
- if (IsPrevailing && !IsPrevailing(std::get<2>(VIAndOriginalGUID))) {
- PendingCallsites.clear();
- PendingAllocs.clear();
- }
auto FS = std::make_unique<FunctionSummary>(
Flags, InstCount, getDecodedFFlags(RawFunFlags), /*EntryCount=*/0,
std::move(Refs), std::move(Calls), std::move(PendingTypeTests),
@@ -7242,8 +7214,8 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
std::move(PendingTypeCheckedLoadVCalls),
std::move(PendingTypeTestAssumeConstVCalls),
std::move(PendingTypeCheckedLoadConstVCalls),
- std::move(PendingParamAccesses), std::move(PendingCallsites),
- std::move(PendingAllocs));
+ std::move(PendingParamAccesses));
+ auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
FS->setModulePath(getThisModule()->first());
FS->setOriginalName(std::get<1>(VIAndOriginalGUID));
TheIndex.addGlobalValueSummary(std::get<0>(VIAndOriginalGUID),
@@ -7386,8 +7358,7 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
std::move(PendingTypeCheckedLoadVCalls),
std::move(PendingTypeTestAssumeConstVCalls),
std::move(PendingTypeCheckedLoadConstVCalls),
- std::move(PendingParamAccesses), std::move(PendingCallsites),
- std::move(PendingAllocs));
+ std::move(PendingParamAccesses));
LastSeenSummary = FS.get();
LastSeenGUID = VI.getGUID();
FS->setModulePath(ModuleIdMap[ModuleId]);
@@ -7513,95 +7484,6 @@ Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(unsigned ID) {
PendingParamAccesses = parseParamAccesses(Record);
break;
}
-
- case bitc::FS_STACK_IDS: { // [n x stackid]
- // Save stack ids in the reader to consult when adding stack ids from the
- // lists in the stack node and alloc node entries.
- StackIds = ArrayRef<uint64_t>(Record);
- break;
- }
-
- case bitc::FS_PERMODULE_CALLSITE_INFO: {
- unsigned ValueID = Record[0];
- SmallVector<unsigned> StackIdList;
- for (auto R = Record.begin() + 1; R != Record.end(); R++) {
- assert(*R < StackIds.size());
- StackIdList.push_back(TheIndex.addOrGetStackIdIndex(StackIds[*R]));
- }
- ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
- PendingCallsites.push_back(CallsiteInfo({VI, std::move(StackIdList)}));
- break;
- }
-
- case bitc::FS_COMBINED_CALLSITE_INFO: {
- auto RecordIter = Record.begin();
- unsigned ValueID = *RecordIter++;
- unsigned NumStackIds = *RecordIter++;
- unsigned NumVersions = *RecordIter++;
- assert(Record.size() == 3 + NumStackIds + NumVersions);
- SmallVector<unsigned> StackIdList;
- for (unsigned J = 0; J < NumStackIds; J++) {
- assert(*RecordIter < StackIds.size());
- StackIdList.push_back(
- TheIndex.addOrGetStackIdIndex(StackIds[*RecordIter++]));
- }
- SmallVector<unsigned> Versions;
- for (unsigned J = 0; J < NumVersions; J++)
- Versions.push_back(*RecordIter++);
- ValueInfo VI = std::get<0>(
- getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
- PendingCallsites.push_back(
- CallsiteInfo({VI, std::move(Versions), std::move(StackIdList)}));
- break;
- }
-
- case bitc::FS_PERMODULE_ALLOC_INFO: {
- unsigned I = 0;
- std::vector<MIBInfo> MIBs;
- while (I < Record.size()) {
- assert(Record.size() - I >= 2);
- AllocationType AllocType = (AllocationType)Record[I++];
- unsigned NumStackEntries = Record[I++];
- assert(Record.size() - I >= NumStackEntries);
- SmallVector<unsigned> StackIdList;
- for (unsigned J = 0; J < NumStackEntries; J++) {
- assert(Record[I] < StackIds.size());
- StackIdList.push_back(
- TheIndex.addOrGetStackIdIndex(StackIds[Record[I++]]));
- }
- MIBs.push_back(MIBInfo(AllocType, std::move(StackIdList)));
- }
- PendingAllocs.push_back(AllocInfo(std::move(MIBs)));
- break;
- }
-
- case bitc::FS_COMBINED_ALLOC_INFO: {
- unsigned I = 0;
- std::vector<MIBInfo> MIBs;
- unsigned NumMIBs = Record[I++];
- unsigned NumVersions = Record[I++];
- unsigned MIBsRead = 0;
- while (MIBsRead++ < NumMIBs) {
- assert(Record.size() - I >= 2);
- AllocationType AllocType = (AllocationType)Record[I++];
- unsigned NumStackEntries = Record[I++];
- assert(Record.size() - I >= NumStackEntries);
- SmallVector<unsigned> StackIdList;
- for (unsigned J = 0; J < NumStackEntries; J++) {
- assert(Record[I] < StackIds.size());
- StackIdList.push_back(
- TheIndex.addOrGetStackIdIndex(StackIds[Record[I++]]));
- }
- MIBs.push_back(MIBInfo(AllocType, std::move(StackIdList)));
- }
- assert(Record.size() - I >= NumVersions);
- SmallVector<uint8_t> Versions;
- for (unsigned J = 0; J < NumVersions; J++)
- Versions.push_back(Record[I++]);
- PendingAllocs.push_back(
- AllocInfo(std::move(Versions), std::move(MIBs)));
- break;
- }
}
}
llvm_unreachable("Exit infinite loop");
@@ -7921,15 +7803,14 @@ BitcodeModule::getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata,
// We don't use ModuleIdentifier here because the client may need to control the
// module path used in the combined summary (e.g. when reading summaries for
// regular LTO modules).
-Error BitcodeModule::readSummary(
- ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, uint64_t ModuleId,
- std::function<bool(GlobalValue::GUID)> IsPrevailing) {
+Error BitcodeModule::readSummary(ModuleSummaryIndex &CombinedIndex,
+ StringRef ModulePath, uint64_t ModuleId) {
BitstreamCursor Stream(Buffer);
if (Error JumpFailed = Stream.JumpToBit(ModuleBit))
return JumpFailed;
ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
- ModulePath, ModuleId, IsPrevailing);
+ ModulePath, ModuleId);
return R.parseModule();
}
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index bc81afbc40646..4bf881a479170 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -211,10 +211,12 @@ class ModuleBitcodeWriterBase : public BitcodeWriterBase {
void writePerModuleGlobalValueSummary();
private:
- void writePerModuleFunctionSummaryRecord(
- SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
- unsigned ValueID, unsigned FSCallsAbbrev, unsigned FSCallsProfileAbbrev,
- unsigned CallsiteAbbrev, unsigned AllocAbbrev, const Function &F);
+ void writePerModuleFunctionSummaryRecord(SmallVector<uint64_t, 64> &NameVals,
+ GlobalValueSummary *Summary,
+ unsigned ValueID,
+ unsigned FSCallsAbbrev,
+ unsigned FSCallsProfileAbbrev,
+ const Function &F);
void writeModuleLevelReferences(const GlobalVariable &V,
SmallVector<uint64_t, 64> &NameVals,
unsigned FSModRefsAbbrev,
@@ -422,11 +424,6 @@ class IndexBitcodeWriter : public BitcodeWriterBase {
/// index and a value id generated by this class to use in references.
std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
- // The sorted stack id indices actually used in the summary entries being
- // written, which will be a subset of those in the full index in the case of
- // distributed indexes.
- std::vector<unsigned> StackIdIndices;
-
/// Tracks the last value id recorded in the GUIDToValueMap.
unsigned GlobalValueId = 0;
@@ -444,28 +441,9 @@ class IndexBitcodeWriter : public BitcodeWriterBase {
// in writing out the call graph edges. Save the mapping from GUID
// to the new global value id to use when writing those edges, which
// are currently saved in the index in terms of GUID.
- forEachSummary([&](GVInfo I, bool IsAliasee) {
+ forEachSummary([&](GVInfo I, bool) {
GUIDToValueIdMap[I.first] = ++GlobalValueId;
- if (IsAliasee)
- return;
- auto *FS = dyn_cast<FunctionSummary>(I.second);
- if (!FS)
- return;
- // Record all stack id indices actually used in the summary entries being
- // written, so that we can compact them in the case of distributed ThinLTO
- // indexes.
- for (auto &CI : FS->callsites())
- for (auto Idx : CI.StackIdIndices)
- StackIdIndices.push_back(Idx);
- for (auto &AI : FS->allocs())
- for (auto &MIB : AI.MIBs)
- for (auto Idx : MIB.StackIdIndices)
- StackIdIndices.push_back(Idx);
});
- llvm::sort(StackIdIndices);
- StackIdIndices.erase(
- std::unique(StackIdIndices.begin(), StackIdIndices.end()),
- StackIdIndices.end());
}
/// The below iterator returns the GUID and associated summary.
@@ -3910,64 +3888,11 @@ static void writeTypeIdCompatibleVtableSummaryRecord(
}
}
-static void writeFunctionHeapProfileRecords(
- BitstreamWriter &Stream, FunctionSummary *FS, unsigned CallsiteAbbrev,
- unsigned AllocAbbrev, bool PerModule,
- std::function<unsigned(const ValueInfo &VI)> GetValueID,
- std::function<unsigned(unsigned)> GetStackIndex) {
- SmallVector<uint64_t> Record;
-
- for (auto &CI : FS->callsites()) {
- Record.clear();
- // Per module callsite clones should always have a single entry of
- // value 0.
- assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
- Record.push_back(GetValueID(CI.Callee));
- if (!PerModule) {
- Record.push_back(CI.StackIdIndices.size());
- Record.push_back(CI.Clones.size());
- }
- for (auto Id : CI.StackIdIndices)
- Record.push_back(GetStackIndex(Id));
- if (!PerModule) {
- for (auto V : CI.Clones)
- Record.push_back(V);
- }
- Stream.EmitRecord(PerModule ? bitc::FS_PERMODULE_CALLSITE_INFO
- : bitc::FS_COMBINED_CALLSITE_INFO,
- Record, CallsiteAbbrev);
- }
-
- for (auto &AI : FS->allocs()) {
- Record.clear();
- // Per module alloc versions should always have a single entry of
- // value 0.
- assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
- if (!PerModule) {
- Record.push_back(AI.MIBs.size());
- Record.push_back(AI.Versions.size());
- }
- for (auto &MIB : AI.MIBs) {
- Record.push_back((uint8_t)MIB.AllocType);
- Record.push_back(MIB.StackIdIndices.size());
- for (auto Id : MIB.StackIdIndices)
- Record.push_back(GetStackIndex(Id));
- }
- if (!PerModule) {
- for (auto V : AI.Versions)
- Record.push_back(V);
- }
- Stream.EmitRecord(PerModule ? bitc::FS_PERMODULE_ALLOC_INFO
- : bitc::FS_COMBINED_ALLOC_INFO,
- Record, AllocAbbrev);
- }
-}
-
// Helper to emit a single function summary record.
void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
unsigned ValueID, unsigned FSCallsAbbrev, unsigned FSCallsProfileAbbrev,
- unsigned CallsiteAbbrev, unsigned AllocAbbrev, const Function &F) {
+ const Function &F) {
NameVals.push_back(ValueID);
FunctionSummary *FS = cast<FunctionSummary>(Summary);
@@ -3977,12 +3902,6 @@ void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
return {VE.getValueID(VI.getValue())};
});
- writeFunctionHeapProfileRecords(
- Stream, FS, CallsiteAbbrev, AllocAbbrev,
- /*PerModule*/ true,
- /*GetValueId*/ [&](const ValueInfo &VI) { return getValueId(VI); },
- /*GetStackIndex*/ [&](unsigned I) { return I; });
-
auto SpecialRefCnts = FS->specialRefCounts();
NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));
NameVals.push_back(FS->instCount());
@@ -4094,16 +4013,6 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
ArrayRef<uint64_t>{GVI.second, GVI.first});
}
- if (!Index->stackIds().empty()) {
- auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
- StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));
- // numids x stackid
- StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
- unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));
- Stream.EmitRecord(bitc::FS_STACK_IDS, Index->stackIds(), StackIdAbbvId);
- }
-
// Abbrev for FS_PERMODULE_PROFILE.
auto Abbv = std::make_shared<BitCodeAbbrev>();
Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_PROFILE));
@@ -4175,21 +4084,6 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
unsigned TypeIdCompatibleVtableAbbrev = Stream.EmitAbbrev(std::move(Abbv));
- Abbv = std::make_shared<BitCodeAbbrev>();
- Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_CALLSITE_INFO));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
- // n x stackidindex
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
- unsigned CallsiteAbbrev = Stream.EmitAbbrev(std::move(Abbv));
-
- Abbv = std::make_shared<BitCodeAbbrev>();
- Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_ALLOC_INFO));
- // n x (alloc type, numstackids, numstackids x stackidindex)
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
- unsigned AllocAbbrev = Stream.EmitAbbrev(std::move(Abbv));
-
SmallVector<uint64_t, 64> NameVals;
// Iterate over the list of functions instead of the Index to
// ensure the ordering is stable.
@@ -4208,8 +4102,7 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
}
auto *Summary = VI.getSummaryList()[0].get();
writePerModuleFunctionSummaryRecord(NameVals, Summary, VE.getValueID(&F),
- FSCallsAbbrev, FSCallsProfileAbbrev,
- CallsiteAbbrev, AllocAbbrev, F);
+ FSCallsAbbrev, FSCallsProfileAbbrev, F);
}
// Capture references from GlobalVariable initializers, which are outside
@@ -4251,7 +4144,7 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
/// Emit the combined summary section into the combined index file.
void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
- Stream.EnterSubblock(bitc::GLOBALVAL_SUMMARY_BLOCK_ID, 4);
+ Stream.EnterSubblock(bitc::GLOBALVAL_SUMMARY_BLOCK_ID, 3);
Stream.EmitRecord(
bitc::FS_VERSION,
ArrayRef<uint64_t>{ModuleSummaryIndex::BitcodeSummaryVersion});
@@ -4264,21 +4157,6 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
ArrayRef<uint64_t>{GVI.second, GVI.first});
}
- if (!StackIdIndices.empty()) {
- auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
- StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));
- // numids x stackid
- StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
- unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));
- // Write the stack ids used by this index, which will be a subset of those in
- // the full index in the case of distributed indexes.
- std::vector<uint64_t> StackIds;
- for (auto &I : StackIdIndices)
- StackIds.push_back(Index.getStackIdAtIndex(I));
- Stream.EmitRecord(bitc::FS_STACK_IDS, StackIds, StackIdAbbvId);
- }
-
// Abbrev for FS_COMBINED.
auto Abbv = std::make_shared<BitCodeAbbrev>();
Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED));
@@ -4332,26 +4210,6 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
unsigned FSAliasAbbrev = Stream.EmitAbbrev(std::move(Abbv));
- Abbv = std::make_shared<BitCodeAbbrev>();
- Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_CALLSITE_INFO));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numstackindices
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numver
- // numstackindices x stackidindex, numver x version
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
- unsigned CallsiteAbbrev = Stream.EmitAbbrev(std::move(Abbv));
-
- Abbv = std::make_shared<BitCodeAbbrev>();
- Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_ALLOC_INFO));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // nummib
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numver
- // nummib x (alloc type, numstackids, numstackids x stackidindex),
- // numver x version
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
- Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
- unsigned AllocAbbrev = Stream.EmitAbbrev(std::move(Abbv));
-
// The aliases are emitted as a post-pass, and will point to the value
// id of the aliasee. Save them in a vector for post-processing.
SmallVector<AliasSummary *, 64> Aliases;
@@ -4428,8 +4286,6 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
}
auto GetValueId = [&](const ValueInfo &VI) -> Optional<unsigned> {
- if (!VI)
- return None;
return getValueId(VI.getGUID());
};
@@ -4437,27 +4293,6 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
writeFunctionTypeMetadataRecords(Stream, FS, GetValueId);
getReferencedTypeIds(FS, ReferencedTypeIds);
- writeFunctionHeapProfileRecords(
- Stream, FS, CallsiteAbbrev, AllocAbbrev,
- /*PerModule*/ false,
- /*GetValueId*/ [&](const ValueInfo &VI) -> unsigned {
- Optional<unsigned> ValueID = GetValueId(VI);
- // This can happen in shared index files for distributed ThinLTO if
- // the callee function summary is not included. Record 0 which we
- // will have to deal with conservatively when doing any kind of
- // validation in the ThinLTO backends.
- if (!ValueID)
- return 0;
- return *ValueID;
- },
- /*GetStackIndex*/ [&](unsigned I) {
- // Get the corresponding index into the list of StackIdIndices
- // actually being written for this combined index (which may be a
- // subset in the case of distributed indexes).
- auto Lower = llvm::lower_bound(StackIdIndices, I);
- return std::distance(StackIdIndices.begin(), Lower);
- });
-
NameVals.push_back(*ValueId);
NameVals.push_back(Index.getModuleId(FS->modulePath()));
NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp
index aa1723ecdffef..22e12b29843e0 100644
--- a/llvm/lib/IR/AsmWriter.cpp
+++ b/llvm/lib/IR/AsmWriter.cpp
@@ -3192,85 +3192,6 @@ void AssemblyWriter::printFunctionSummary(const FunctionSummary *FS) {
if (const auto *TIdInfo = FS->getTypeIdInfo())
printTypeIdInfo(*TIdInfo);
- // The AllocationType identifiers capture the profiled context behavior
- // reaching a specific static allocation site (possibly cloned). Thus
- // "notcoldandcold" implies there are multiple contexts which reach this site,
- // some of which are cold and some of which are not, and that need to
- // disambiguate via cloning or other context identification.
- auto AllocTypeName = [](uint8_t Type) {
- switch (Type) {
- case (uint8_t)AllocationType::None:
- return "none";
- break;
- case (uint8_t)AllocationType::NotCold:
- return "notcold";
- break;
- case (uint8_t)AllocationType::Cold:
- return "cold";
- break;
- case (uint8_t)AllocationType::NotCold | (uint8_t)AllocationType::Cold:
- return "notcoldandcold";
- break;
- default:
- assert(false && "Unexpected alloc type");
- }
- };
-
- if (!FS->allocs().empty()) {
- Out << ", allocs: (";
- FieldSeparator AFS;
- for (auto &AI : FS->allocs()) {
- Out << AFS;
- Out << "(versions: (";
- FieldSeparator VFS;
- for (auto V : AI.Versions) {
- Out << VFS;
- Out << AllocTypeName(V);
- }
- Out << "), memProf: (";
- FieldSeparator MIBFS;
- for (auto &MIB : AI.MIBs) {
- Out << MIBFS;
- Out << "(type: " << AllocTypeName((uint8_t)MIB.AllocType);
- Out << ", stackIds: (";
- FieldSeparator SIDFS;
- for (auto Id : MIB.StackIdIndices) {
- Out << SIDFS;
- Out << TheIndex->getStackIdAtIndex(Id);
- }
- Out << "))";
- }
- Out << "))";
- }
- Out << ")";
- }
-
- if (!FS->callsites().empty()) {
- Out << ", callsites: (";
- FieldSeparator SNFS;
- for (auto &CI : FS->callsites()) {
- Out << SNFS;
- if (CI.Callee)
- Out << "(callee: ^" << Machine.getGUIDSlot(CI.Callee.getGUID());
- else
- Out << "(callee: null";
- Out << ", clones: (";
- FieldSeparator VFS;
- for (auto V : CI.Clones) {
- Out << VFS;
- Out << V;
- }
- Out << "), stackIds: (";
- FieldSeparator SIDFS;
- for (auto Id : CI.StackIdIndices) {
- Out << SIDFS;
- Out << TheIndex->getStackIdAtIndex(Id);
- }
- Out << "))";
- }
- Out << ")";
- }
-
auto PrintRange = [&](const ConstantRange &Range) {
Out << "[" << Range.getSignedMin() << ", " << Range.getSignedMax() << "]";
};
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp
index 9bfbabc17a08e..dc28b681a1515 100644
--- a/llvm/lib/LTO/LTO.cpp
+++ b/llvm/lib/LTO/LTO.cpp
@@ -911,25 +911,9 @@ Error LTO::linkRegularLTO(RegularLTOState::AddedModule Mod,
Error LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
const SymbolResolution *&ResI,
const SymbolResolution *ResE) {
- const SymbolResolution *ResITmp = ResI;
- for (const InputFile::Symbol &Sym : Syms) {
- assert(ResITmp != ResE);
- SymbolResolution Res = *ResITmp++;
-
- if (!Sym.getIRName().empty()) {
- auto GUID = GlobalValue::getGUID(GlobalValue::getGlobalIdentifier(
- Sym.getIRName(), GlobalValue::ExternalLinkage, ""));
- if (Res.Prevailing)
- ThinLTO.PrevailingModuleForGUID[GUID] = BM.getModuleIdentifier();
- }
- }
-
if (Error Err =
BM.readSummary(ThinLTO.CombinedIndex, BM.getModuleIdentifier(),
- ThinLTO.ModuleMap.size(), [&](GlobalValue::GUID GUID) {
- return ThinLTO.PrevailingModuleForGUID[GUID] ==
- BM.getModuleIdentifier();
- }))
+ ThinLTO.ModuleMap.size()))
return Err;
for (const InputFile::Symbol &Sym : Syms) {
@@ -940,8 +924,7 @@ Error LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
auto GUID = GlobalValue::getGUID(GlobalValue::getGlobalIdentifier(
Sym.getIRName(), GlobalValue::ExternalLinkage, ""));
if (Res.Prevailing) {
- assert(ThinLTO.PrevailingModuleForGUID[GUID] ==
- BM.getModuleIdentifier());
+ ThinLTO.PrevailingModuleForGUID[GUID] = BM.getModuleIdentifier();
// For linker redefined symbols (via --wrap or --defsym) we want to
// switch the linkage to `weak` to prevent IPOs from happening.
@@ -1471,7 +1454,6 @@ ThinBackend lto::createWriteIndexesThinBackend(
Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
- ThinLTO.CombinedIndex.releaseTemporaryMemory();
timeTraceProfilerBegin("ThinLink", StringRef(""));
auto TimeTraceScopeExit = llvm::make_scope_exit([]() {
if (llvm::timeTraceProfilerEnabled())
diff --git a/llvm/test/Assembler/thinlto-memprof-summary.ll b/llvm/test/Assembler/thinlto-memprof-summary.ll
deleted file mode 100644
index 92e085e5473be..0000000000000
--- a/llvm/test/Assembler/thinlto-memprof-summary.ll
+++ /dev/null
@@ -1,24 +0,0 @@
-;; Test memprof summary parsing (tests all types/fields in various combinations).
-; RUN: llvm-as %s -o - | llvm-dis -o - | FileCheck %s
-
-; ModuleID = 'thinlto-memprof-summary.thinlto.bc'
-
-^0 = module: (path: "thinlto-memprof-summary.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
-;; Function with single alloc, multiple memprof MIBs, no versioning
-^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (8632435727821051414)), (type: cold, stackIds: (15025054523792398438, 12345678)), (type: notcoldandcold, stackIds: (23456789))))))))
-;; Function with callsite stack ids calling above function, no versioning
-^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (8632435727821051414)), (callee: ^1, clones: (0), stackIds: (15025054523792398438, 12345678)), (callee: ^1, clones: (0), stackIds: (23456789))))))
-;; Function with multiple allocs, multiple memprof MIBs, multiple versions
-^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: (3456789)), (type: cold, stackIds: (456789)))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: (3456789)), (type: notcold, stackIds: (456789))))))))
-;; Function with callsite stack ids calling above function, multiple versions
-^4 = gv: (guid: 27, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^3)), callsites: ((callee: ^3, clones: (0, 1), stackIds: (3456789)), (callee: ^3, clones: (1, 1), stackIds: (456789))))))
-;; Function with null callsite stack id (can happen in distributed indexes if callsite not imported)
-^5 = gv: (guid: 28, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), callsites: ((callee: null, clones: (0), stackIds: (8632435727821051414))))))
-
-; Make sure we get back from llvm-dis what we put in via llvm-as.
-; CHECK: ^0 = module: (path: "thinlto-memprof-summary.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
-; CHECK: ^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (8632435727821051414)), (type: cold, stackIds: (15025054523792398438, 12345678)), (type: notcoldandcold, stackIds: (23456789))))))))
-; CHECK: ^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (8632435727821051414)), (callee: ^1, clones: (0), stackIds: (15025054523792398438, 12345678)), (callee: ^1, clones: (0), stackIds: (23456789))))))
-; CHECK: ^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: (3456789)), (type: cold, stackIds: (456789)))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: (3456789)), (type: notcold, stackIds: (456789))))))))
-; CHECK: ^4 = gv: (guid: 27, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^3)), callsites: ((callee: ^3, clones: (0, 1), stackIds: (3456789)), (callee: ^3, clones: (1, 1), stackIds: (456789))))))
-; CHECK: ^5 = gv: (guid: 28, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), callsites: ((callee: null, clones: (0), stackIds: (8632435727821051414))))))
diff --git a/llvm/test/ThinLTO/X86/memprof-summary.ll b/llvm/test/ThinLTO/X86/memprof-summary.ll
deleted file mode 100644
index ca3b668484b92..0000000000000
--- a/llvm/test/ThinLTO/X86/memprof-summary.ll
+++ /dev/null
@@ -1,185 +0,0 @@
-;; Check memprof summaries (per module, combined index, and distributed indexes)
-
-; RUN: split-file %s %t
-; RUN: opt -module-summary %t/a.ll -o %ta.bc
-; RUN: opt -module-summary %t/b.ll -o %tb.bc
-
-; RUN: llvm-dis -o - %ta.bc | FileCheck %s --check-prefix=PRELINKDISA
-; PRELINKDISA: gv: (name: "main", {{.*}} callsites: ((callee: ^2, clones: (0), stackIds: (8632435727821051414)), (callee: ^2, clones: (0), stackIds: (15025054523792398438)))))) ; guid = 15822663052811949562
-
-; RUN: llvm-dis -o - %tb.bc | FileCheck %s --check-prefix=PRELINKDISB
-; PRELINKDISB: gv: (name: "_Z3foov", {{.*}} callsites: ((callee: ^2, clones: (0), stackIds: (2732490490862098848)))))) ; guid = 9191153033785521275
-; PRELINKDISB: gv: (name: "_Z3bazv", {{.*}} callsites: ((callee: ^3, clones: (0), stackIds: (12481870273128938184)))))) ; guid = 15176620447596392000
-; PRELINKDISB: gv: (name: "_Z3barv", {{.*}} allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (12481870273128938184, 2732490490862098848, 8632435727821051414)), (type: cold, stackIds: (12481870273128938184, 2732490490862098848, 15025054523792398438)))))))) ; guid = 17377440600225628772
-
-; RUN: llvm-bcanalyzer -dump %ta.bc | FileCheck %s --check-prefix=PRELINKBCANA
-; PRELINKBCANA: <STACK_IDS abbrevid=4 op0=8632435727821051414 op1=-3421689549917153178/>
-
-; RUN: llvm-bcanalyzer -dump %tb.bc | FileCheck %s --check-prefix=PRELINKBCANB
-; PRELINKBCANB: <STACK_IDS abbrevid=4 op0=-5964873800580613432 op1=2732490490862098848 op2=8632435727821051414 op3=-3421689549917153178/>
-
-; RUN: llvm-lto2 run %ta.bc %tb.bc -o %t -save-temps \
-; RUN: -thinlto-distributed-indexes \
-; RUN: -r=%ta.bc,main,plx \
-; RUN: -r=%ta.bc,_Z3foov, \
-; RUN: -r=%ta.bc,free, \
-; RUN: -r=%ta.bc,sleep, \
-; RUN: -r=%tb.bc,_Z3foov,pl \
-; RUN: -r=%tb.bc,_Znam, \
-; RUN: -r=%tb.bc,_Z3barv,pl \
-; RUN: -r=%tb.bc,_Z3bazv,pl
-
-; RUN: llvm-dis -o - %t.index.bc | FileCheck %s --check-prefix=COMBINEDDIS
-; COMBINEDDIS: gv: (guid: 9191153033785521275, {{.*}} callsites: ((callee: ^3, clones: (0), stackIds: (2732490490862098848))))))
-; COMBINEDDIS: gv: (guid: 15176620447596392000, {{.*}} callsites: ((callee: ^5, clones: (0), stackIds: (12481870273128938184))))))
-; COMBINEDDIS: gv: (guid: 15822663052811949562, {{.*}} callsites: ((callee: ^2, clones: (0), stackIds: (8632435727821051414)), (callee: ^2, clones: (0), stackIds: (15025054523792398438))))))
-; COMBINEDDIS: gv: (guid: 17377440600225628772, {{.*}} allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (12481870273128938184, 2732490490862098848, 8632435727821051414)), (type: cold, stackIds: (12481870273128938184, 2732490490862098848, 15025054523792398438))))))))
-
-; RUN: llvm-bcanalyzer -dump %t.index.bc | FileCheck %s --check-prefix=COMBINEDBCAN
-; COMBINEDBCAN: <STACK_IDS abbrevid=4 op0=8632435727821051414 op1=-3421689549917153178 op2=-5964873800580613432 op3=2732490490862098848/>
-
-; RUN: llvm-dis -o - %ta.bc.thinlto.bc | FileCheck %s --check-prefix=DISTRIBUTEDDISA
-; DISTRIBUTEDDISA: gv: (guid: 9191153033785521275, {{.*}} callsites: ((callee: null, clones: (0), stackIds: (2732490490862098848))))))
-; DISTRIBUTEDDISA: gv: (guid: 15822663052811949562, {{.*}} callsites: ((callee: ^2, clones: (0), stackIds: (8632435727821051414)), (callee: ^2, clones: (0), stackIds: (15025054523792398438))))))
-
-; RUN: llvm-dis -o - %tb.bc.thinlto.bc | FileCheck %s --check-prefix=DISTRIBUTEDDISB
-; DISTRIBUTEDDISB: gv: (guid: 9191153033785521275, {{.*}} callsites: ((callee: ^2, clones: (0), stackIds: (2732490490862098848))))))
-; DISTRIBUTEDDISB: gv: (guid: 15176620447596392000, {{.*}} callsites: ((callee: ^3, clones: (0), stackIds: (12481870273128938184))))))
-; DISTRIBUTEDDISB: gv: (guid: 17377440600225628772, {{.*}} allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (12481870273128938184, 2732490490862098848, 8632435727821051414)), (type: cold, stackIds: (12481870273128938184, 2732490490862098848, 15025054523792398438))))))))
-
-; RUN: llvm-bcanalyzer -dump %ta.bc.thinlto.bc | FileCheck %s --check-prefix=DISTRIBUTEDBCANA
-; DISTRIBUTEDBCANA: <STACK_IDS abbrevid=4 op0=8632435727821051414 op1=-3421689549917153178 op2=2732490490862098848/>
-
-; RUN: llvm-bcanalyzer -dump %tb.bc.thinlto.bc | FileCheck %s --check-prefix=DISTRIBUTEDBCANB
-; DISTRIBUTEDBCANB: <STACK_IDS abbrevid=4 op0=8632435727821051414 op1=-3421689549917153178 op2=-5964873800580613432 op3=2732490490862098848/>
-
-;--- a.ll
-; ModuleID = 'a.cc'
-source_filename = "a.cc"
-target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; Function Attrs: mustprogress norecurse uwtable
-define dso_local noundef i32 @main(i32 noundef %argc, ptr nocapture noundef readnone %argv) local_unnamed_addr #0 !dbg !39 {
-entry:
- %call = call noundef ptr @_Z3foov(), !dbg !42, !callsite !43
- %call1 = call noundef ptr @_Z3foov(), !dbg !44, !callsite !45
- call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(10) %call, i8 0, i64 10, i1 false), !dbg !46
- call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(10) %call1, i8 0, i64 10, i1 false), !dbg !47
- call void @free(ptr noundef %call) #4, !dbg !48
- %call2 = call i32 @sleep(i32 noundef 10), !dbg !49
- call void @free(ptr noundef %call1) #4, !dbg !50
- ret i32 0, !dbg !51
-}
-
-declare !dbg !52 noundef ptr @_Z3foov() local_unnamed_addr #1
-
-; Function Attrs: argmemonly mustprogress nocallback nofree nounwind willreturn writeonly
-declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2
-
-; Function Attrs: inaccessiblemem_or_argmemonly mustprogress nounwind willreturn allockind("free")
-declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #3
-
-declare !dbg !53 i32 @sleep(i32 noundef) local_unnamed_addr #1
-
-attributes #0 = { mustprogress norecurse uwtable "disable-tail-calls"="true" "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #1 = { "disable-tail-calls"="true" "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #2 = { argmemonly mustprogress nocallback nofree nounwind willreturn writeonly }
-attributes #3 = { inaccessiblemem_or_argmemonly mustprogress nounwind willreturn allockind("free") "alloc-family"="malloc" "disable-tail-calls"="true" "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #4 = { nounwind }
-
-!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!2, !3, !4, !5, !6, !7, !8}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 16.0.0 (git at github.com:llvm/llvm-project.git ffecb643ee2c49e55e0689339b6d5921b5e6ff8b)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, debugInfoForProfiling: true, nameTableKind: None)
-!1 = !DIFile(filename: "a.cc", directory: ".", checksumkind: CSK_MD5, checksum: "ebabd56909271a1d4a7cac81c10624d5")
-!2 = !{i32 7, !"Dwarf Version", i32 5}
-!3 = !{i32 2, !"Debug Info Version", i32 3}
-!4 = !{i32 1, !"wchar_size", i32 4}
-!5 = !{i32 8, !"PIC Level", i32 2}
-!6 = !{i32 7, !"PIE Level", i32 2}
-!7 = !{i32 7, !"uwtable", i32 2}
-!8 = !{i32 7, !"frame-pointer", i32 2}
-!39 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 5, type: !40, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !41)
-!40 = !DISubroutineType(types: !41)
-!41 = !{}
-!42 = !DILocation(line: 6, column: 13, scope: !39)
-!43 = !{i64 8632435727821051414}
-!44 = !DILocation(line: 7, column: 13, scope: !39)
-!45 = !{i64 -3421689549917153178}
-!46 = !DILocation(line: 8, column: 3, scope: !39)
-!47 = !DILocation(line: 9, column: 3, scope: !39)
-!48 = !DILocation(line: 10, column: 3, scope: !39)
-!49 = !DILocation(line: 11, column: 3, scope: !39)
-!50 = !DILocation(line: 12, column: 3, scope: !39)
-!51 = !DILocation(line: 13, column: 3, scope: !39)
-!52 = !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 4, type: !40, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !41)
-!53 = !DISubprogram(name: "sleep", scope: !54, file: !54, line: 453, type: !40, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !41)
-!54 = !DIFile(filename: "include/unistd.h", directory: "/usr", checksumkind: CSK_MD5, checksum: "ee8f41a17f563f029d0e930ad871815a")
-
-;--- b.ll
-; ModuleID = 'b.cc'
-source_filename = "b.cc"
-target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; Function Attrs: mustprogress noinline uwtable
-define dso_local noalias noundef nonnull ptr @_Z3barv() local_unnamed_addr #0 !dbg !39 {
-entry:
- %call = call noalias noundef nonnull dereferenceable(10) ptr @_Znam(i64 noundef 10) #2, !dbg !42, !memprof !43, !callsite !48
- ret ptr %call, !dbg !49
-}
-
-; Function Attrs: nobuiltin allocsize(0)
-declare noundef nonnull ptr @_Znam(i64 noundef) local_unnamed_addr #1
-
-; Function Attrs: mustprogress noinline uwtable
-define dso_local noalias noundef nonnull ptr @_Z3bazv() local_unnamed_addr #0 !dbg !50 {
-entry:
- %call = call noundef ptr @_Z3barv(), !dbg !51, !callsite !52
- ret ptr %call, !dbg !53
-}
-
-; Function Attrs: mustprogress uwtable
-define dso_local noalias noundef nonnull ptr @_Z3foov() local_unnamed_addr #3 !dbg !54 {
-entry:
- %call = call noundef ptr @_Z3bazv(), !dbg !55, !callsite !56
- ret ptr %call, !dbg !57
-}
-
-attributes #0 = { mustprogress noinline uwtable "disable-tail-calls"="true" "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #1 = { nobuiltin allocsize(0) "disable-tail-calls"="true" "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-attributes #2 = { builtin allocsize(0) }
-attributes #3 = { mustprogress uwtable "disable-tail-calls"="true" "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
-
-!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!2, !3, !4, !5, !6, !7, !8}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 16.0.0 (git at github.com:llvm/llvm-project.git ffecb643ee2c49e55e0689339b6d5921b5e6ff8b)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, debugInfoForProfiling: true, nameTableKind: None)
-!1 = !DIFile(filename: "b.cc", directory: ".", checksumkind: CSK_MD5, checksum: "335f81d275af57725cfc9ffc7be49bc2")
-!2 = !{i32 7, !"Dwarf Version", i32 5}
-!3 = !{i32 2, !"Debug Info Version", i32 3}
-!4 = !{i32 1, !"wchar_size", i32 4}
-!5 = !{i32 8, !"PIC Level", i32 2}
-!6 = !{i32 7, !"PIE Level", i32 2}
-!7 = !{i32 7, !"uwtable", i32 2}
-!8 = !{i32 7, !"frame-pointer", i32 2}
-!39 = distinct !DISubprogram(name: "bar", linkageName: "_Z3barv", scope: !1, file: !1, line: 1, type: !40, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !41)
-!40 = !DISubroutineType(types: !41)
-!41 = !{}
-!42 = !DILocation(line: 2, column: 10, scope: !39)
-!43 = !{!44, !46}
-!44 = !{!45, !"notcold"}
-!45 = !{i64 9086428284934609951, i64 -5964873800580613432, i64 2732490490862098848, i64 8632435727821051414}
-!46 = !{!47, !"cold"}
-!47 = !{i64 9086428284934609951, i64 -5964873800580613432, i64 2732490490862098848, i64 -3421689549917153178}
-!48 = !{i64 9086428284934609951}
-!49 = !DILocation(line: 2, column: 3, scope: !39)
-!50 = distinct !DISubprogram(name: "baz", linkageName: "_Z3bazv", scope: !1, file: !1, line: 5, type: !40, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !41)
-!51 = !DILocation(line: 6, column: 10, scope: !50)
-!52 = !{i64 -5964873800580613432}
-!53 = !DILocation(line: 6, column: 3, scope: !50)
-!54 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 9, type: !40, scopeLine: 9, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !41)
-!55 = !DILocation(line: 10, column: 10, scope: !54)
-!56 = !{i64 2732490490862098848}
-!57 = !DILocation(line: 10, column: 3, scope: !54)
diff --git a/llvm/unittests/Analysis/MemoryProfileInfoTest.cpp b/llvm/unittests/Analysis/MemoryProfileInfoTest.cpp
index 64004ceac8181..a3549aca81e51 100644
--- a/llvm/unittests/Analysis/MemoryProfileInfoTest.cpp
+++ b/llvm/unittests/Analysis/MemoryProfileInfoTest.cpp
@@ -11,7 +11,6 @@
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
-#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/SourceMgr.h"
#include "gtest/gtest.h"
@@ -35,15 +34,6 @@ class MemoryProfileInfoTest : public testing::Test {
return Mod;
}
- std::unique_ptr<ModuleSummaryIndex> makeLLVMIndex(const char *Summary) {
- SMDiagnostic Err;
- std::unique_ptr<ModuleSummaryIndex> Index =
- parseSummaryIndexAssemblyString(Summary, Err);
- if (!Index)
- Err.print("MemoryProfileInfoTest", errs());
- return Index;
- }
-
// This looks for a call that has the given value name, which
// is the name of the value being assigned the call return value.
CallBase *findCall(Function &F, const char *Name = nullptr) {
@@ -369,90 +359,4 @@ declare dso_local noalias noundef i8* @malloc(i64 noundef)
}
}
-TEST_F(MemoryProfileInfoTest, CallStackTestIR) {
- LLVMContext C;
- std::unique_ptr<Module> M = makeLLVMModule(C,
- R"IR(
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-pc-linux-gnu"
-define ptr @test() {
-entry:
- %call = call noalias noundef nonnull dereferenceable(10) ptr @_Znam(i64 noundef 10), !memprof !1, !callsite !6
- ret ptr %call
-}
-declare noundef nonnull ptr @_Znam(i64 noundef)
-!1 = !{!2, !4}
-!2 = !{!3, !"notcold"}
-!3 = !{i64 1, i64 2, i64 3, i64 4}
-!4 = !{!5, !"cold"}
-!5 = !{i64 1, i64 2, i64 3, i64 5}
-!6 = !{i64 1}
-)IR");
-
- Function *Func = M->getFunction("test");
- CallBase *Call = findCall(*Func, "call");
-
- CallStack<MDNode, MDNode::op_iterator> InstCallsite(
- Call->getMetadata(LLVMContext::MD_callsite));
-
- MDNode *MemProfMD = Call->getMetadata(LLVMContext::MD_memprof);
- bool First = true;
- for (auto &MIBOp : MemProfMD->operands()) {
- auto *MIBMD = cast<const MDNode>(MIBOp);
- MDNode *StackNode = getMIBStackNode(MIBMD);
- CallStack<MDNode, MDNode::op_iterator> StackContext(StackNode);
- std::vector<uint64_t> StackIds;
- for (auto ContextIter = StackContext.beginAfterSharedPrefix(InstCallsite);
- ContextIter != StackContext.end(); ++ContextIter)
- StackIds.push_back(*ContextIter);
- if (First)
- EXPECT_EQ(makeArrayRef(StackIds), makeArrayRef({2UL, 3UL, 4UL}));
- else
- EXPECT_EQ(makeArrayRef(StackIds), makeArrayRef({2UL, 3UL, 5UL}));
- First = false;
- }
-}
-
-TEST_F(MemoryProfileInfoTest, CallStackTestSummary) {
- std::unique_ptr<ModuleSummaryIndex> Index = makeLLVMIndex(R"Summary(
-^0 = module: (path: "test.o", hash: (0, 0, 0, 0, 0))
-^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (1, 2, 3, 4)), (type: cold, stackIds: (1, 2, 3, 5))))))))
-^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (3, 4)), (callee: ^1, clones: (0), stackIds: (3, 5))))))
-)Summary");
-
- ASSERT_NE(Index, nullptr);
- auto *CallsiteSummary =
- cast<FunctionSummary>(Index->getGlobalValueSummary(/*guid=*/25));
- bool First = true;
- for (auto &CI : CallsiteSummary->callsites()) {
- CallStack<CallsiteInfo, SmallVector<unsigned>::const_iterator> InstCallsite(
- &CI);
- std::vector<uint64_t> StackIds;
- for (auto StackIdIndex : InstCallsite)
- StackIds.push_back(Index->getStackIdAtIndex(StackIdIndex));
- if (First)
- EXPECT_EQ(makeArrayRef(StackIds), makeArrayRef({3UL, 4UL}));
- else
- EXPECT_EQ(makeArrayRef(StackIds), makeArrayRef({3UL, 5UL}));
- First = false;
- }
-
- auto *AllocSummary =
- cast<FunctionSummary>(Index->getGlobalValueSummary(/*guid=*/23));
- for (auto &AI : AllocSummary->allocs()) {
- bool First = true;
- for (auto &MIB : AI.MIBs) {
- CallStack<MIBInfo, SmallVector<unsigned>::const_iterator> StackContext(
- &MIB);
- std::vector<uint64_t> StackIds;
- for (auto StackIdIndex : StackContext)
- StackIds.push_back(Index->getStackIdAtIndex(StackIdIndex));
- if (First)
- EXPECT_EQ(makeArrayRef(StackIds), makeArrayRef({1UL, 2UL, 3UL, 4UL}));
- else
- EXPECT_EQ(makeArrayRef(StackIds), makeArrayRef({1UL, 2UL, 3UL, 5UL}));
- First = false;
- }
- }
-}
} // end anonymous namespace
More information about the llvm-commits
mailing list