Index: test/tools/llvm-xray/X86/graph-zero-latency-calls.yaml =================================================================== --- /dev/null +++ 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: } Index: tools/llvm-xray/xray-graph.cc =================================================================== --- tools/llvm-xray/xray-graph.cc +++ tools/llvm-xray/xray-graph.cc @@ -259,7 +259,7 @@ 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 @@ 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::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();