In previous patch, we have already linked up the same basic blocks. Now we compute the cycles diff value of basic blocks, in order to sort by diff cycles later.
Signed-off-by: Jin Yao <yao....@linux.intel.com> --- tools/perf/builtin-diff.c | 31 +++++++++++++++++++++++++++++++ tools/perf/util/sort.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 72c33ab..47e34a3 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -1132,6 +1132,31 @@ static void block_hists_match(struct hists *hists_base, } } +static void compute_block_hists_diff(struct block_hists *block_hists, + struct data__file *d) +{ + struct hists *hists = &block_hists->hists; + struct rb_root_cached *root = hists->entries_in; + struct rb_node *next = rb_first_cached(root); + + while (next != NULL) { + struct hist_entry *he = rb_entry(next, struct hist_entry, + rb_node_in); + struct hist_entry *pair = get_pair_data(he, d); + + next = rb_next(&he->rb_node_in); + + if (pair) { + pair->diff.computed = true; + if (pair->block_info->num && he->block_info->num) { + pair->diff.cycles_diff = + pair->block_info->cycles_aggr / pair->block_info->num_aggr - + he->block_info->cycles_aggr / he->block_info->num_aggr; + } + } + } +} + static void basic_block_process(void) { struct hists *hists_base = &data__files[0].block_hists.hists; @@ -1151,6 +1176,12 @@ static void basic_block_process(void) block_hists_match(hists_base, hists); } + data__for_each_file_new(i, d) { + hists = &d->block_hists.hists; + d->hists = hists; + compute_block_hists_diff(&data__files[0].block_hists, d); + } + data__for_each_file(i, d) { hists__delete_entries(&d->block_hists.sym_hists); hists__delete_entries(&d->block_hists.hists); diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index 43623fa..de9e61a 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h @@ -79,6 +79,8 @@ struct hist_entry_diff { /* HISTC_WEIGHTED_DIFF */ s64 wdiff; + + s64 cycles_diff; }; }; -- 2.7.4