public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-5821] rtl-ssa: Add some helpers for removing accesses
@ 2023-11-24 10:58 Alex Coplan
  0 siblings, 0 replies; only message in thread
From: Alex Coplan @ 2023-11-24 10:58 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:fea27dfd227c49f1409260e814e400fce4fbe2a7

commit r14-5821-gfea27dfd227c49f1409260e814e400fce4fbe2a7
Author: Alex Coplan <alex.coplan@arm.com>
Date:   Wed Nov 1 21:45:39 2023 +0000

    rtl-ssa: Add some helpers for removing accesses
    
    This adds some helpers to access-utils.h for removing accesses from an
    access_array.  This is needed by the upcoming aarch64 load/store pair
    fusion pass.
    
    gcc/ChangeLog:
    
            * rtl-ssa/access-utils.h (filter_accesses): New.
            (remove_regno_access): New.
            (check_remove_regno_access): New.
            * rtl-ssa/accesses.cc (rtl_ssa::remove_note_accesses_base): Use
            new filter_accesses helper.

Diff:
---
 gcc/rtl-ssa/access-utils.h | 40 ++++++++++++++++++++++++++++++++++++++++
 gcc/rtl-ssa/accesses.cc    | 14 ++++++--------
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/gcc/rtl-ssa/access-utils.h b/gcc/rtl-ssa/access-utils.h
index f078625babf..9a62addfd2a 100644
--- a/gcc/rtl-ssa/access-utils.h
+++ b/gcc/rtl-ssa/access-utils.h
@@ -78,6 +78,46 @@ drop_memory_access (T accesses)
   return T (arr.begin (), accesses.size () - 1);
 }
 
+// Filter ACCESSES to return an access_array of only those accesses that
+// satisfy PREDICATE.  Alocate the new array above WATERMARK.
+template<typename T, typename FilterPredicate>
+inline T
+filter_accesses (obstack_watermark &watermark,
+		 T accesses,
+		 FilterPredicate predicate)
+{
+  access_array_builder builder (watermark);
+  builder.reserve (accesses.size ());
+  for (auto access : accesses)
+    if (predicate (access))
+      builder.quick_push (access);
+  return T (builder.finish ());
+}
+
+// Given an array of ACCESSES, remove any access with regno REGNO.
+// Allocate the new access array above WM.
+template<typename T>
+inline T
+remove_regno_access (obstack_watermark &watermark,
+		     T accesses, unsigned int regno)
+{
+  using Access = decltype (accesses[0]);
+  auto pred = [regno](Access a) { return a->regno () != regno; };
+  return filter_accesses (watermark, accesses, pred);
+}
+
+// As above, but additionally check that we actually did remove an access.
+template<typename T>
+inline T
+check_remove_regno_access (obstack_watermark &watermark,
+			   T accesses, unsigned regno)
+{
+  auto orig_size = accesses.size ();
+  auto result = remove_regno_access (watermark, accesses, regno);
+  gcc_assert (result.size () < orig_size);
+  return result;
+}
+
 // If sorted array ACCESSES includes a reference to REGNO, return the
 // access, otherwise return null.
 template<typename T>
diff --git a/gcc/rtl-ssa/accesses.cc b/gcc/rtl-ssa/accesses.cc
index 76d70fd8bd3..9ec0e6be071 100644
--- a/gcc/rtl-ssa/accesses.cc
+++ b/gcc/rtl-ssa/accesses.cc
@@ -1597,16 +1597,14 @@ access_array
 rtl_ssa::remove_note_accesses_base (obstack_watermark &watermark,
 				    access_array accesses)
 {
+  auto predicate = [](access_info *a) {
+    return !a->only_occurs_in_notes ();
+  };
+
   for (access_info *access : accesses)
     if (access->only_occurs_in_notes ())
-      {
-	access_array_builder builder (watermark);
-	builder.reserve (accesses.size ());
-	for (access_info *access2 : accesses)
-	  if (!access2->only_occurs_in_notes ())
-	    builder.quick_push (access2);
-	return builder.finish ();
-      }
+      return filter_accesses (watermark, accesses, predicate);
+
   return accesses;
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-11-24 10:58 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-24 10:58 [gcc r14-5821] rtl-ssa: Add some helpers for removing accesses Alex Coplan

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).