[llvm] ca72104 - [IPO][SampleContextTracker] Use SmallVector to track context profiles to prevent non-determinism.
Huihui Zhang via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 29 16:37:22 PDT 2021
Author: Huihui Zhang
Date: 2021-03-29T16:37:10-07:00
New Revision: ca721042f1c9876eb350da22d1fda44626d2783b
URL: https://github.com/llvm/llvm-project/commit/ca721042f1c9876eb350da22d1fda44626d2783b
DIFF: https://github.com/llvm/llvm-project/commit/ca721042f1c9876eb350da22d1fda44626d2783b.diff
LOG: [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
Added:
Modified:
llvm/include/llvm/Transforms/IPO/SampleContextTracker.h
llvm/lib/Transforms/IPO/SampleContextTracker.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/SampleContextTracker.h b/llvm/include/llvm/Transforms/IPO/SampleContextTracker.h
index 685a060fe463..8566328526ac 100644
--- a/llvm/include/llvm/Transforms/IPO/SampleContextTracker.h
+++ b/llvm/include/llvm/Transforms/IPO/SampleContextTracker.h
@@ -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 @@ class ContextTrieNode {
// 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 @@ class SampleContextTracker {
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;
diff --git a/llvm/lib/Transforms/IPO/SampleContextTracker.cpp b/llvm/lib/Transforms/IPO/SampleContextTracker.cpp
index 863e8f3833fb..36a96e510c77 100644
--- a/llvm/lib/Transforms/IPO/SampleContextTracker.cpp
+++ b/llvm/lib/Transforms/IPO/SampleContextTracker.cpp
@@ -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
diff erent 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)
More information about the llvm-commits
mailing list