Hello All:

This patch add heuristics for code sinking opportunities.
Bootstrapped and regtested for powerpc64-linux-gnu.

Thanks & Regards
Ajit

        tree-ssa-sink: Add heuristics for code sinking.

        Add following code sinking heuristics:

        1. from code block dominates the call.
        2. To Code block have uses inside the function call.
        3. Loop headers.
        4. Sinking from code block after call increases register
        pressure.
        5. Sinking calls.

        2023-04-14  Ajit Kumar Agarwal  <aagar...@linux.ibm.com>

gcc/ChangeLog:

        * tree-ssa-sink.cc (statement_sink_location): Add heuristics
        for code sinking.
---
 gcc/tree-ssa-sink.cc | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/gcc/tree-ssa-sink.cc b/gcc/tree-ssa-sink.cc
index 87b1d40c174..8de88b259a3 100644
--- a/gcc/tree-ssa-sink.cc
+++ b/gcc/tree-ssa-sink.cc
@@ -465,6 +465,39 @@ statement_sink_location (gimple *stmt, basic_block frombb,
          if (sinkbb == frombb)
            return false;
 
+         auto_vec<basic_block> h;
+         h = get_all_dominated_blocks (CDI_DOMINATORS,
+                                       frombb);
+         bool is_call = false;
+         while (h.length ())
+           {
+             basic_block bb = h.pop ();
+
+             if (bb == frombb)
+               continue;
+
+             for (gimple_stmt_iterator gsi = gsi_last_bb (bb); !gsi_end_p 
(gsi);)
+               {
+                 gimple *stmt = gsi_stmt (gsi);
+
+                 if (is_gimple_call (stmt))
+                   {
+                     is_call = true;
+                     break;
+                   }
+
+                  if (!gsi_end_p (gsi))
+                    gsi_prev (&gsi);
+               }
+            }
+
+           if (!is_gimple_call (stmt)
+               && (gimple_bb (use) != frombb)
+               && !is_gimple_call (use)
+               && dominated_by_p (CDI_DOMINATORS, sinkbb, frombb)
+               && is_call)
+              return false;
+
          if (sinkbb == gimple_bb (use))
            *togsi = gsi_for_stmt (use);
          else
-- 
2.31.1

Reply via email to