131
|
1 /* Support routines for Value Range Propagation (VRP).
|
145
|
2 Copyright (C) 2016-2020 Free Software Foundation, Inc.
|
131
|
3
|
|
4 This file is part of GCC.
|
|
5
|
|
6 GCC is free software; you can redistribute it and/or modify
|
|
7 it under the terms of the GNU General Public License as published by
|
|
8 the Free Software Foundation; either version 3, or (at your option)
|
|
9 any later version.
|
|
10
|
|
11 GCC is distributed in the hope that it will be useful,
|
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14 GNU General Public License for more details.
|
|
15
|
|
16 You should have received a copy of the GNU General Public License
|
|
17 along with GCC; see the file COPYING3. If not see
|
|
18 <http://www.gnu.org/licenses/>. */
|
|
19
|
|
20 #ifndef GCC_VR_VALUES_H
|
|
21 #define GCC_VR_VALUES_H
|
|
22
|
|
23 /* The VR_VALUES class holds the current view of range information
|
|
24 for all the SSA_NAMEs in the IL.
|
|
25
|
|
26 It can be used to hold context sensitive range information during
|
|
27 a dominator walk or it may be used to hold range information in the
|
|
28 standard VRP pass as ranges are propagated through the lattice to a
|
|
29 steady state.
|
|
30
|
|
31 This information is independent of the range information that gets
|
|
32 attached to SSA_NAMEs. A pass such as VRP may choose to transfer
|
|
33 the global information it produces into global range information that
|
|
34 gets attached to an SSA_NAME. It's unclear how useful that global
|
|
35 information will be in a world where we can compute context sensitive
|
|
36 range information fast or perform on-demand queries. */
|
|
37 class vr_values
|
|
38 {
|
|
39 public:
|
|
40 vr_values (void);
|
|
41 ~vr_values (void);
|
|
42
|
145
|
43 const value_range_equiv *get_value_range (const_tree);
|
|
44 void set_vr_value (tree, value_range_equiv *);
|
|
45 value_range_equiv *swap_vr_value (tree, value_range_equiv *);
|
131
|
46
|
145
|
47 void set_def_to_varying (const_tree);
|
131
|
48 void set_defs_to_varying (gimple *);
|
145
|
49 bool update_value_range (const_tree, value_range_equiv *);
|
131
|
50 tree op_with_constant_singleton_value_range (tree);
|
145
|
51 void adjust_range_with_scev (value_range_equiv *, class loop *,
|
|
52 gimple *, tree);
|
131
|
53 tree vrp_evaluate_conditional (tree_code, tree, tree, gimple *);
|
|
54 void dump_all_value_ranges (FILE *);
|
|
55
|
|
56 void extract_range_for_var_from_comparison_expr (tree, enum tree_code,
|
145
|
57 tree, tree,
|
|
58 value_range_equiv *);
|
|
59 void extract_range_from_phi_node (gphi *, value_range_equiv *);
|
|
60 void extract_range_basic (value_range_equiv *, gimple *);
|
|
61 void extract_range_from_stmt (gimple *, edge *, tree *, value_range_equiv *);
|
131
|
62
|
|
63 void vrp_visit_cond_stmt (gcond *, edge *);
|
|
64
|
|
65 void simplify_cond_using_ranges_2 (gcond *);
|
|
66 bool simplify_stmt_using_ranges (gimple_stmt_iterator *);
|
|
67
|
|
68 /* Indicate that propagation through the lattice is complete. */
|
|
69 void set_lattice_propagation_complete (void) { values_propagated = true; }
|
|
70
|
|
71 /* Allocate a new value_range object. */
|
145
|
72 value_range_equiv *allocate_value_range_equiv (void)
|
131
|
73 { return vrp_value_range_pool.allocate (); }
|
145
|
74 void free_value_range (value_range_equiv *vr)
|
|
75 { vrp_value_range_pool.remove (vr); }
|
131
|
76
|
|
77 /* */
|
|
78 void cleanup_edges_and_switches (void);
|
|
79
|
|
80 private:
|
145
|
81 value_range_equiv *get_lattice_entry (const_tree);
|
131
|
82 bool vrp_stmt_computes_nonzero (gimple *);
|
|
83 bool op_with_boolean_value_range_p (tree);
|
|
84 bool check_for_binary_op_overflow (enum tree_code, tree, tree, tree, bool *);
|
145
|
85 const value_range_equiv *get_vr_for_comparison (int, value_range_equiv *);
|
131
|
86 tree compare_name_with_value (enum tree_code, tree, tree, bool *, bool);
|
|
87 tree compare_names (enum tree_code, tree, tree, bool *);
|
|
88 bool two_valued_val_range_p (tree, tree *, tree *);
|
|
89 tree vrp_evaluate_conditional_warnv_with_ops_using_ranges (enum tree_code,
|
|
90 tree, tree,
|
|
91 bool *);
|
|
92 tree vrp_evaluate_conditional_warnv_with_ops (enum tree_code,
|
|
93 tree, tree, bool,
|
|
94 bool *, bool *);
|
145
|
95 void extract_range_from_assignment (value_range_equiv *, gassign *);
|
|
96 void extract_range_from_assert (value_range_equiv *, tree);
|
|
97 void extract_range_from_ssa_name (value_range_equiv *, tree);
|
|
98 void extract_range_from_binary_expr (value_range_equiv *, enum tree_code,
|
131
|
99 tree, tree, tree);
|
145
|
100 void extract_range_from_unary_expr (value_range_equiv *, enum tree_code,
|
131
|
101 tree, tree);
|
145
|
102 void extract_range_from_cond_expr (value_range_equiv *, gassign *);
|
|
103 void extract_range_from_comparison (value_range_equiv *, enum tree_code,
|
131
|
104 tree, tree, tree);
|
145
|
105 void vrp_visit_assignment_or_call (gimple*, tree *, value_range_equiv *);
|
131
|
106 void vrp_visit_switch_stmt (gswitch *, edge *);
|
|
107 bool simplify_truth_ops_using_ranges (gimple_stmt_iterator *, gimple *);
|
|
108 bool simplify_div_or_mod_using_ranges (gimple_stmt_iterator *, gimple *);
|
|
109 bool simplify_abs_using_ranges (gimple_stmt_iterator *, gimple *);
|
|
110 bool simplify_bit_ops_using_ranges (gimple_stmt_iterator *, gimple *);
|
|
111 bool simplify_min_or_max_using_ranges (gimple_stmt_iterator *, gimple *);
|
|
112 bool simplify_cond_using_ranges_1 (gcond *);
|
|
113 bool simplify_switch_using_ranges (gswitch *);
|
|
114 bool simplify_float_conversion_using_ranges (gimple_stmt_iterator *,
|
|
115 gimple *);
|
|
116 bool simplify_internal_call_using_ranges (gimple_stmt_iterator *, gimple *);
|
|
117
|
|
118 /* Allocation pools for value_range objects. */
|
145
|
119 object_allocator<value_range_equiv> vrp_value_range_pool;
|
131
|
120
|
|
121 /* This probably belongs in the lattice rather than in here. */
|
|
122 bool values_propagated;
|
|
123
|
|
124 /* Allocations for equivalences all come from this obstack. */
|
|
125 bitmap_obstack vrp_equiv_obstack;
|
|
126
|
|
127 /* Value range array. After propagation, VR_VALUE[I] holds the range
|
|
128 of values that SSA name N_I may take. */
|
|
129 unsigned int num_vr_values;
|
145
|
130 value_range_equiv **vr_value;
|
131
|
131
|
|
132 /* For a PHI node which sets SSA name N_I, VR_COUNTS[I] holds the
|
|
133 number of executable edges we saw the last time we visited the
|
|
134 node. */
|
|
135 int *vr_phi_edge_counts;
|
|
136
|
|
137 /* Vectors of edges that need removing and switch statements that
|
|
138 need updating. It is expected that a pass using the simplification
|
|
139 routines will, at the end of the pass, clean up the edges and
|
|
140 switch statements. The class dtor will try to detect cases
|
|
141 that do not follow that expectation. */
|
|
142 struct switch_update {
|
|
143 gswitch *stmt;
|
|
144 tree vec;
|
|
145 };
|
|
146
|
|
147 vec<edge> to_remove_edges;
|
|
148 vec<switch_update> to_update_switch_stmts;
|
|
149 };
|
|
150
|
|
151 extern tree get_output_for_vrp (gimple *);
|
|
152 #endif /* GCC_VR_VALUES_H */
|