LCOV - code coverage report
Current view: top level - gcc - value-query.h Coverage Total Hit
Test: gcc.info Lines: 100.0 % 8 8
Test Date: 2026-02-28 14:20:25 Functions: - 0 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Support routines for value queries.
       2              :    Copyright (C) 2020-2026 Free Software Foundation, Inc.
       3              :    Contributed by Aldy Hernandez <aldyh@redhat.com> and
       4              :    Andrew Macleod <amacleod@redhat.com>.
       5              : 
       6              : This file is part of GCC.
       7              : 
       8              : GCC is free software; you can redistribute it and/or modify
       9              : it under the terms of the GNU General Public License as published by
      10              : the Free Software Foundation; either version 3, or (at your option)
      11              : any later version.
      12              : 
      13              : GCC is distributed in the hope that it will be useful,
      14              : but WITHOUT ANY WARRANTY; without even the implied warranty of
      15              : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16              : GNU General Public License for more details.
      17              : 
      18              : You should have received a copy of the GNU General Public License
      19              : along with GCC; see the file COPYING3.  If not see
      20              : <http://www.gnu.org/licenses/>.  */
      21              : 
      22              : #ifndef GCC_QUERY_H
      23              : #define GCC_QUERY_H
      24              : 
      25              : #include "value-relation.h"
      26              : 
      27              : // The value_query class is used by optimization passes that require
      28              : // valueizing SSA names in terms of a tree value, but have no need
      29              : // for ranges.
      30              : //
      31              : // value_of_expr must be provided.  The default for value_on_edge and
      32              : // value_of_stmt is to call value_of_expr.
      33              : //
      34              : // This implies the valuation is global in nature.  If a pass can make
      35              : // use of more specific information, it can override the other queries.
      36              : //
      37              : // Proper usage of the correct query in passes will enable other
      38              : // valuation mechanisms to produce more precise results.
      39              : 
      40              : // The range_query class is used by optimization passes which are
      41              : // range aware.
      42              : //
      43              : // range_of_expr must be provided.  The default for range_on_edge and
      44              : // range_of_stmt is to call range_of_expr.  If a pass can make use of
      45              : // more specific information, then it can override the other queries.
      46              : //
      47              : // The default for the value_* routines is to call the equivalent
      48              : // range_* routines, check if the range is a singleton, and return it
      49              : // if so.
      50              : //
      51              : // The get_value_range method is currently provided for compatibility
      52              : // with vr-values.  It will be deprecated when possible.
      53              : 
      54              : class range_query
      55              : {
      56              : public:
      57              :   range_query ();
      58              :   virtual ~range_query ();
      59              : 
      60              :   virtual tree value_of_expr (tree expr, gimple * = NULL);
      61              :   virtual tree value_on_edge (edge, tree expr);
      62              :   virtual tree value_of_stmt (gimple *, tree name = NULL);
      63              :   virtual tree value_on_entry (basic_block, tree expr);
      64              :   virtual tree value_on_exit (basic_block, tree expr);
      65              : 
      66              :   // These are the range equivalents of the value_* methods.  Instead
      67              :   // of returning a singleton, they calculate a range and return it in
      68              :   // R.  TRUE is returned on success or FALSE if no range was found.
      69              :   //
      70              :   // Note that range_of_expr must always return TRUE unless ranges are
      71              :   // unsupported for EXPR's type (supports_type_p is false).
      72              :   virtual bool range_of_expr (vrange &r, tree expr, gimple * = NULL) = 0;
      73              :   virtual bool range_on_edge (vrange &r, edge, tree expr);
      74              :   virtual bool range_of_stmt (vrange &r, gimple *, tree name = NULL);
      75              :   virtual bool range_on_entry (vrange &r, basic_block bb, tree expr);
      76              :   virtual bool range_on_exit (vrange &r, basic_block bb, tree expr);
      77              : 
      78              :   virtual void update_range_info (tree name, const vrange &r);
      79              : 
      80    267355495 :   inline class relation_oracle &relation () const  { return *m_relation; }
      81              :   void create_relation_oracle (bool do_trans_p = true);
      82              :   void destroy_relation_oracle ();
      83              : 
      84    687789109 :   inline class infer_range_oracle &infer_oracle () const { return *m_infer; }
      85              :   void create_infer_oracle (range_query *q = NULL, bool do_search = true);
      86              :   void destroy_infer_oracle ();
      87              : 
      88   1280522659 :   inline class gimple_outgoing_range &gori () const { return *m_gori; }
      89    999849390 :   inline class gori_map *gori_ssa () const { return m_map; }
      90              :   void create_gori (int not_executable_flag = 0, int sw_max_edges = INT_MAX);
      91              :   void destroy_gori ();
      92              : 
      93              :   virtual void dump (FILE *);
      94              : 
      95              : protected:
      96              :   bool get_tree_range (vrange &v, tree expr, gimple *stmt,
      97              :                        basic_block bbentry = NULL, basic_block bbexit = NULL,
      98              :                        edge e = NULL);
      99              :   bool invoke_range_of_expr (vrange &v, tree expr, gimple *stmt,
     100              :                              basic_block bbentry, basic_block bbexit, edge e);
     101              :   bool get_arith_expr_range (vrange &r, tree expr, gimple *stmt);
     102              :   relation_oracle *m_relation;
     103              :   infer_range_oracle *m_infer;
     104              :   gimple_outgoing_range *m_gori;
     105              :   gori_map *m_map;
     106              :   // When multiple related range queries wish to share oracles.
     107              :   // This is an internal interface
     108              :   void share_query (range_query &q);
     109              :   bool m_shared_copy_p;
     110              : };
     111              : 
     112              : // Global ranges for SSA names using SSA_NAME_RANGE_INFO.
     113              : 
     114              : class global_range_query : public range_query
     115              : {
     116              : public:
     117              :   bool range_of_expr (vrange &r, tree expr, gimple * = NULL) override;
     118              : };
     119              : 
     120              : extern global_range_query global_ranges;
     121              : 
     122              : inline range_query *
     123    110974394 : get_global_range_query ()
     124              : {
     125    110974394 :   return &global_ranges;
     126              : }
     127              : 
     128              : /* Returns the currently active range access class.  When there is no active
     129              :    range class, global ranges are used.  Never returns null.  */
     130              : 
     131              : ATTRIBUTE_RETURNS_NONNULL inline range_query *
     132    348957448 : get_range_query (const struct function *fun)
     133              : {
     134    348957448 :   return (fun && fun->x_range_query) ? fun->x_range_query : &global_ranges;
     135              : }
     136              : 
     137              : // Query the global range of NAME in function F.  Default to cfun.
     138              : extern void gimple_range_global (vrange &v, tree name,
     139              :                                  struct function *f = cfun);
     140              : #endif // GCC_QUERY_H
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.