aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Coplan <alex.coplan@arm.com>2023-11-01 21:45:39 +0000
committerAlex Coplan <alex.coplan@arm.com>2023-11-24 10:58:06 +0000
commitfea27dfd227c49f1409260e814e400fce4fbe2a7 (patch)
tree6042e4035cea323a4d1bb961d5f254906e0f2b14
parenta49befbd2c783e751dc2110b544fe540eb7e33eb (diff)
downloadgcc-fea27dfd227c49f1409260e814e400fce4fbe2a7.zip
gcc-fea27dfd227c49f1409260e814e400fce4fbe2a7.tar.gz
gcc-fea27dfd227c49f1409260e814e400fce4fbe2a7.tar.bz2
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.
-rw-r--r--gcc/rtl-ssa/access-utils.h40
-rw-r--r--gcc/rtl-ssa/accesses.cc14
2 files changed, 46 insertions, 8 deletions
diff --git a/gcc/rtl-ssa/access-utils.h b/gcc/rtl-ssa/access-utils.h
index f078625b..9a62add 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 76d70fd..9ec0e6be 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;
}