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

Reply via email to