mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[IPO][SampleContextTracker] Use SmallVector to track context profiles to prevent non-determinism.
Use SmallVector instead of SmallSet to track the context profiles mapped. Doing this can help avoid non-determinism caused by iterating over unordered containers. This bug was found with reverse iteration turning on, --extra-llvm-cmake-variables="-DLLVM_REVERSE_ITERATION=ON". Failing LLVM test profile-context-tracker-debug.ll . Reviewed By: MaskRay, wenlei Differential Revision: https://reviews.llvm.org/D99547
This commit is contained in:
parent
53b491d475
commit
10db8e816f
@ -15,7 +15,7 @@
|
||||
#ifndef LLVM_TRANSFORMS_IPO_SAMPLECONTEXTTRACKER_H
|
||||
#define LLVM_TRANSFORMS_IPO_SAMPLECONTEXTTRACKER_H
|
||||
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Analysis/CallGraph.h"
|
||||
@ -91,7 +91,7 @@ private:
|
||||
// calling context and the context is identified by path from root to the node.
|
||||
class SampleContextTracker {
|
||||
public:
|
||||
using ContextSamplesTy = SmallSet<FunctionSamples *, 16>;
|
||||
using ContextSamplesTy = SmallVector<FunctionSamples *, 16>;
|
||||
|
||||
SampleContextTracker(StringMap<FunctionSamples> &Profiles);
|
||||
// Query context profile for a specific callee with given name at a given
|
||||
@ -144,7 +144,7 @@ private:
|
||||
StringRef ContextStrToRemove);
|
||||
|
||||
// Map from function name to context profiles (excluding base profile)
|
||||
StringMap<ContextSamplesTy> FuncToCtxtProfileSet;
|
||||
StringMap<ContextSamplesTy> FuncToCtxtProfiles;
|
||||
|
||||
// Root node for context trie tree
|
||||
ContextTrieNode RootContext;
|
||||
|
@ -183,7 +183,7 @@ SampleContextTracker::SampleContextTracker(
|
||||
SampleContext Context(FuncSample.first(), RawContext);
|
||||
LLVM_DEBUG(dbgs() << "Tracking Context for function: " << Context << "\n");
|
||||
if (!Context.isBaseContext())
|
||||
FuncToCtxtProfileSet[Context.getNameWithoutContext()].insert(FSamples);
|
||||
FuncToCtxtProfiles[Context.getNameWithoutContext()].push_back(FSamples);
|
||||
ContextTrieNode *NewNode = getOrCreateContextPath(Context, true);
|
||||
assert(!NewNode->getFunctionSamples() &&
|
||||
"New node can't have sample profile");
|
||||
@ -268,12 +268,12 @@ SampleContextTracker::getContextSamplesFor(const SampleContext &Context) {
|
||||
SampleContextTracker::ContextSamplesTy &
|
||||
SampleContextTracker::getAllContextSamplesFor(const Function &Func) {
|
||||
StringRef CanonName = FunctionSamples::getCanonicalFnName(Func);
|
||||
return FuncToCtxtProfileSet[CanonName];
|
||||
return FuncToCtxtProfiles[CanonName];
|
||||
}
|
||||
|
||||
SampleContextTracker::ContextSamplesTy &
|
||||
SampleContextTracker::getAllContextSamplesFor(StringRef Name) {
|
||||
return FuncToCtxtProfileSet[Name];
|
||||
return FuncToCtxtProfiles[Name];
|
||||
}
|
||||
|
||||
FunctionSamples *SampleContextTracker::getBaseSamplesFor(const Function &Func,
|
||||
@ -297,7 +297,7 @@ FunctionSamples *SampleContextTracker::getBaseSamplesFor(StringRef Name,
|
||||
// We have profile for function under different contexts,
|
||||
// create synthetic base profile and merge context profiles
|
||||
// into base profile.
|
||||
for (auto *CSamples : FuncToCtxtProfileSet[Name]) {
|
||||
for (auto *CSamples : FuncToCtxtProfiles[Name]) {
|
||||
SampleContext &Context = CSamples->getContext();
|
||||
ContextTrieNode *FromNode = getContextFor(Context);
|
||||
if (FromNode == Node)
|
||||
|
Loading…
Reference in New Issue
Block a user