On 11/9/21 7:29 AM, Jakub Jelinek wrote:
On Tue, Nov 09, 2021 at 01:03:38PM +0100, Richard Biener wrote:
Apparently the range_of_expr can handle some tree cases through
range_query::get_tree_range, like INTEGER_CSTs, ADDR_EXPRs,
and some binary and unary ops.
But that shouldn't need a range query object ... this was all
available pre-ranger and just got stuffed there for no good reason?
resolving the binary ops requires calls back into range_of_expr to resolve operands.  It could be split out if needed/desired.
That is for Andrew/Aldy to answer.
All I can say is that get_tree_range is a non-static member function
of range_query and therefore it needs non-NULL query object.

But I must say I wonder if all this pain is worth it, if it wouldn't
be easier to keep cfun->x_range_query NULL most of the time and use
ATTRIBUTE_RETURNS_NONNULL inline range_query *
get_range_query (const struct function *fun)
{
   return fun->x_range_query ? fun->x_range_query : &global_ranges;
}

(of course, the function then would need to be in some header
where global_ranges is declared).

        Jakub

Yeah, Im not particular about how we do this...  I think thats perfectly reasonable.   Would something like the following solve this issue?

It creates a global-range class pointer, initializes it to point to the global query, and we can simply hide its existence and refer to it directly from function.h if you thinks thats reasonable and will work OK for this.   Then we dont have any inclusion issues.

Let me know and I'll run it thru the gauntlet.

Andrew


commit 17a5b03c95549b5488bc8dd2af4f6e2cc9ddf098
Author: Andrew MacLeod <amacl...@redhat.com>
Date:   Tue Nov 9 09:29:23 2021 -0500

    Keep x_range_query NULL for global ranges.
    
    Instead of x_range_query alwasy pointing to an object, have it default to
    NULL and return a pointer to the global query in that case.
    
            * function.c (allocate_struct_function): Set x_range_query to NULL.
            * function.h (get_range_query): Return context query or global.
            * gimple-range.cc (enable_ranger): Check current query is NULL.
            (disable_ranger): Clear function current query field.
            * value_query.cc (global_range_query_ptr): New.
            * value-query.h (global_ranges): Remove.

diff --git a/gcc/function.c b/gcc/function.c
index af3d57b32a3..8768c5fcf22 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4874,7 +4874,7 @@ allocate_struct_function (tree fndecl, bool abstract_p)
   cfun->debug_nonbind_markers = lang_hooks.emits_begin_stmt
     && MAY_HAVE_DEBUG_MARKER_STMTS;
 
-  cfun->x_range_query = &global_ranges;
+  cfun->x_range_query = NULL;
 }
 
 /* This is like allocate_struct_function, but pushes a new cfun for FNDECL
diff --git a/gcc/function.h b/gcc/function.h
index 36003e7576a..3c1b2aa2b90 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -725,7 +725,9 @@ extern void used_types_insert (tree);
 ATTRIBUTE_RETURNS_NONNULL inline range_query *
 get_range_query (const struct function *fun)
 {
-  return fun->x_range_query;
+  // From value-query.h
+  extern range_query *global_range_query_ptr;
+  return fun->x_range_query ? fun->x_range_query : global_range_query_ptr;
 }
 
 extern range_query *get_global_range_query ();
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index 87dba6e81d8..a2b68b2bc80 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -467,6 +467,7 @@ enable_ranger (struct function *fun)
 {
   gimple_ranger *r;
 
+  gcc_checking_assert (!fun->x_range_query);
   r = new gimple_ranger;
   fun->x_range_query = r;
 
@@ -479,7 +480,7 @@ enable_ranger (struct function *fun)
 void
 disable_ranger (struct function *fun)
 {
+  gcc_checking_assert (fun->x_range_query);
   delete fun->x_range_query;
-
-  fun->x_range_query = &global_ranges;
+  fun->x_range_query = NULL;
 }
diff --git a/gcc/value-query.cc b/gcc/value-query.cc
index 17ebd86ce5f..8d1b27d9bfb 100644
--- a/gcc/value-query.cc
+++ b/gcc/value-query.cc
@@ -433,7 +433,9 @@ gimple_range_global (tree name)
 // ----------------------------------------------
 // global_range_query implementation.
 
+// This is utlized by function.h get_range_query() only.
 global_range_query global_ranges;
+range_query *global_range_query_ptr = &global_ranges;
 
 // Like get_range_query, but for accessing global ranges.
 
diff --git a/gcc/value-query.h b/gcc/value-query.h
index 5161d23714b..f56abc4777c 100644
--- a/gcc/value-query.h
+++ b/gcc/value-query.h
@@ -126,7 +126,6 @@ public:
   bool range_of_expr (irange &r, tree expr, gimple * = NULL) OVERRIDE;
 };
 
-extern global_range_query global_ranges;
 extern value_range gimple_range_global (tree name);
 extern bool update_global_range (irange &r, tree name);
 

Reply via email to