[gcc r17-3207] Segregate relation creation code.

Andrew Macleod via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:4882e4e49938fcd50c235f6422bbd989a4d633af

commit r17-3207-g4882e4e49938fcd50c235f6422bbd989a4d633af
Author: Andrew MacLeod <[email protected]>
Date:   Sun Jul 19 12:54:46 2026 -0400

    Segregate relation creation code.
    
    set_one_relation combined creating a relation record with searching for
    existing records and merging them.  This patch splits that into:
    create_relation_record_in_bb for creating records in a block, and
    search_and_merge_relation which does the serch and merge, then invokes the
    create routine if there was no merging..
    
            * value-relation.cc (dom_oracle::record): Use search_and_merge_relation.
            (dom_oracle::create_relation_in_bb): New.
            (dom_oracle::search_and_merge_relation): Rename from set_one_relation
            and extract create_relation code.
            (dom_oracle::register_transitives): Use search_and_merge_relation.
            * value-relation.h (set_one_relation): Delete.
            (create_relation_in_bb): New.
            (search_and_merge_relation): Rename from set_one_relation.

Diff:
---
 gcc/value-relation.cc | 74 ++++++++++++++++++++++++++++++++++-----------------
 gcc/value-relation.h  |  6 +++--
 2 files changed, 53 insertions(+), 27 deletions(-)

diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index e8c7a7320de4..772bbc0ca11f 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -1175,7 +1175,7 @@ dom_oracle::record (basic_block bb, relation_kind k, tree op1, tree op2)
       // there will be no transitive.
       bool check = bitmap_bit_p (m_relation_set, SSA_NAME_VERSION (op1))
 		   || bitmap_bit_p (m_relation_set, SSA_NAME_VERSION (op2));
-      relation_chain *ptr = set_one_relation (bb, k, op1, op2);
+      relation_chain *ptr = search_and_merge_relation (bb, k, op1, op2);
       if (ptr && check
 	  && (m_relations[bb->index].m_num_relations
 	      < param_relation_block_limit))
@@ -1184,22 +1184,28 @@ dom_oracle::record (basic_block bb, relation_kind k, tree op1, tree op2)
     }
 }
 
-// Register relation K between OP! and OP2 in block BB.
-// This creates the record and searches for existing records in the dominator
-// tree to merge with.  Return the record, or NULL if no record was created.
+// Register relation K between OP1 and OP2 in block BB by creating a new
+// record.  It is an error for there to be an existing record.
+// Return the record, or NULL if no record was created.
 
 relation_chain *
-dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
-			      tree op2)
+dom_oracle::create_relation_in_bb (basic_block bb, relation_kind k, tree op1,
+				   tree op2)
 {
-  gcc_checking_assert (k != VREL_VARYING && k != VREL_EQ);
-
-  value_relation vr(k, op1, op2);
   int bbi = bb->index;
 
   if (bbi >= (int)m_relations.length())
     m_relations.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
 
+  if (m_relations[bbi].m_num_relations >= param_relation_block_limit)
+    return NULL;
+  m_relations[bbi].m_num_relations++;
+  // Check for an existing relation further up the DOM chain.
+  // By including dominating relations, The first one found in any search
+  // will be the aggregate of all the previous ones.
+
+  relation_chain *ptr;
+
   // Summary bitmap indicating what ssa_names have relations in this BB.
   bitmap bm = m_relations[bbi].m_names;
   if (!bm)
@@ -1207,6 +1213,36 @@ dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
   unsigned v1 = SSA_NAME_VERSION (op1);
   unsigned v2 = SSA_NAME_VERSION (op2);
 
+  gcc_checking_assert (find_relation_block (bbi, v1, v2, &ptr) == VREL_VARYING);
+
+  bitmap_set_bit (bm, v1);
+  bitmap_set_bit (bm, v2);
+  bitmap_set_bit (m_relation_set, v1);
+  bitmap_set_bit (m_relation_set, v2);
+
+  ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,
+					  sizeof (relation_chain));
+  ptr->set_relation (k, op1, op2);
+  ptr->m_next = m_relations[bbi].m_head;
+  m_relations[bbi].m_head = ptr;
+  return ptr;
+}
+
+// Register relation K between OP1 and OP2 in block BB by searching the
+// dominator tree for any existing record to merge with.  If there were
+// none, create a new record.
+// Return the record, or NULL if no record was found or created.
+
+relation_chain *
+dom_oracle::search_and_merge_relation (basic_block bb, relation_kind k,
+				       tree op1, tree op2)
+{
+  gcc_checking_assert (k != VREL_VARYING && k != VREL_EQ);
+
+  int bbi = bb->index;
+
+  unsigned v1 = SSA_NAME_VERSION (op1);
+  unsigned v2 = SSA_NAME_VERSION (op2);
   relation_kind curr;
   relation_chain *ptr;
   curr = find_relation_block (bbi, v1, v2, &ptr);
@@ -1216,14 +1252,12 @@ dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
       // Check into whether we can simply replace the relation rather than
       // intersecting it.  This may help with some optimistic iterative
       // updating algorithms.  If there was no change, return no record..
+      value_relation vr (k, op1, op2);
       if (!ptr->intersect (vr))
 	return NULL;
     }
   else
     {
-      if (m_relations[bbi].m_num_relations >= param_relation_block_limit)
-	return NULL;
-      m_relations[bbi].m_num_relations++;
       // Check for an existing relation further up the DOM chain.
       // By including dominating relations, The first one found in any search
       // will be the aggregate of all the previous ones.
@@ -1231,17 +1265,7 @@ dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
 				v1, v2);
       if (curr != VREL_VARYING)
 	k = relation_intersect (curr, k);
-
-      bitmap_set_bit (bm, v1);
-      bitmap_set_bit (bm, v2);
-      bitmap_set_bit (m_relation_set, v1);
-      bitmap_set_bit (m_relation_set, v2);
-
-      ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,
-					      sizeof (relation_chain));
-      ptr->set_relation (k, op1, op2);
-      ptr->m_next = m_relations[bbi].m_head;
-      m_relations[bbi].m_head = ptr;
+      ptr = create_relation_in_bb (bb, k, op1, op2);
     }
   return ptr;
 }
@@ -1340,8 +1364,8 @@ dom_oracle::register_transitives (basic_block root_bb,
 		  // further processing is already reflected above it.
 		  // When we ran into the limit of relations on root_bb
 		  // we can give up as well.
-		  if (!set_one_relation (root_bb, nr.kind (),
-					 nr.op1 (), nr.op2 ()))
+		  if (!search_and_merge_relation (root_bb, nr.kind (),
+						  nr.op1 (), nr.op2 ()))
 		    return;
 		  if (dump_file && (dump_flags & TDF_DETAILS))
 		    {
diff --git a/gcc/value-relation.h b/gcc/value-relation.h
index 598d601344fa..4693b7cc0c46 100644
--- a/gcc/value-relation.h
+++ b/gcc/value-relation.h
@@ -248,8 +248,10 @@ protected:
   relation_kind find_relation_block (int bb, unsigned v1, unsigned v2,
 				     relation_chain **obj = NULL) const;
   relation_kind find_relation_dom (basic_block bb, unsigned v1, unsigned v2) const;
-  relation_chain *set_one_relation (basic_block bb, relation_kind k, tree op1,
-				    tree op2);
+  relation_chain *create_relation_in_bb (basic_block bb, relation_kind k,
+					 tree op1, tree op2);
+  relation_chain *search_and_merge_relation (basic_block bb, relation_kind k,
+					     tree op1, tree op2);
   void register_transitives (basic_block, const class value_relation &);
   relation_kind recomputed_relation (basic_block, edge, tree, tree) const;
 };
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.