[XRay][tools] Remove some assertions in llvm-xray graph

Summary:
Assertions assuming that function calls may not have zero durations do
not seem to hold in the wild. There are valid cases where the conversion
of the tsc counters end up becoming zero-length durations. These
assertions don't really hold and the algorithms don't need those to be
true for them to work.

Reviewers: dblaikie, echristo

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D31519

llvm-svn: 299150
This commit is contained in:
Dean Michael Berris 2017-03-31 01:56:45 +00:00
parent f01e37c98d
commit 3f6d4b605c
2 changed files with 21 additions and 6 deletions

View File

@ -0,0 +1,20 @@
#RUN: llvm-xray graph %s -o - -m %S/Inputs/simple-instrmap.yaml | FileCheck %s
---
header:
version: 1
type: 0
constant-tsc: true
nonstop-tsc: true
cycle-frequency: 2601000000
records:
- { type: 0, func-id: 1, cpu: 1, thread: 111, kind: function-enter, tsc: 10001 }
- { type: 0, func-id: 2, cpu: 1, thread: 111, kind: function-enter, tsc: 10002 }
- { type: 0, func-id: 2, cpu: 1, thread: 111, kind: function-exit, tsc: 10002 }
- { type: 0, func-id: 1, cpu: 1, thread: 111, kind: function-exit, tsc: 10100 }
...
#CHECK: digraph xray {
#CHECK-DAG: F0 -> F1 [{{.*}}];
#CHECK-DAG: F1 -> F2 [{{.*}}];
#CHECK-DAG: }

View File

@ -259,7 +259,7 @@ Error GraphRenderer::accountRecord(const XRayRecord &Record) {
template <typename U>
void GraphRenderer::getStats(U begin, U end, GraphRenderer::TimeStat &S) {
assert(begin != end);
if (begin == end) return;
std::ptrdiff_t MedianOff = S.Count / 2;
std::nth_element(begin, begin + MedianOff, end);
S.Median = *(begin + MedianOff);
@ -287,9 +287,7 @@ void GraphRenderer::calculateEdgeStatistics() {
for (auto &E : G.edges()) {
auto &A = E.second;
assert(!A.Timings.empty());
assert((A.Timings[0] > 0));
getStats(A.Timings.begin(), A.Timings.end(), A.S);
assert(A.S.Sum > 0);
updateMaxStats(A.S, G.GraphEdgeMax);
}
}
@ -297,15 +295,12 @@ void GraphRenderer::calculateEdgeStatistics() {
void GraphRenderer::calculateVertexStatistics() {
std::vector<uint64_t> TempTimings;
for (auto &V : G.vertices()) {
assert((V.first == 0 || G[V.first].S.Sum != 0) &&
"Every non-root vertex should have at least one call");
if (V.first != 0) {
for (auto &E : G.inEdges(V.first)) {
auto &A = E.second;
TempTimings.insert(TempTimings.end(), A.Timings.begin(),
A.Timings.end());
}
assert(!TempTimings.empty() && TempTimings[0] > 0);
getStats(TempTimings.begin(), TempTimings.end(), G[V.first].S);
updateMaxStats(G[V.first].S, G.GraphVertexMax);
TempTimings.clear();