GCC Middle and Back End API Reference
tree-ssa-scopedtables.h
Go to the documentation of this file.
1/* Header file for SSA dominator optimizations.
2 Copyright (C) 2013-2024 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef GCC_TREE_SSA_SCOPED_TABLES_H
21#define GCC_TREE_SSA_SCOPED_TABLES_H
22
23/* Representation of a "naked" right-hand-side expression, to be used
24 in recording available expressions in the expression hash table. */
25
35
37{
40 union {
41 struct { tree rhs; } single;
42 struct { enum tree_code op; tree opnd; } unary;
43 struct { enum tree_code op; tree opnd0, opnd1; } binary;
44 struct { enum tree_code op; tree opnd0, opnd1, opnd2; } ternary;
45 struct { gcall *fn_from; bool pure; size_t nargs; tree *args; } call;
46 struct { size_t nargs; tree *args; } phi;
47 } ops;
48};
49
50/* Structure for recording known value of a conditional expression.
51
52 Clients build vectors of these objects to record known values
53 that occur on edges. */
54
56{
57 /* The condition, in a HASHABLE_EXPR form. */
59
60 /* The result of the condition (true or false. */
62};
63
64/* Structure for entries in the expression hash table. */
65
67
69{
70 public:
76 void print (FILE *);
77 tree vop (void) { return m_vop; }
78 tree lhs (void) { return m_lhs; }
79 struct hashable_expr *expr (void) { return &m_expr; }
80 expr_hash_elt *stamp (void) { return m_stamp; }
81 hashval_t hash (void) { return m_hash; }
82
83 private:
84 /* The expression (rhs) we want to record. */
86
87 /* The value (lhs) of this expression. */
89
90 /* The virtual operand associated with the nearest dominating stmt
91 loading from or storing to expr. */
93
94 /* The hash value for RHS. */
95 hashval_t m_hash;
96
97 /* A unique stamp, typically the address of the hash
98 element itself, used in removing entries from the table. */
100
101 /* We should never be making assignments between objects in this class.
102 Though it might allow us to exploit C++11 move semantics if we
103 defined the move constructor and move assignment operator. */
105};
106
107/* Hashtable helpers. */
108
109struct expr_elt_hasher : pointer_hash <expr_hash_elt>
110{
111 static inline hashval_t hash (const value_type &p)
112 { return p->hash (); }
113 static bool equal (const value_type &, const compare_type &);
114 static inline void remove (value_type &element)
115 { delete element; }
116};
117
118
119/* This class defines a unwindable expression equivalence table
120 layered on top of the expression hash table.
121
122 Essentially it's just a stack of available expression value pairs with
123 a special marker (NULL, NULL) to indicate unwind points. */
124
126{
127 public:
128 /* We need access to the AVAIL_EXPR hash table so that we can
129 remove entries from the hash table when unwinding the stack. */
132 ~avail_exprs_stack (void) { m_stack.release (); }
133
134 /* Push the unwinding marker onto the stack. */
135 void push_marker (void) { record_expr (NULL, NULL, 'M'); }
136
137 /* Restore the AVAIL_EXPRs table to its state when the last marker
138 was pushed. */
139 void pop_to_marker (void);
140
141 /* Record a single available expression that can be unwound. */
143
144 /* Get the underlying hash table. Would this be better as
145 class inheritance? */
148
149 /* Lookup and conditionally insert an expression into the table,
150 recording enough information to unwind as needed. */
151 tree lookup_avail_expr (gimple *, bool, bool, expr_hash_elt ** = NULL);
152
154
155 private:
158
159 /* For some assignments where the RHS is a binary operator, if we know
160 a equality relationship between the operands, we may be able to compute
161 a result, even if we don't know the exact value of the operands. */
163
164 /* We do not allow copying this object or initializing one
165 from another. */
168};
169
170/* This class defines an unwindable const/copy equivalence table
171 layered on top of SSA_NAME_VALUE/set_ssa_name_value.
172
173 Essentially it's just a stack of name,prev value pairs with a
174 special marker (NULL) to indicate unwind points. */
175
177{
178 public:
179 const_and_copies (void) { m_stack.create (20); };
180 ~const_and_copies (void) { m_stack.release (); }
181
182 /* Push the unwinding marker onto the stack. */
183 void push_marker (void) { m_stack.safe_push (NULL_TREE); }
184
185 /* Restore the const/copies table to its state when the last marker
186 was pushed. */
187 void pop_to_marker (void);
188
189 /* Record a single const/copy pair that can be unwound. This version
190 may follow the value chain for the RHS. */
192
193 /* Special entry point when we want to provide an explicit previous
194 value for the first argument. Try to get rid of this in the future.
195
196 This version may also follow the value chain for the RHS. */
198
199 private:
200 /* Record a single const/copy pair that can be unwound. This version
201 does not follow the value chain for the RHS. */
203
207};
208
211
212#endif /* GCC_TREE_SSA_SCOPED_TABLES_H */
Definition tree-ssa-scopedtables.h:126
avail_exprs_stack(hash_table< expr_elt_hasher > *table)
Definition tree-ssa-scopedtables.h:130
tree simplify_binary_operation(gimple *, class expr_hash_elt)
Definition tree-ssa-scopedtables.cc:118
void record_cond(cond_equivalence *)
Definition tree-ssa-scopedtables.cc:389
hash_table< expr_elt_hasher > * avail_exprs(void)
Definition tree-ssa-scopedtables.h:146
hash_table< expr_elt_hasher > * m_avail_exprs
Definition tree-ssa-scopedtables.h:157
void pop_to_marker(void)
Definition tree-ssa-scopedtables.cc:49
tree lookup_avail_expr(gimple *, bool, bool, expr_hash_elt **=NULL)
Definition tree-ssa-scopedtables.cc:267
~avail_exprs_stack(void)
Definition tree-ssa-scopedtables.h:132
void record_expr(expr_hash_elt_t, expr_hash_elt_t, char)
Definition tree-ssa-scopedtables.cc:85
void push_marker(void)
Definition tree-ssa-scopedtables.h:135
vec< std::pair< expr_hash_elt_t, expr_hash_elt_t > > m_stack
Definition tree-ssa-scopedtables.h:156
avail_exprs_stack & operator=(const avail_exprs_stack &)
avail_exprs_stack(class avail_exprs_stack &)
Definition tree-ssa-scopedtables.h:177
const_and_copies & operator=(const const_and_copies &)
void pop_to_marker(void)
Definition tree-ssa-scopedtables.cc:996
void record_const_or_copy(tree, tree)
Definition tree-ssa-scopedtables.cc:1048
~const_and_copies(void)
Definition tree-ssa-scopedtables.h:180
void record_const_or_copy_raw(tree, tree, tree)
Definition tree-ssa-scopedtables.cc:1028
const_and_copies(class const_and_copies &)
void push_marker(void)
Definition tree-ssa-scopedtables.h:183
vec< tree > m_stack
Definition tree-ssa-scopedtables.h:204
const_and_copies(void)
Definition tree-ssa-scopedtables.h:179
Definition tree-ssa-scopedtables.h:69
expr_hash_elt * stamp(void)
Definition tree-ssa-scopedtables.h:80
tree vop(void)
Definition tree-ssa-scopedtables.h:77
expr_hash_elt & operator=(const expr_hash_elt &)
class expr_hash_elt * m_stamp
Definition tree-ssa-scopedtables.h:99
expr_hash_elt(tree)
tree lhs(void)
Definition tree-ssa-scopedtables.h:78
struct hashable_expr * expr(void)
Definition tree-ssa-scopedtables.h:79
expr_hash_elt(gimple *, tree)
Definition tree-ssa-scopedtables.cc:743
void print(FILE *)
Definition tree-ssa-scopedtables.cc:905
tree m_vop
Definition tree-ssa-scopedtables.h:92
tree m_lhs
Definition tree-ssa-scopedtables.h:88
hashval_t m_hash
Definition tree-ssa-scopedtables.h:95
hashval_t hash(void)
Definition tree-ssa-scopedtables.h:81
~expr_hash_elt()
Definition tree-ssa-scopedtables.cc:894
struct hashable_expr m_expr
Definition tree-ssa-scopedtables.h:85
Definition genmatch.cc:845
Definition hash-table.h:375
union tree_node * tree
Definition coretypes.h:97
static struct table_elt * table[HASH_SIZE]
Definition cse.cc:470
tree_code
Definition genmatch.cc:347
Definition tree-ssa-scopedtables.h:56
tree value
Definition tree-ssa-scopedtables.h:61
struct hashable_expr cond
Definition tree-ssa-scopedtables.h:58
Definition tree-ssa-scopedtables.h:110
static void remove(value_type &element)
Definition tree-ssa-scopedtables.h:114
static hashval_t hash(const value_type &p)
Definition tree-ssa-scopedtables.h:111
static bool equal(const value_type &, const compare_type &)
Definition tree-ssa-scopedtables.cc:1071
Definition gimple.h:353
Definition gimple.h:225
Definition tree-ssa-scopedtables.h:37
tree opnd
Definition tree-ssa-scopedtables.h:42
enum expr_kind kind
Definition tree-ssa-scopedtables.h:39
enum tree_code op
Definition tree-ssa-scopedtables.h:42
tree opnd1
Definition tree-ssa-scopedtables.h:43
tree opnd0
Definition tree-ssa-scopedtables.h:43
struct hashable_expr::@78::@84 phi
size_t nargs
Definition tree-ssa-scopedtables.h:45
struct hashable_expr::@78::@81 binary
tree * args
Definition tree-ssa-scopedtables.h:45
bool pure
Definition tree-ssa-scopedtables.h:45
struct hashable_expr::@78::@82 ternary
tree type
Definition tree-ssa-scopedtables.h:38
gcall * fn_from
Definition tree-ssa-scopedtables.h:45
tree rhs
Definition tree-ssa-scopedtables.h:41
struct hashable_expr::@78::@83 call
tree opnd2
Definition tree-ssa-scopedtables.h:44
struct hashable_expr::@78::@80 unary
union hashable_expr::@78 ops
struct hashable_expr::@78::@79 single
Definition hash-traits.h:168
expr_hash_elt * value_type
Definition hash-traits.h:169
expr_hash_elt * compare_type
Definition hash-traits.h:170
Definition vec.h:450
#define NULL
Definition system.h:50
void record_conditions(vec< cond_equivalence > *p, tree, tree)
Definition tree-ssa-scopedtables.cc:1152
expr_kind
Definition tree-ssa-scopedtables.h:27
@ EXPR_UNARY
Definition tree-ssa-scopedtables.h:29
@ EXPR_TERNARY
Definition tree-ssa-scopedtables.h:31
@ EXPR_CALL
Definition tree-ssa-scopedtables.h:32
@ EXPR_BINARY
Definition tree-ssa-scopedtables.h:30
@ EXPR_SINGLE
Definition tree-ssa-scopedtables.h:28
@ EXPR_PHI
Definition tree-ssa-scopedtables.h:33
void initialize_expr_from_cond(tree cond, struct hashable_expr *expr)
Definition tree-ssa-scopedtables.cc:1100
class expr_hash_elt * expr_hash_elt_t
Definition tree-ssa-scopedtables.h:66
#define NULL_TREE
Definition tree.h:317