diff options
author | Alex Coplan <alex.coplan@arm.com> | 2023-11-01 21:45:39 +0000 |
---|---|---|
committer | Alex Coplan <alex.coplan@arm.com> | 2023-11-24 10:58:06 +0000 |
commit | fea27dfd227c49f1409260e814e400fce4fbe2a7 (patch) | |
tree | 6042e4035cea323a4d1bb961d5f254906e0f2b14 | |
parent | a49befbd2c783e751dc2110b544fe540eb7e33eb (diff) | |
download | gcc-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.h | 40 | ||||
-rw-r--r-- | 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 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; } |