LCOV - code coverage report
Current view: top level - gcc - gimple-range.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 1 1
Test Date: 2024-04-20 14:03:02 Functions: - 0 0
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Header file for the GIMPLE range interface.
       2                 :             :    Copyright (C) 2019-2024 Free Software Foundation, Inc.
       3                 :             :    Contributed by Andrew MacLeod <amacleod@redhat.com>
       4                 :             :    and Aldy Hernandez <aldyh@redhat.com>.
       5                 :             : 
       6                 :             : This file is part of GCC.
       7                 :             : 
       8                 :             : GCC is free software; you can redistribute it and/or modify it under
       9                 :             : the terms of the GNU General Public License as published by the Free
      10                 :             : Software Foundation; either version 3, or (at your option) any later
      11                 :             : version.
      12                 :             : 
      13                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      14                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      15                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      16                 :             :  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_GIMPLE_RANGE_H
      23                 :             : #define GCC_GIMPLE_RANGE_H
      24                 :             : 
      25                 :             : #include "ssa.h"
      26                 :             : #include "range.h"
      27                 :             : #include "value-query.h"
      28                 :             : #include "gimple-range-op.h"
      29                 :             : #include "gimple-range-trace.h"
      30                 :             : #include "gimple-range-edge.h"
      31                 :             : #include "gimple-range-fold.h"
      32                 :             : #include "gimple-range-gori.h"
      33                 :             : #include "gimple-range-cache.h"
      34                 :             : 
      35                 :             : // This is the basic range generator interface.
      36                 :             : //
      37                 :             : // This base class provides all the API entry points, but only provides
      38                 :             : // functionality at the statement level.  Ie, it can calculate ranges on
      39                 :             : // statements, but does no additional lookup.
      40                 :             : //
      41                 :             : // All the range_of_* methods will return a range if the types is
      42                 :             : // supported by the range engine.  It may be the full range for the
      43                 :             : // type, AKA varying_p or it may be a refined range.  If the range
      44                 :             : // type is not supported, then false is returned.  Non-statement
      45                 :             : // related methods return whatever the current global value is.
      46                 :             : 
      47                 :             : class gimple_ranger : public range_query
      48                 :             : {
      49                 :             : public:
      50                 :             :   gimple_ranger (bool use_imm_uses = true);
      51                 :             :   ~gimple_ranger ();
      52                 :             :   virtual bool range_of_stmt (vrange &r, gimple *, tree name = NULL) override;
      53                 :             :   virtual bool range_of_expr (vrange &r, tree name, gimple * = NULL) override;
      54                 :             :   virtual bool range_on_edge (vrange &r, edge e, tree name) override;
      55                 :             :   void range_on_entry (vrange &r, basic_block bb, tree name);
      56                 :             :   void range_on_exit (vrange &r, basic_block bb, tree name);
      57                 :             :   void export_global_ranges ();
      58                 :   256959374 :   inline gori_compute &gori ()  { return m_cache.m_gori; }
      59                 :             :   virtual void dump (FILE *f) override;
      60                 :             :   void debug ();
      61                 :             :   void dump_bb (FILE *f, basic_block bb);
      62                 :             :   auto_edge_flag non_executable_edge_flag;
      63                 :             :   bool fold_stmt (gimple_stmt_iterator *gsi, tree (*) (tree));
      64                 :             :   void register_inferred_ranges (gimple *s);
      65                 :             :   void register_transitive_inferred_ranges (basic_block bb);
      66                 :             :   range_query &const_query ();
      67                 :             : protected:
      68                 :             :   bool fold_range_internal (vrange &r, gimple *s, tree name);
      69                 :             :   void prefill_name (vrange &r, tree name);
      70                 :             :   void prefill_stmt_dependencies (tree ssa);
      71                 :             :   ranger_cache m_cache;
      72                 :             :   range_tracer tracer;
      73                 :             :   basic_block current_bb;
      74                 :             :   vec<tree> m_stmt_list;
      75                 :             :   friend class path_range_query;
      76                 :             : };
      77                 :             : 
      78                 :             : /* Create a new ranger instance and associate it with a function.
      79                 :             :    Each call must be paired with a call to disable_ranger to release
      80                 :             :    resources.  If USE_IMM_USES is true, pre-calculate side effects like
      81                 :             :    non-null uses as required using the immediate use chains.  */
      82                 :             : extern gimple_ranger *enable_ranger (struct function *m,
      83                 :             :                                      bool use_imm_uses = true);
      84                 :             : extern void disable_ranger (struct function *);
      85                 :             : 
      86                 :             : class assume_query : public range_query
      87                 :             : {
      88                 :             : public:
      89                 :             :   assume_query ();
      90                 :             :   bool assume_range_p (vrange &r, tree name);
      91                 :             :   virtual bool range_of_expr (vrange &r, tree expr, gimple * = NULL);
      92                 :             :   void dump (FILE *f);
      93                 :             : protected:
      94                 :             :   void calculate_stmt (gimple *s, vrange &lhs_range, fur_source &src);
      95                 :             :   void calculate_op (tree op, gimple *s, vrange &lhs, fur_source &src);
      96                 :             :   void calculate_phi (gphi *phi, vrange &lhs_range, fur_source &src);
      97                 :             :   void check_taken_edge (edge e, fur_source &src);
      98                 :             : 
      99                 :             :   ssa_lazy_cache global;
     100                 :             :   gori_compute m_gori;
     101                 :             : };
     102                 :             : 
     103                 :             : // DOM based ranger for fast VRP.
     104                 :             : // This must be processed in DOM order, and does only basic range operations.
     105                 :             : 
     106                 :             : class dom_ranger : public range_query
     107                 :             : {
     108                 :             : public:
     109                 :             :   dom_ranger ();
     110                 :             :   ~dom_ranger ();
     111                 :             : 
     112                 :             :   virtual bool range_of_expr (vrange &r, tree expr, gimple *s = NULL) override;
     113                 :             :   virtual bool range_on_edge (vrange &r, edge e, tree expr) override;
     114                 :             :   virtual bool range_of_stmt (vrange &r, gimple *s, tree name = NULL) override;
     115                 :             : 
     116                 :             :   bool edge_range (vrange &r, edge e, tree name);
     117                 :             :   void range_in_bb (vrange &r, basic_block bb, tree name);
     118                 :             : 
     119                 :             :   void pre_bb (basic_block bb);
     120                 :             :   void post_bb (basic_block bb);
     121                 :             : protected:
     122                 :             :   DISABLE_COPY_AND_ASSIGN (dom_ranger);
     123                 :             :   void maybe_push_edge (edge e, bool edge_0);
     124                 :             :   ssa_cache m_global;
     125                 :             :   gimple_outgoing_range m_out;
     126                 :             :   vec<ssa_lazy_cache *> m_freelist;
     127                 :             :   vec<ssa_lazy_cache *> m_e0;
     128                 :             :   vec<ssa_lazy_cache *> m_e1;
     129                 :             :   bitmap m_pop_list;
     130                 :             :   range_tracer tracer;
     131                 :             : };
     132                 :             : #endif // GCC_GIMPLE_RANGE_H
        

Generated by: LCOV version 2.1-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.