From: Dean Michael Berris Date: Fri, 31 Mar 2017 01:56:45 +0000 (+0000) Subject: [XRay][tools] Remove some assertions in llvm-xray graph X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=365612c08f3e1380ddfbb0748353d4585894d542;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299150 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-xray/X86/graph-zero-latency-calls.yaml b/test/tools/llvm-xray/X86/graph-zero-latency-calls.yaml new file mode 100644 index 00000000000..602f209072a --- /dev/null +++ b/test/tools/llvm-xray/X86/graph-zero-latency-calls.yaml @@ -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: } diff --git a/tools/llvm-xray/xray-graph.cc b/tools/llvm-xray/xray-graph.cc index 9fdc099b6be..9be0b70c2cd 100644 --- a/tools/llvm-xray/xray-graph.cc +++ b/tools/llvm-xray/xray-graph.cc @@ -259,7 +259,7 @@ Error GraphRenderer::accountRecord(const XRayRecord &Record) { template 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 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();