On Tue, Nov 09, 2021 at 09:41:08AM -0500, Andrew MacLeod wrote: > Yeah, Im not particular about how we do this... I think thats perfectly > reasonable. Would something like the following solve this issue?
Yes, but see below. > 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 isn't needed, at the start of function we do cfun = ggc_cleared_alloc<function> (); which already zero initializes the whole structure, including x_range_query. So instead this can be removed. > --- 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; Wouldn't it be better to do: extern range_query global_ranges; return fun->x_range_query ? fun->x_range_query : &global_ranges; I think declaring a variable extern can be done with incomplete type and &var is cheaper than ptr, because for the latter you need to read the pointer value from memory, while for &var you can just compute the address of the var which you need to compute for reading ptr from memory too. Jakub