Branch data Line data Source code
1 : : /* Gimple range edge header file.
2 : : Copyright (C) 2020-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
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
|