lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 23 Sep 2021 00:46:16 -0700 From: Ian Rogers <irogers@...gle.com> To: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>, Arnaldo Carvalho de Melo <acme@...nel.org>, Mark Rutland <mark.rutland@....com>, Alexander Shishkin <alexander.shishkin@...ux.intel.com>, Jiri Olsa <jolsa@...hat.com>, Namhyung Kim <namhyung@...nel.org>, linux-kernel@...r.kernel.org, Andi Kleen <ak@...ux.intel.com>, Jin Yao <yao.jin@...ux.intel.com>, John Garry <john.garry@...wei.com>, Paul Clarke <pc@...ibm.com>, kajoljain <kjain@...ux.ibm.com>, linux-perf-users@...r.kernel.org Cc: Stephane Eranian <eranian@...gle.com>, Sandeep Dasgupta <sdasgup@...gle.com>, Ian Rogers <irogers@...gle.com> Subject: [PATCH v9 13/13] perf metric: Avoid events for an 'if' constant result For a metric like: CONST if expr else CONST if the values of CONST are identical then expr doesn't need evaluating, and events, in order to compute a result. Signed-off-by: Ian Rogers <irogers@...gle.com> --- tools/perf/tests/expr.c | 7 +++++++ tools/perf/util/expr.y | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c index 287989321d2a..f1d8411fce12 100644 --- a/tools/perf/tests/expr.c +++ b/tools/perf/tests/expr.c @@ -143,6 +143,13 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused) smt_on() ? "EVENT1" : "EVENT2", (void **)&val_ptr)); + /* The expression is a constant 1.0 without needing to evaluate EVENT1. */ + expr__ctx_clear(ctx); + TEST_ASSERT_VAL("find ids", + expr__find_ids("1.0 if EVENT1 > 100.0 else 1.0", + NULL, ctx, 0) == 0); + TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 0); + expr__ctx_free(ctx); return 0; diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y index 5b878f044f22..ba7d3b667fcb 100644 --- a/tools/perf/util/expr.y +++ b/tools/perf/util/expr.y @@ -142,6 +142,16 @@ if_expr: expr IF expr ELSE expr $$.ids = $1.ids; ids__free($3.ids); ids__free($5.ids); + } else if ($1.val == $5.val) { + /* + * LHS == RHS, so both are an identical constant. No need to + * evaluate any events. + */ + $$.val = $1.val; + $$.ids = NULL; + ids__free($1.ids); + ids__free($3.ids); + ids__free($5.ids); } else { /* * Value is either the LHS or RHS and we need the IF expression -- 2.33.0.464.g1972c5931b-goog
Powered by blists - more mailing lists