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
|