On 2025-11-12 11:26, Konstantinos Eleftheriou wrote:
This patch checks for the reordering cost on the target, for each store,
using `avoid_store_forwarding_reorder_cost_p` before applying the
transformation.

It, also, updates the x86_64 testcases to set `asf-default-cost-value=1`,
in order for the transformations to be applied.

gcc/ChangeLog:

        * avoid-store-forwarding.cc (process_store_forwarding):
        Call `avoid_store_forwarding_reorder_cost_p` for each store
        instruction in the store-load sequence.

gcc/testsuite/ChangeLog:

        * gcc.target/x86_64/abi/callabi/avoid-store-forwarding-1.c:
        Add --param asf-default-cost-value=1.
* gcc.target/x86_64/abi/callabi/avoid-store-forwarding-2.c: Likewise.

Signed-off-by: Konstantinos Eleftheriou <[email protected]>
---

(no changes since v1)

 gcc/avoid-store-forwarding.cc                    | 16 ++++++++++++++--
 .../abi/callabi/avoid-store-forwarding-1.c       |  2 +-
 .../abi/callabi/avoid-store-forwarding-2.c       |  2 +-
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc
index 78ed736e0a3e..c940b4ad98de 100644
--- a/gcc/avoid-store-forwarding.cc
+++ b/gcc/avoid-store-forwarding.cc
@@ -264,6 +264,17 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn, /* Check if we can emit bit insert instructions for all forwarded stores. */
   FOR_EACH_VEC_ELT (stores, i, it)
     {
+ /* First check if it's profitable for the target to rearrange the store.
+        If it's not, we can't continue with the tranformation.  */
+      if (!targetm.avoid_store_forwarding_reorder_cost_p (
+         GET_MODE (it->store_mem), load_mem_mode, it->offset))
+       {
+         if (dump_file)
+           fprintf (dump_file, "Not transformed due to target decision on "
+                               "the store/load reordering.\n");
+         return false;
+       }
+


This means the command line option cannot override the cost function? That will make it unusable for testing for everything but aarch64.


Later when there are more sophisticated cost functions you would likely need a tristate: force off, force on and conditional. Would be better to redesign the option now for this.


       it->mov_reg = gen_reg_rtx (GET_MODE (it->store_mem));
       rtx_insn *insns = NULL;

@@ -351,12 +362,13 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn,
     total_cost -= insn_cost (load_insn, true);

/* Let the target decide if transforming this store forwarding instance is
-     profitable.  */
+ profitable based on the cost of the newly generated instructions. */
   if (!targetm.avoid_store_forwarding_p (stores, load_mem, total_cost,
                                         load_elim))
     {
       if (dump_file)
-       fprintf (dump_file, "Not transformed due to target decision.\n");
+       fprintf (dump_file, "Not transformed due to target decision on the "
+                           "cost of the generated instructions.\n");

       return false;
     }
diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-1.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-1.c
index d94bcf136ace..8005d210b5f7 100644
--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-1.c +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -favoid-store-forwarding" } */
+/* { dg-options "-O2 -favoid-store-forwarding --param asf-default-cost-value=1" } */

 typedef union {
     char arr_8[8];
diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-2.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-2.c
index b958612173bd..36c88e27c20f 100644
--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-2.c +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/avoid-store-forwarding-2.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -favoid-store-forwarding -fdump-rtl-avoid_store_forwarding" } */ +/* { dg-options "-O2 -favoid-store-forwarding -fdump-rtl-avoid_store_forwarding --param asf-default-cost-value=1" } */

 typedef union {
     char arr_8[8];

Reply via email to