https://gcc.gnu.org/g:4c8b085820f057d1397d91c1ed1c20bed09eb054

commit r15-1589-g4c8b085820f057d1397d91c1ed1c20bed09eb054
Author: Andrew MacLeod <amacl...@redhat.com>
Date:   Mon Jun 24 10:29:06 2024 -0400

    Make transitive relations an oracle option
    
    This patch makes processing of transitive relations configurable at
    dom_oracle creation.
    
            * tree-vrp.cc (execute_fast_vrp): Do not use transitive relations.
            * value-query.cc (range_query::create_relation_oracle): Add
            parameter to enable transitive relations.
            * value-query.h (range_query::create_relation_oracle): Likewise.
            * value-relation.h (dom_oracle::dom_oracle): Likewise.
            * value-relation.cc (dom_oracle::dom_oracle): Likewise.
            (dom_oracle::register_transitives): Check transitive flag.

Diff:
---
 gcc/tree-vrp.cc       | 3 ++-
 gcc/value-query.cc    | 7 ++++---
 gcc/value-query.h     | 2 +-
 gcc/value-relation.cc | 6 +++++-
 gcc/value-relation.h  | 3 ++-
 5 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index 4fc33e63e7d..26979b706e5 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -1258,7 +1258,8 @@ execute_fast_vrp (struct function *fun, bool final_p)
 
   gcc_checking_assert (!fun->x_range_query);
   fun->x_range_query = &dr;
-  get_range_query (fun)->create_relation_oracle ();
+  // Create a relation oracle without transitives.
+  get_range_query (fun)->create_relation_oracle (false);
 
   folder.substitute_and_fold ();
   if (folder.m_unreachable)
diff --git a/gcc/value-query.cc b/gcc/value-query.cc
index 0a280be580b..cac2cb5b2bc 100644
--- a/gcc/value-query.cc
+++ b/gcc/value-query.cc
@@ -223,17 +223,18 @@ range_query::destroy_infer_oracle ()
 }
 
 // Create dominance based range oracle for the current query if dom info is
-// available.
+// available.  DO_TRANS_P indicates whether transitive relations should
+// be created.  This can cost more in compile time.
 
 void
-range_query::create_relation_oracle ()
+range_query::create_relation_oracle (bool do_trans_p)
 {
   gcc_checking_assert (this != &global_ranges);
   gcc_checking_assert (m_relation == &default_relation_oracle);
 
   if (!dom_info_available_p (CDI_DOMINATORS))
     return;
-  m_relation = new dom_oracle ();
+  m_relation = new dom_oracle (do_trans_p);
   gcc_checking_assert (m_relation);
 }
 
diff --git a/gcc/value-query.h b/gcc/value-query.h
index 2572a03095d..78840fd7a78 100644
--- a/gcc/value-query.h
+++ b/gcc/value-query.h
@@ -76,7 +76,7 @@ public:
   virtual bool range_on_exit (vrange &r, basic_block bb, tree expr);
 
   inline class relation_oracle &relation () const  { return *m_relation; }
-  void create_relation_oracle ();
+  void create_relation_oracle (bool do_trans_p = true);
   void destroy_relation_oracle ();
 
   inline class infer_range_oracle &infer_oracle () const { return *m_infer; }
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index d7bc1b72558..9293d9ed65b 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -978,8 +978,9 @@ relation_chain_head::find_relation (const_bitmap b1, 
const_bitmap b2) const
 
 // Instantiate a relation oracle.
 
-dom_oracle::dom_oracle ()
+dom_oracle::dom_oracle (bool do_trans_p)
 {
+  m_do_trans_p = do_trans_p;
   m_relations.create (0);
   m_relations.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
   m_relation_set = BITMAP_ALLOC (&m_bitmaps);
@@ -1179,6 +1180,9 @@ void
 dom_oracle::register_transitives (basic_block root_bb,
                                  const value_relation &relation)
 {
+  // Only register transitives if they are requested.
+  if (!m_do_trans_p)
+    return;
   basic_block bb;
   // Only apply transitives to certain kinds of operations.
   switch (relation.kind ())
diff --git a/gcc/value-relation.h b/gcc/value-relation.h
index cf009e6aa19..f168fd9ed41 100644
--- a/gcc/value-relation.h
+++ b/gcc/value-relation.h
@@ -216,7 +216,7 @@ public:
 class dom_oracle : public equiv_oracle
 {
 public:
-  dom_oracle ();
+  dom_oracle (bool do_trans_p = true);
   ~dom_oracle ();
 
   void record (basic_block bb, relation_kind k, tree op1, tree op2)
@@ -229,6 +229,7 @@ public:
   void dump (FILE *f, basic_block bb) const final override;
   void dump (FILE *f) const final override;
 private:
+  bool m_do_trans_p;
   bitmap m_tmp, m_tmp2;
   bitmap m_relation_set;  // Index by ssa-name. True if a relation exists
   vec <relation_chain_head> m_relations;  // Index by BB, list of relations.

Reply via email to