Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/814017/?format=api
{ "id": 814017, "url": "http://patchwork.ozlabs.org/api/patches/814017/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/CAELXzTMazB7YRiTR73bzOqCMOPk6ubF8=4LYEzzK0imf+FVS8w@mail.gmail.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<CAELXzTMazB7YRiTR73bzOqCMOPk6ubF8=4LYEzzK0imf+FVS8w@mail.gmail.com>", "list_archive_url": null, "date": "2017-09-15T01:33:28", "name": "[RFC,AARCH64,5/5] add aarch64_loop_unroll_adjust to limit partial unrolling in rtl based on strided-loads in loop", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "a42a1bc006d056144bedcffdbfbc9e13633ffef9", "submitter": { "id": 25768, "url": "http://patchwork.ozlabs.org/api/people/25768/?format=api", "name": "Kugan Vivekanandarajah", "email": "kugan.vivekanandarajah@linaro.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/CAELXzTMazB7YRiTR73bzOqCMOPk6ubF8=4LYEzzK0imf+FVS8w@mail.gmail.com/mbox/", "series": [ { "id": 3186, "url": "http://patchwork.ozlabs.org/api/series/3186/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=3186", "date": "2017-09-15T01:24:36", "name": "Loop unrolling and memory load streams", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/3186/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/814017/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/814017/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-return-462193-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "mailing list gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-462193-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"banTHGZ9\"; dkim-atps=neutral", "sourceware.org; auth=none" ], "Received": [ "from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xtdGD3hkfz9t2V\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 15 Sep 2017 11:33:40 +1000 (AEST)", "(qmail 115753 invoked by alias); 15 Sep 2017 01:33:33 -0000", "(qmail 115744 invoked by uid 89); 15 Sep 2017 01:33:33 -0000", "from mail-qt0-f175.google.com (HELO mail-qt0-f175.google.com)\n\t(209.85.216.175) by sourceware.org\n\t(qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP;\n\tFri, 15 Sep 2017 01:33:31 +0000", "by mail-qt0-f175.google.com with SMTP id s18so1004889qta.3 for\n\t<gcc-patches@gcc.gnu.org>; Thu, 14 Sep 2017 18:33:31 -0700 (PDT)", "by 10.237.37.211 with HTTP; Thu, 14 Sep 2017 18:33:28 -0700 (PDT)" ], "DomainKey-Signature": "a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender\n\t:mime-version:from:date:message-id:subject:to:content-type; q=\n\tdns; s=default; b=dDQ9qGJpoMXNZ0aT0YfDyuTyjBgNXzTL9kGQoS+TJ16DB1\n\tTPTAMOq39FlZzPlKRS91OTHOLlkZANF4u7bXB51wul/F34vYp2D0/gOD8KrLGE6h\n\t+Pj6h04dPfscMrZay8kKiC4HOb4Bl62ot0o0j9otuPAwdPRP/0Fcfi5GOP9JQ=", "DKIM-Signature": "v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender\n\t:mime-version:from:date:message-id:subject:to:content-type; s=\n\tdefault; bh=S4uBgiqx1VMBhVx94dTvpPJog1Q=; b=banTHGZ9Th0TrsD6Ydnw\n\tIacR0FsDzb4zQ2br5vs/9NpVfHY5GRS5Y+kWgVkwlpxqQCxFcuZHVO4xpUwHv6mo\n\tPbYqZPg0e8EEvGC1VG4MIc+NsaT2STXDBK0DMBL9egmDgEwZCMhOAVSeMGZPOkHG\n\tAJA4sdYvE+lJHW/Nzj0rJg4=", "Mailing-List": "contact gcc-patches-help@gcc.gnu.org; run by ezmlm", "Precedence": "bulk", "List-Id": "<gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "List-Archive": "<http://gcc.gnu.org/ml/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-help@gcc.gnu.org>", "Sender": "gcc-patches-owner@gcc.gnu.org", "X-Virus-Found": "No", "X-Spam-SWARE-Status": "No, score=-24.4 required=5.0 tests=AWL, BAYES_00,\n\tGIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3,\n\tRCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM,\n\tSPF_PASS autolearn=ham version=3.3.2 spammy=", "X-HELO": "mail-qt0-f175.google.com", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;\n\ts=20161025;\n\th=x-gm-message-state:mime-version:from:date:message-id:subject:to;\n\tbh=4oL5zEPTSVijPy+W3ivPCfh4qXJ/CxbylyiQoEfU5tU=;\n\tb=JN4rtPQ+rGCO6O5QMCChXjtp+qSpYpHrSnyuCVdeMRP2IXG1Ay96vUMvHnlUh1hiow\n\tygiviMoYylp+MX4qy8vtywCb0sAL6PGA15QmwbxvH9luRdcNRL+L/2iykywxquAoR2YY\n\tmUgmQacpcFZZB5DyN6zhe/LRp/6pS21H7El7rF5a7zjpp5GntLJXqc8V/gikNFst4Mp6\n\tLMzte0/wzLWGmzD5xQjt8p4xq7Pbes8nE0Nzu3MD4IHzQCgdiZXJ/OwYvl3smS6B+2ko\n\tMj2YPX49j1WL8Oc2fFazsLhtxLOtbaBGIauh5QFaEyN0z59P6q3wIzgB6+HvSnaGr3BN\n\t0eIw==", "X-Gm-Message-State": "AHPjjUgDmtZFvvKXlUtGlt6pg8675W7mDGGnEFVbfg5rYdwTOf7PFf7I\tPar5iQBNnFvIEgPIu/W9JBdf0hdpD2SuN9WqQWfhSqZXYv4=", "X-Google-Smtp-Source": "AOwi7QCjHQKUrFQlK0aYsNBaOFwL4XdfUswt7geiML8Gif6gxUmrCxcJGUQlmrSrcWd9Fpo5CCiXEMONASg6dSw5lyE=", "X-Received": "by 10.237.37.228 with SMTP id y33mr25193921qtc.79.1505439210034;\n\tThu, 14 Sep 2017 18:33:30 -0700 (PDT)", "MIME-Version": "1.0", "From": "Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>", "Date": "Fri, 15 Sep 2017 11:33:28 +1000", "Message-ID": "<CAELXzTMazB7YRiTR73bzOqCMOPk6ubF8=4LYEzzK0imf+FVS8w@mail.gmail.com>", "Subject": "[RFC][AARCH64][PATCH 5/5] add aarch64_loop_unroll_adjust to limit\n\tpartial unrolling in rtl based on strided-loads in loop", "To": "\"gcc-patches@gcc.gnu.org\" <gcc-patches@gcc.gnu.org>", "Content-Type": "multipart/mixed; boundary=\"001a1140d9f45980ef0559306164\"", "X-IsSubscribed": "yes" }, "content": "This patch adds aarch64_loop_unroll_adjust to limit partial unrolling\nin rtl based on strided-loads in loop.\n\nThanks,\nKugan\n\ngcc/ChangeLog:\n\n2017-09-12 Kugan Vivekanandarajah <kuganv@linaro.org>\n\n * cfgloop.h (iv_analyze_biv): export.\n * loop-iv.c: Likewise.\n * config/aarch64/aarch64.c (strided_load_p): New.\n (insn_has_strided_load): New.\n (count_strided_load_rtl): New.\n (aarch64_loop_unroll_adjust): New.", "diff": "From 10e02b026784798fff6a3513dc11b1cffb1cf78a Mon Sep 17 00:00:00 2001\nFrom: Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>\nDate: Wed, 23 Aug 2017 12:35:14 +1000\nSubject: [PATCH 5/5] add aarch64_loop_unroll_adjust\n\n---\n gcc/cfgloop.h | 1 +\n gcc/config/aarch64/aarch64.c | 136 +++++++++++++++++++++++++++++++++++++++++++\n gcc/loop-iv.c | 2 +-\n 3 files changed, 138 insertions(+), 1 deletion(-)\n\ndiff --git a/gcc/cfgloop.h b/gcc/cfgloop.h\nindex 2308e7a..a3876a2 100644\n--- a/gcc/cfgloop.h\n+++ b/gcc/cfgloop.h\n@@ -479,6 +479,7 @@ extern bool iv_analyze_expr (rtx_insn *, rtx, machine_mode,\n extern rtx get_iv_value (struct rtx_iv *, rtx);\n extern bool biv_p (rtx_insn *, rtx);\n extern void find_simple_exit (struct loop *, struct niter_desc *);\n+extern bool iv_analyze_biv (rtx def, struct rtx_iv *iv);\n extern void iv_analysis_done (void);\n \n extern struct niter_desc *get_simple_loop_desc (struct loop *loop);\ndiff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c\nindex e88bb6c..624a996 100644\n--- a/gcc/config/aarch64/aarch64.c\n+++ b/gcc/config/aarch64/aarch64.c\n@@ -15189,6 +15189,139 @@ aarch64_ok_to_unroll (struct loop *loop, unsigned HOST_WIDE_INT nunroll)\n return true;\n }\n \n+/* Return true if X is a strided load. */\n+\n+static bool\n+strided_load_p (const_rtx x)\n+{\n+ struct rtx_iv iv;\n+ rtx reg;\n+\n+ if (!MEM_P (x))\n+ return false;\n+\n+ reg = XEXP (x, 0);\n+ if (REG_P (reg)\n+ || UNARY_P (reg))\n+ {\n+ if (!REG_P (reg))\n+\treg = XEXP (reg, 0);\n+ if (REG_P (reg)\n+\t && iv_analyze_biv (reg, &iv))\n+\treturn true;\n+ }\n+ else if (BINARY_P (reg))\n+ {\n+ rtx reg1, reg2;\n+ reg1 = XEXP (reg, 0);\n+ reg2 = XEXP (reg, 1);\n+ if (REG_P (reg1)\n+\t && iv_analyze_biv (reg1, &iv))\n+\treturn true;\n+ if (REG_P (reg2)\n+\t && iv_analyze_biv (reg2, &iv))\n+\treturn true;\n+ }\n+ return false;\n+}\n+\n+\n+/* Return true if X INSN is a strided load. */\n+\n+static bool\n+insn_has_strided_load (rtx_insn *insn)\n+{\n+ subrtx_iterator::array_type array;\n+ if (!INSN_P (insn) || recog_memoized (insn) < 0)\n+ return false;\n+ rtx pat = PATTERN (insn);\n+\n+ switch (GET_CODE (pat))\n+ {\n+ case PARALLEL:\n+\t{\n+\t for (int j = 0; j < XVECLEN (pat, 0); ++j)\n+\t {\n+\t rtx ex = XVECEXP (pat, 0, j);\n+\t FOR_EACH_SUBRTX (iter, array, ex, NONCONST)\n+\t\t{\n+\t\t const_rtx x = *iter;\n+\t\t if (GET_CODE (x) == SET\n+\t\t && strided_load_p (SET_SRC (x)))\n+\t\t return true;\n+\t\t}\n+\t }\n+\t}\n+ break;\n+\n+ case SET:\n+ FOR_EACH_SUBRTX (iter, array, SET_SRC (pat), NONCONST)\n+\t{\n+\t const_rtx x = *iter;\n+\t if (strided_load_p (x))\n+\t return true;\n+\t}\n+\n+ default:\n+ break;\n+ }\n+ return false;\n+}\n+\n+/* Count the strided loads in the LOOP. If the strided loads are larger\n+ (compared to MAX_STRIDED_LOADS), we dont need to compute all of\n+ them. This is used to limit the partial unrolling factor to avoid\n+ prefetcher collision. */\n+\n+static unsigned\n+count_strided_load_rtl (struct loop *loop, unsigned max_strided_loads)\n+{\n+ basic_block *bbs;\n+ unsigned count = 0;\n+ rtx_insn *insn;\n+ iv_analysis_loop_init (loop);\n+ bbs = get_loop_body (loop);\n+\n+ for (unsigned i = 0; i < loop->num_nodes; ++i)\n+ {\n+ FOR_BB_INSNS (bbs[i], insn)\n+\t{\n+\t if (insn_has_strided_load (insn))\n+\t count ++;\n+\n+\t if (count > (max_strided_loads / 2))\n+\t {\n+\t free (bbs);\n+\t iv_analysis_done ();\n+\t return count;\n+\t }\n+\t}\n+ }\n+ free (bbs);\n+ iv_analysis_done ();\n+ return count;\n+}\n+\n+/* Target hook loop_unroll_adjust that limits partial loop unrolling\n+ factor, if this would make the outer loop's prefetch streams more\n+ than hardware can handle. */\n+\n+static unsigned\n+aarch64_loop_unroll_adjust (unsigned n_unroll, struct loop *loop)\n+{\n+ int max_strided_loads;\n+ max_strided_loads = aarch64_tune_params.prefetch->hw_prefetchers_avail;\n+\n+ if (max_strided_loads == -1)\n+ return n_unroll;\n+\n+ unsigned count = count_strided_load_rtl (loop, max_strided_loads);\n+ if (count > 0)\n+ n_unroll = 1 << (floor_log2 (max_strided_loads/count));\n+\n+ return n_unroll;\n+}\n+\n /* Target-specific selftests. */\n \n #if CHECKING_P\n@@ -15620,6 +15753,9 @@ aarch64_libgcc_floating_mode_supported_p\n #undef TARGET_OK_TO_UNROLL\n #define TARGET_OK_TO_UNROLL aarch64_ok_to_unroll\n \n+#undef TARGET_LOOP_UNROLL_ADJUST\n+#define TARGET_LOOP_UNROLL_ADJUST aarch64_loop_unroll_adjust\n+\n #if CHECKING_P\n #undef TARGET_RUN_TARGET_SELFTESTS\n #define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests\ndiff --git a/gcc/loop-iv.c b/gcc/loop-iv.c\nindex 745b613..3a8c54e 100644\n--- a/gcc/loop-iv.c\n+++ b/gcc/loop-iv.c\n@@ -852,7 +852,7 @@ record_biv (rtx def, struct rtx_iv *iv)\n /* Determines whether DEF is a biv and if so, stores its description\n to *IV. */\n \n-static bool\n+bool\n iv_analyze_biv (rtx def, struct rtx_iv *iv)\n {\n rtx inner_step, outer_step;\n-- \n2.7.4\n\n", "prefixes": [ "RFC", "AARCH64", "5/5" ] }