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

Reply via email to