This patch adds a new cost function so that the targets can decide if the
store/load reordering will be profitable. It also adds the
`asf-default-cost-value` parameter, which is used as the default return
value for the cost function.

gcc/ChangeLog:

        * doc/tm.texi: Regenerate.
        * doc/tm.texi.in: Document new target hook.
        * params.opt: New parameter.
        * target.def: New DEFHOOK.
        * targhooks.cc (default_avoid_store_forwarding_reorder_cost_p):
        New function.
        * targhooks.h (default_avoid_store_forwarding_reorder_cost_p):
        New function declaration.

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

(no changes since v1)

 gcc/doc/tm.texi    | 7 +++++++
 gcc/doc/tm.texi.in | 2 ++
 gcc/params.opt     | 4 ++++
 gcc/target.def     | 9 +++++++++
 gcc/targhooks.cc   | 9 +++++++++
 gcc/targhooks.h    | 5 +++++
 6 files changed, 36 insertions(+)

diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index fd208f53844a..aef552aac5f8 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -7466,6 +7466,13 @@ needed, the sequence cost and additional relevant 
information is given in
 the arguments so that the target can make an informed decision.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_AVOID_STORE_FORWARDING_REORDER_COST_P 
(machine_mode, @var{machine_mode}, @var{HOST_WIDE_INT})
+This hook decides if it's profitable for the target to rearrange a store
+and a load instruction to avoid a potential store forwarding stall.
+The store and load modes and the byte offset of the store within the
+load are given as arguments.
+@end deftypefn
+
 @node Scheduling
 @section Adjusting the Instruction Scheduler
 
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 14315dd50805..0c3168cb6dde 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -4781,6 +4781,8 @@ Define this macro if a non-short-circuit operation 
produced by
 
 @hook TARGET_AVOID_STORE_FORWARDING_P
 
+@hook TARGET_AVOID_STORE_FORWARDING_REORDER_COST_P
+
 @node Scheduling
 @section Adjusting the Instruction Scheduler
 
diff --git a/gcc/params.opt b/gcc/params.opt
index f8884e976e7f..96720651731d 100644
--- a/gcc/params.opt
+++ b/gcc/params.opt
@@ -1091,6 +1091,10 @@ Maximum size of a single store merging region in bytes.
 Common Joined UInteger Var(param_store_forwarding_max_distance) Init(10) 
IntegerRange(0, 1000) Param Optimization
 Maximum number of instruction distance that a small store forwarded to a 
larger load may stall. Value '0' disables the cost checks for the 
avoid-store-forwarding pass.
 
+-param=asf-default-cost-value=
+Common Joined UInteger Var(param_asf_default_cost_value) Init(0) 
IntegerRange(0, 1) Param Optimization
+Default return value for the avoid_store_forwarding_reorder_cost_p function.
+
 -param=switch-conversion-max-branch-ratio=
 Common Joined UInteger Var(param_switch_conversion_branch_ratio) Init(8) 
IntegerRange(1, 65536) Param Optimization
 The maximum ratio between array size and switch branches for a switch 
conversion to take place.
diff --git a/gcc/target.def b/gcc/target.def
index f288329ffcab..d60510e5458e 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -7158,6 +7158,15 @@ the arguments so that the target can make an informed 
decision.",
  bool, (vec<store_fwd_info>, rtx, int, bool),
  default_avoid_store_forwarding_p)
 
+DEFHOOK
+(avoid_store_forwarding_reorder_cost_p,
+ "This hook decides if it's profitable for the target to rearrange a store\n\
+and a load instruction to avoid a potential store forwarding stall.\n\
+The store and load modes and the byte offset of the store within the\n\
+load are given as arguments.",
+ bool, (machine_mode, machine_mode, HOST_WIDE_INT),
+ default_avoid_store_forwarding_reorder_cost_p)
+
 /* Determine the type of unwind info to emit for debugging.  */
 DEFHOOK
 (debug_unwind_info,
diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc
index 1873d572ba3f..15d882f4703e 100644
--- a/gcc/targhooks.cc
+++ b/gcc/targhooks.cc
@@ -2352,6 +2352,15 @@ default_avoid_store_forwarding_p (vec<store_fwd_info>, 
rtx, int total_cost,
   return true;
 }
 
+/* The default implementation of TARGET_AVOID_STORE_FORWARDING_COST_P.  */
+
+bool
+default_avoid_store_forwarding_reorder_cost_p (machine_mode, machine_mode,
+                                              HOST_WIDE_INT)
+{
+  return param_asf_default_cost_value;
+}
+
 /* Determine the debugging unwind mechanism for the target.  */
 
 enum unwind_info_type
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index 92e7a4cb10f1..5389ea1cb78b 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -264,6 +264,11 @@ extern unsigned char default_class_max_nregs (reg_class_t, 
machine_mode);
 extern bool default_avoid_store_forwarding_p (vec<store_fwd_info>, rtx, int,
                                              bool);
 
+extern bool
+default_avoid_store_forwarding_reorder_cost_p (machine_mode store_mode,
+                                              machine_mode load_mode,
+                                              HOST_WIDE_INT offset);
+
 extern enum unwind_info_type default_debug_unwind_info (void);
 
 extern void default_canonicalize_comparison (int *, rtx *, rtx *, bool);
-- 
2.50.1

Reply via email to