From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4026 invoked by alias); 26 Jul 2018 14:43:58 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 4014 invoked by uid 89); 26 Jul 2018 14:43:57 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 26 Jul 2018 14:43:56 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 2DBDCAB99; Thu, 26 Jul 2018 14:43:54 +0000 (UTC) From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] Add malloc predictor (PR middle-end/83023). To: gcc-patches@gcc.gnu.org Cc: Jan Hubicka , Nathan Sidwell Message-ID: Date: Thu, 26 Jul 2018 14:43:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------0D7F0EB1B959B26C9A761D83" X-IsSubscribed: yes X-SW-Source: 2018-07/txt/msg01659.txt.bz2 This is a multi-part message in MIME format. --------------0D7F0EB1B959B26C9A761D83 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 858 Hi. Following patch implements new predictors that annotates malloc-like functions. These almost every time return a non-null value. Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. Ready to be installed? Martin gcc/ChangeLog: 2018-07-26 Martin Liska PR middle-end/83023 * predict.c (expr_expected_value_1): Handle DECL_IS_MALLOC declarations. * predict.def (PRED_MALLOC_NONNULL): New predictor. gcc/testsuite/ChangeLog: 2018-07-26 Martin Liska PR middle-end/83023 * gcc.dg/predict-16.c: New test. --- gcc/predict.c | 8 ++++++++ gcc/predict.def | 3 +++ gcc/testsuite/gcc.dg/predict-16.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/predict-16.c --------------0D7F0EB1B959B26C9A761D83 Content-Type: text/x-patch; name="0001-Add-malloc-predictor-PR-middle-end-83023.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-Add-malloc-predictor-PR-middle-end-83023.patch" Content-length: 1834 diff --git a/gcc/predict.c b/gcc/predict.c index a6769eda1c7..a7b2223c697 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2380,6 +2380,14 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code, } return NULL; } + + if (DECL_IS_MALLOC (decl)) + { + if (predictor) + *predictor = PRED_MALLOC_NONNULL; + return boolean_true_node; + } + if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) switch (DECL_FUNCTION_CODE (decl)) { diff --git a/gcc/predict.def b/gcc/predict.def index 4ed97ed165c..8036fac84c5 100644 --- a/gcc/predict.def +++ b/gcc/predict.def @@ -169,6 +169,9 @@ DEF_PREDICTOR (PRED_HOT_LABEL, "hot label", HITRATE (85), 0) DEF_PREDICTOR (PRED_COLD_LABEL, "cold label", PROB_VERY_LIKELY, PRED_FLAG_FIRST_MATCH) +/* Return value of malloc function is almost always non-null. */ +DEF_PREDICTOR (PRED_MALLOC_NONNULL, "malloc returned non-NULL", \ + PROB_VERY_LIKELY, PRED_FLAG_FIRST_MATCH) /* The following predictors are used in Fortran. */ diff --git a/gcc/testsuite/gcc.dg/predict-16.c b/gcc/testsuite/gcc.dg/predict-16.c new file mode 100644 index 00000000000..3a3e943bb79 --- /dev/null +++ b/gcc/testsuite/gcc.dg/predict-16.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ + +#include +#include + +void *r; +void *r2; +void *r3; +void *r4; + +void *m (size_t s, int c) +{ + r = malloc (s); + if (r) + memset (r, 0, s); + + r2 = calloc (s, 0); + if (r2) + memset (r2, 0, s); + + r3 = __builtin_malloc (s); + if (r3) + memset (r3, 0, s); + + r4 = __builtin_calloc (s, 0); + if (r4) + memset (r4, 0, s); +} + +/* { dg-final { scan-tree-dump-times "malloc returned non-NULL heuristics of edge\[^:\]*: 99.96%" 4 "profile_estimate"} } */ --------------0D7F0EB1B959B26C9A761D83--