public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Roger Sayle <sayle@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r12-7665] Performance/size improvement to single_use when matching GIMPLE.
Date: Wed, 16 Mar 2022 09:28:46 +0000 (GMT)	[thread overview]
Message-ID: <20220316092846.BFAEE3857806@sourceware.org> (raw)

https://gcc.gnu.org/g:6aef670e486e60e9f492752ff25ff3ed6058bc3b

commit r12-7665-g6aef670e486e60e9f492752ff25ff3ed6058bc3b
Author: Roger Sayle <roger@nextmovesoftware.com>
Date:   Wed Mar 16 09:27:33 2022 +0000

    Performance/size improvement to single_use when matching GIMPLE.
    
    This patch improves the implementation of single_use as used in code
    generated from match.pd for patterns using :s.  The current implementation
    contains the logic "has_zero_uses (t) || has_single_use (t)" which
    performs a loop over the uses to first check if there are zero non-debug
    uses [which is rare], then another loop over these uses to check if there
    is exactly one non-debug use.  This can be better implemented using a
    single loop.
    
    This function is currently inlined over 800 times in gimple-match.cc,
    whose .o on x86_64-pc-linux-gnu is now up to 30 Mbytes, so speeding up
    and shrinking this function should help offset the growth in match.pd
    for GCC 12.
    
    I've also done an analysis of the stage3 sizes of gimple-match.o on
    x86_64-pc-linux-gnu, which I believe is dominated by debug information,
    the .o file is 30MB in stage3, but only 4.8M in stage2.  Before my
    proposed patch gimple-match.o is 31385160 bytes.  The patch as proposed
    yesterday (using a single loop in single_use) reduces that to 31105040
    bytes, saving 280120 bytes.  The suggestion to remove the "inline"
    keyword saves only 56 more bytes, but annotating ATTRIBUTE_PURE on a
    function prototype was curiously effective, saving 1888 bytes.
    
    before:   31385160
    after:    31105040      saved 280120
    -inline:  31104984      saved 56
    +pure:    31103096      saved 1888
    
    2022-03-16  Roger Sayle  <roger@nextmovesoftware.com>
                Richard Biener  <rguenther@suse.de>
    
    gcc/ChangeLog
            * gimple-match-head.cc (single_use): Implement inline using a
            single loop.

Diff:
---
 gcc/gimple-match-head.cc | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc
index 74d5818898f..1c74d38088f 100644
--- a/gcc/gimple-match-head.cc
+++ b/gcc/gimple-match-head.cc
@@ -1160,10 +1160,28 @@ types_match (tree t1, tree t2)
    non-SSA_NAME (ie constants) and zero uses to cope with uses
    that aren't linked up yet.  */
 
-static inline bool
-single_use (tree t)
+static bool
+single_use (const_tree) ATTRIBUTE_PURE;
+
+static bool
+single_use (const_tree t)
 {
-  return TREE_CODE (t) != SSA_NAME || has_zero_uses (t) || has_single_use (t);
+  if (TREE_CODE (t) != SSA_NAME)
+    return true;
+
+  /* Inline return has_zero_uses (t) || has_single_use (t);  */
+  const ssa_use_operand_t *const head = &(SSA_NAME_IMM_USE_NODE (t));
+  const ssa_use_operand_t *ptr;
+  bool single = false;
+
+  for (ptr = head->next; ptr != head; ptr = ptr->next)
+    if (USE_STMT(ptr) && !is_gimple_debug (USE_STMT (ptr)))
+      {
+        if (single)
+          return false;
+	single = true;
+      }
+  return true;
 }
 
 /* Return true if math operations should be canonicalized,


                 reply	other threads:[~2022-03-16  9:28 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220316092846.BFAEE3857806@sourceware.org \
    --to=sayle@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).