Line data Source code
1 : /* Gimple range edge header file.
2 : Copyright (C) 2020-2026 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
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 GIMPLE_RANGE_EDGE_H
23 : #define GIMPLE_RANGE_EDGE_H
24 :
25 : // This class is used to query ranges on constant edges in GIMPLE.
26 : //
27 : // For a COND_EXPR, the TRUE edge will return [1,1] and the false edge a [0,0].
28 : //
29 : // For SWITCH_EXPR, it is awkward to calculate ranges. When a request
30 : // is made, the entire switch is evaluated and the results cached.
31 : // Any future requests to that switch will use the cached value, providing
32 : // dramatic decrease in computation time.
33 : //
34 : // The API is simple, just ask for the range on the edge.
35 : // The return value is NULL for no range, or the branch statement which the
36 : // edge gets the range from, along with the range.
37 : //
38 : // THe switch_limit is the number of switch edges beyond which the switch
39 : // is ignored (ie, edge_range_p () will return NULL as if the sitch was not
40 : // there. THis value can be adjusted any time via set_switch_limit ().
41 : // THe default is 0, no switches are precoessed until set_switch_limit () is
42 : // called, and then the default is INT_MAX.
43 : //
44 : // No memory is allocated until an edge for a switch is processed which also
45 : // falls under the edge limit criteria.
46 :
47 : class gimple_outgoing_range
48 : {
49 : public:
50 : gimple_outgoing_range (int max_sw_edges = 0);
51 : virtual ~gimple_outgoing_range ();
52 : gimple *edge_range_p (irange &r, edge e);
53 : void set_switch_limit (int max_sw_edges = INT_MAX);
54 :
55 0 : virtual bool edge_range_p (vrange &, edge, tree, range_query &)
56 0 : { return false; }
57 0 : virtual bool has_edge_range_p (tree, basic_block = NULL) { return false; }
58 0 : virtual bool has_edge_range_p (tree, edge ) { return false; }
59 0 : virtual void dump (FILE *) { }
60 0 : virtual bool compute_operand_range (vrange &, gimple *, const vrange &, tree,
61 : class fur_source &,
62 : class value_relation * = NULL)
63 0 : { return false; }
64 : private:
65 : void calc_switch_ranges (gswitch *sw);
66 : bool switch_edge_range (irange &r, gswitch *sw, edge e);
67 :
68 : int m_max_edges;
69 : hash_map<edge, vrange_storage *> *m_edge_table;
70 : class vrange_allocator *m_range_allocator;
71 : };
72 :
73 : // If there is a range control statement at the end of block BB, return it.
74 : gimple *gimple_outgoing_range_stmt_p (basic_block bb);
75 : // Return the range on edge E if it is from a GCOND. Either TRUE or FALSE.
76 : void gcond_edge_range (irange &r, edge e);
77 :
78 : #endif // GIMPLE_RANGE_EDGE_H
|