[llvm] 8cbbd7e - [llvm-profgen] Ignore broken LBR samples
Hongtao Yu via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 14 12:11:24 PDT 2021
Author: Hongtao Yu
Date: 2021-09-14T12:11:17-07:00
New Revision: 8cbbd7e0b2aa21ce7e416cfb63d9965518948c35
URL: https://github.com/llvm/llvm-project/commit/8cbbd7e0b2aa21ce7e416cfb63d9965518948c35
DIFF: https://github.com/llvm/llvm-project/commit/8cbbd7e0b2aa21ce7e416cfb63d9965518948c35.diff
LOG: [llvm-profgen] Ignore broken LBR samples
Perf script can sometimes give disordered LBR samples like below.
```
b022500
32de0044
3386e1d1
7f118e05720c
7f118df2d81f
0x2a0b9622/0x2a0b9610/P/-/-/1 0x2a0b79ff/0x2a0b9618/P/-/-/2 0x2a0b7a4a/0x2a0b79e8/P/-/-/1 0x2a0b7a33/0x2a0b7a46/P/-/-/1 0x2a0b7a42/0x2a0b7a23/P/-/-/1 0x2a0b7a21/0x2a0b7a37/P/-/-/2 0x2a0b79e6/0x2a0b7a07/P/-/-/1 0x2a0b79d4/0x2a0b79dc/P/-/-/2 0x2a0b7a03/0x2a0b79aa/P/-/-/1 0x2a0b79a8/0x2a0b7a00/P/-/-/234 0x2a0b9613/0x2a0b7930/P/-/-/1 0x2a0b9622/0x2a0b9610/P/-/-/1 0x2a0b79ff/0x2a0b9618/P/-/-/2 0x2a0b7a4a/0x2aWarning:
Processed 10263226 events and lost 1 chunks!
```
Note that the last LBR record `0x2a0b7a4a/0x2aWarning:` . Currently llvm-profgen does not detect that and as a result an uninitialized branch target value will be used. The uninitialized value can cause creepy instruction ranges created which which in turn will result in a completely wrong profile. An example is like
```
.... @ _ZN5folly13loadUnalignedIsEET_PKv]:18446744073709551615:18446744073709551615
1: 18446744073709551615
!CFGChecksum: 4294967295
!Attributes: 0
```
Reviewed By: wenlei, wlei
Differential Revision: https://reviews.llvm.org/D109637
Added:
Modified:
llvm/tools/llvm-profgen/PerfReader.cpp
llvm/tools/llvm-profgen/PerfReader.h
llvm/tools/llvm-profgen/ProfileGenerator.cpp
Removed:
################################################################################
diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp
index 77baa9bc5a43e..259b23f33d47b 100644
--- a/llvm/tools/llvm-profgen/PerfReader.cpp
+++ b/llvm/tools/llvm-profgen/PerfReader.cpp
@@ -422,8 +422,15 @@ bool PerfReaderBase::extractLBRStack(TraceStream &TraceIt,
Token.split(Addresses, "/");
uint64_t Src;
uint64_t Dst;
- Addresses[0].substr(2).getAsInteger(16, Src);
- Addresses[1].substr(2).getAsInteger(16, Dst);
+
+ // Stop at broken LBR records.
+ if (Addresses[0].substr(2).getAsInteger(16, Src) ||
+ Addresses[1].substr(2).getAsInteger(16, Dst)) {
+ WithColor::warning() << "Invalid address in LBR record at line "
+ << TraceIt.getLineNumber() << ": "
+ << TraceIt.getCurrentLine() << "\n";
+ break;
+ }
bool SrcIsInternal = Binary->addressIsCode(Src);
bool DstIsInternal = Binary->addressIsCode(Dst);
@@ -635,11 +642,8 @@ void LBRPerfReader::computeCounterFromLBR(const PerfSample *Sample,
// If this not the first LBR, update the range count between TO of current
// LBR and FROM of next LBR.
uint64_t StartOffset = TargetOffset;
- if (EndOffeset != 0) {
- assert(StartOffset <= EndOffeset &&
- "Bogus range should be filtered ealier!");
+ if (EndOffeset != 0)
Counter.recordRangeCount(StartOffset, EndOffeset, Repeat);
- }
EndOffeset = SourceOffset;
}
}
diff --git a/llvm/tools/llvm-profgen/PerfReader.h b/llvm/tools/llvm-profgen/PerfReader.h
index 0595c7dc5973a..2babcd7246a8b 100644
--- a/llvm/tools/llvm-profgen/PerfReader.h
+++ b/llvm/tools/llvm-profgen/PerfReader.h
@@ -373,6 +373,7 @@ struct SampleCounter {
BranchSample BranchCounter;
void recordRangeCount(uint64_t Start, uint64_t End, uint64_t Repeat) {
+ assert(Start <= End && "Invalid instruction range");
RangeCounter[{Start, End}] += Repeat;
}
void recordBranchCount(uint64_t Source, uint64_t Target, uint64_t Repeat) {
diff --git a/llvm/tools/llvm-profgen/ProfileGenerator.cpp b/llvm/tools/llvm-profgen/ProfileGenerator.cpp
index 5b9984cc8986c..5251e3f187c70 100644
--- a/llvm/tools/llvm-profgen/ProfileGenerator.cpp
+++ b/llvm/tools/llvm-profgen/ProfileGenerator.cpp
@@ -183,6 +183,7 @@ void ProfileGenerator::findDisjointRanges(RangeSample &DisjointRanges,
for (auto Item : Ranges) {
uint64_t Begin = Item.first.first;
uint64_t End = Item.first.second;
+ assert(Begin <= End && "Invalid instruction range");
uint64_t Count = Item.second;
if (Boundaries.find(Begin) == Boundaries.end())
Boundaries[Begin] = BoundaryPoint();
@@ -194,7 +195,7 @@ void ProfileGenerator::findDisjointRanges(RangeSample &DisjointRanges,
}
uint64_t BeginAddress = UINT64_MAX;
- int Count = 0;
+ uint64_t Count = 0;
for (auto Item : Boundaries) {
uint64_t Address = Item.first;
BoundaryPoint &Point = Item.second;
@@ -208,6 +209,7 @@ void ProfileGenerator::findDisjointRanges(RangeSample &DisjointRanges,
assert((BeginAddress != UINT64_MAX) &&
"First boundary point cannot be 'end' point");
DisjointRanges[{BeginAddress, Address}] = Count;
+ assert(Count >= Point.EndCount && "Mismatched live ranges");
Count -= Point.EndCount;
BeginAddress = Address + 1;
}
More information about the llvm-commits
mailing list