public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-3717] Make each def a new equivalency record.
@ 2021-09-20 21:59 Andrew Macleod
  0 siblings, 0 replies; only message in thread
From: Andrew Macleod @ 2021-09-20 21:59 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:5d110fe90afcd850ea21aee6429f22edd6b1b592

commit r12-3717-g5d110fe90afcd850ea21aee6429f22edd6b1b592
Author: Andrew MacLeod <amacleod@redhat.com>
Date:   Fri Sep 17 14:58:06 2021 -0400

    Make each def a new equivalency record.
    
    Create a new equivalency set at each def point killing any equivalencies
    coming into the block from back edges.  Do not add equivalences for PHI
    arguments defined in this block.
    
            * value-relation.cc (equiv_oracle::register_initial_def): New.
            (equiv_oracle::register_relation): Call register_initial_def.
            (equiv_oracle::add_equiv_to_block): New.  Split register_relation.
            (relation_oracle::register_stmt): Check def block of PHI arguments.
            * value-relation.h (equiv_oracle): Add new prototypes.

Diff:
---
 gcc/value-relation.cc | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++
 gcc/value-relation.h  |  3 ++-
 2 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index d370f93d128..ac5f3f9afc0 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -407,6 +407,24 @@ equiv_oracle::register_equiv (basic_block bb, equiv_chain *equiv_1,
   return b;
 }
 
+// Create an equivalency set containing only SSA in its definition block.
+// This is done the first time SSA is registered in an equivalency and blocks
+// any DOM searches past the definition.
+
+void
+equiv_oracle::register_initial_def (tree ssa)
+{
+  if (SSA_NAME_IS_DEFAULT_DEF (ssa))
+    return;
+  basic_block bb = gimple_bb (SSA_NAME_DEF_STMT (ssa));
+  gcc_checking_assert (bb && !find_equiv_dom (ssa, bb));
+
+  unsigned v = SSA_NAME_VERSION (ssa);
+  bitmap_set_bit (m_equiv_set, v);
+  bitmap equiv_set = BITMAP_ALLOC (&m_bitmaps);
+  bitmap_set_bit (equiv_set, v);
+  add_equiv_to_block (bb, equiv_set);
+}
 
 // Register an equivalence between SSA1 and SSA2 in block BB.
 // The equivalence oracle maintains a vector of equivalencies indexed by basic
@@ -425,6 +443,14 @@ equiv_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
 
   unsigned v1 = SSA_NAME_VERSION (ssa1);
   unsigned v2 = SSA_NAME_VERSION (ssa2);
+
+  // If this is the first time an ssa_name has an equivalency registered
+  // create a self-equivalency record in the def block.
+  if (!bitmap_bit_p (m_equiv_set, v1))
+    register_initial_def (ssa1);
+  if (!bitmap_bit_p (m_equiv_set, v2))
+    register_initial_def (ssa2);
+
   equiv_chain *equiv_1 = find_equiv_dom (ssa1, bb);
   equiv_chain *equiv_2 = find_equiv_dom (ssa2, bb);
 
@@ -456,6 +482,15 @@ equiv_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
   if (!equiv_set)
     return;
 
+  add_equiv_to_block (bb, equiv_set);
+}
+
+// Add an equivalency record in block BB containing bitmap EQUIV_SET.
+// Note the internal caller is responible for allocating EQUIV_SET properly.
+
+void
+equiv_oracle::add_equiv_to_block (basic_block bb, bitmap equiv_set)
+{
   equiv_chain *ptr;
 
   // Check if this is the first time a block has an equivalence added.
@@ -786,6 +821,28 @@ relation_oracle::register_stmt (gimple *stmt, relation_kind k, tree op1,
       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
     }
 
+  // If an equivalence is being added between a PHI and one of its arguments
+  // make sure that that argument is not defined in the same block.
+  // This can happen along back edges and the equivalence will not be
+  // applicable as it would require a use before def.
+  if (k == EQ_EXPR && is_a<gphi *> (stmt))
+    {
+      tree phi_def = gimple_phi_result (stmt);
+      gcc_checking_assert (phi_def == op1 || phi_def == op2);
+      tree arg = op2;
+      if (phi_def == op2)
+	arg = op1;
+      if (gimple_bb (stmt) == gimple_bb (SSA_NAME_DEF_STMT (arg)))
+	{
+	  if (dump_file && (dump_flags & TDF_DETAILS))
+	    {
+	      fprintf (dump_file, "  Not registered due to ");
+	      print_generic_expr (dump_file, arg, TDF_SLIM);
+	      fprintf (dump_file, " being defined in the same block.\n");
+	    }
+	  return;
+	}
+    }
   register_relation (gimple_bb (stmt), k, op1, op2);
 }
 
diff --git a/gcc/value-relation.h b/gcc/value-relation.h
index 574fdc9efe8..53cefbfa7dc 100644
--- a/gcc/value-relation.h
+++ b/gcc/value-relation.h
@@ -146,7 +146,8 @@ private:
   bitmap register_equiv (basic_block bb, unsigned v, equiv_chain *equiv_1);
   bitmap register_equiv (basic_block bb, equiv_chain *equiv_1,
 			 equiv_chain *equiv_2);
-
+  void register_initial_def (tree ssa);
+  void add_equiv_to_block (basic_block bb, bitmap equiv);
 };
 
 // Summary block header for relations.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-09-20 21:59 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-20 21:59 [gcc r12-3717] Make each def a new equivalency record Andrew Macleod

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).