[PATCH 31/41] perf report: Fix wrong jump arrow

From: Arnaldo Carvalho de Melo
Date: Fri Feb 16 2018 - 14:20:01 EST


From: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>

When we use perf report interactive annotate view, we can see
the position of jump arrow is not correct. For example,

1. perf record -b ...
2. perf report
3. In interactive mode, select Annotate 'function'

Percentâ IPC Cycle
â if (flag)
1.37 â0.4âââ 1 â je 82
â â x += x / y + y / x;
0.00 â0.4â 1310 movsd (%rsp),%xmm0
0.00 â0.4â 565 movsd 0x8(%rsp),%xmm4
â0.4â movsd 0x8(%rsp),%xmm1
â0.4â movsd (%rsp),%xmm3
â0.4â divsd %xmm4,%xmm0
0.00 â0.4â 579 divsd %xmm3,%xmm1
â0.4â movsd (%rsp),%xmm2
â0.4â addsd %xmm1,%xmm0
â0.4â addsd %xmm2,%xmm0
0.00 â0.4â movsd %xmm0,(%rsp)
â â volatile double x = 1212121212, y = 121212;
â â
â â s_randseed = time(0);
â â srand(s_randseed);
â â
â â for (i = 0; i < 2000000000; i++) {
1.37 â0.4âââ 82: sub $0x1,%ebx
28.21 â0.48 17 â jne 38

The jump arrow in above example is not correct. It should add the
width of IPC and Cycle.

With this patch, the result is:

Percentâ IPC Cycle
â if (flag)
1.37 â0.48 1 âââje 82
â â x += x / y + y / x;
0.00 â0.48 1310 â movsd (%rsp),%xmm0
0.00 â0.48 565 â movsd 0x8(%rsp),%xmm4
â0.48 â movsd 0x8(%rsp),%xmm1
â0.48 â movsd (%rsp),%xmm3
â0.48 â divsd %xmm4,%xmm0
0.00 â0.48 579 â divsd %xmm3,%xmm1
â0.48 â movsd (%rsp),%xmm2
â0.48 â addsd %xmm1,%xmm0
â0.48 â addsd %xmm2,%xmm0
0.00 â0.48 â movsd %xmm0,(%rsp)
â â volatile double x = 1212121212, y = 121212;
â â
â â s_randseed = time(0);
â â srand(s_randseed);
â â
â â for (i = 0; i < 2000000000; i++) {
1.37 â0.48 82:âââsub $0x1,%ebx
28.21 â0.48 17 â jne 38

Committer notes:

Please note that only from LBRv5 (according to Jiri) onwards, i.e. >=
Skylake is that we'll have the cycles counts in each branch record
entry, so to see the Cycles and IPC columns, and be able to test this
patch, one need a capable hardware.

While applying this I first tested it on a Broadwell class machine and
couldn't get those columns, will add code to the annotate browser to
warn the user about that, i.e. you have branch records, but no cycles,
use a more recent hardware to get the cycles and IPC columns.

Signed-off-by: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>
Cc: Alexander Shishkin <alexander.shishkin@xxxxxxxxxxxxxxx>
Cc: Andi Kleen <ak@xxxxxxxxxxxxxxx>
Cc: Jin Yao <yao.jin@xxxxxxxxx>
Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
Cc: Kan Liang <kan.liang@xxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Link: http://lkml.kernel.org/r/1517223473-14750-1-git-send-email-yao.jin@xxxxxxxxxxxxxxx
Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
---
tools/perf/ui/browsers/annotate.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
index 286427975112..e2f666391ac4 100644
--- a/tools/perf/ui/browsers/annotate.c
+++ b/tools/perf/ui/browsers/annotate.c
@@ -319,6 +319,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
struct map_symbol *ms = ab->b.priv;
struct symbol *sym = ms->sym;
u8 pcnt_width = annotate_browser__pcnt_width(ab);
+ int width = 0;

/* PLT symbols contain external offsets */
if (strstr(sym->name, "@plt"))
@@ -340,13 +341,17 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
to = (u64)btarget->idx;
}

+ if (ab->have_cycles)
+ width = IPC_WIDTH + CYCLES_WIDTH;
+
ui_browser__set_color(browser, HE_COLORSET_JUMP_ARROWS);
- __ui_browser__line_arrow(browser, pcnt_width + 2 + ab->addr_width,
+ __ui_browser__line_arrow(browser,
+ pcnt_width + 2 + ab->addr_width + width,
from, to);

if (is_fused(ab, cursor)) {
ui_browser__mark_fused(browser,
- pcnt_width + 3 + ab->addr_width,
+ pcnt_width + 3 + ab->addr_width + width,
from - 1,
to > from ? true : false);
}
--
2.14.3