]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/doc/gccint/analysis-and-optimization-of-gimple-tuples/static-single-assignment.rst
sphinx: add missing trailing newline
[thirdparty/gcc.git] / gcc / doc / gccint / analysis-and-optimization-of-gimple-tuples / static-single-assignment.rst
CommitLineData
c63539ff
ML
1..
2 Copyright 1988-2022 Free Software Foundation, Inc.
3 This is part of the GCC manual.
4 For copying conditions, see the copyright.rst file.
5
6.. index:: SSA, static single assignment
7
8.. _ssa:
9
10Static Single Assignment
11************************
12
13Most of the tree optimizers rely on the data flow information provided
14by the Static Single Assignment (SSA) form. We implement the SSA form
15as described in R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and
16K. Zadeck. Efficiently Computing Static Single Assignment Form and the
17Control Dependence Graph. ACM Transactions on Programming Languages
18and Systems, 13(4):451-490, October 1991.
19
20The SSA form is based on the premise that program variables are
21assigned in exactly one location in the program. Multiple assignments
22to the same variable create new versions of that variable. Naturally,
23actual programs are seldom in SSA form initially because variables
24tend to be assigned multiple times. The compiler modifies the program
25representation so that every time a variable is assigned in the code,
26a new version of the variable is created. Different versions of the
27same variable are distinguished by subscripting the variable name with
28its version number. Variables used in the right-hand side of
29expressions are renamed so that their version number matches that of
30the most recent assignment.
31
32We represent variable versions using ``SSA_NAME`` nodes. The
33renaming process in :samp:`tree-ssa.cc` wraps every real and
34virtual operand with an ``SSA_NAME`` node which contains
35the version number and the statement that created the
36``SSA_NAME``. Only definitions and virtual definitions may
37create new ``SSA_NAME`` nodes.
38
39.. index:: PHI nodes
40
41Sometimes, flow of control makes it impossible to determine the
42most recent version of a variable. In these cases, the compiler
43inserts an artificial definition for that variable called
44:dfn:`PHI function` or :dfn:`PHI node`. This new definition merges
45all the incoming versions of the variable to create a new name
46for it. For instance,
47
48.. code-block:: c++
49
50 if (...)
51 a_1 = 5;
52 else if (...)
53 a_2 = 2;
54 else
55 a_3 = 13;
56
57 # a_4 = PHI <a_1, a_2, a_3>
58 return a_4;
59
60Since it is not possible to determine which of the three branches
61will be taken at runtime, we don't know which of ``a_1``,
62``a_2`` or ``a_3`` to use at the return statement. So, the
63SSA renamer creates a new version ``a_4`` which is assigned
64the result of 'merging' ``a_1``, ``a_2`` and ``a_3``.
65Hence, PHI nodes mean 'one of these operands. I don't know
66which'.
67
68The following functions can be used to examine PHI nodes
69
70.. function:: gimple_phi_result (phi)
71
72 Returns the ``SSA_NAME`` created by PHI node :samp:`{phi}` (i.e., :samp:`{phi}` 's LHS).
73
74.. function:: gimple_phi_num_args (phi)
75
76 Returns the number of arguments in :samp:`{phi}`. This number is exactly
77 the number of incoming edges to the basic block holding :samp:`{phi}`.
78
79.. function:: gimple_phi_arg (phi, i)
80
81 Returns :samp:`{i}` th argument of :samp:`{phi}`.
82
83.. function:: gimple_phi_arg_edge (phi, i)
84
85 Returns the incoming edge for the :samp:`{i}` th argument of :samp:`{phi}`.
86
87.. function:: gimple_phi_arg_def (phi, i)
88
89 Returns the ``SSA_NAME`` for the :samp:`{i}` th argument of :samp:`{phi}`.
90
91.. index:: update_ssa, preserving SSA form
92
93Preserving the SSA form
94^^^^^^^^^^^^^^^^^^^^^^^
95
96Some optimization passes make changes to the function that
97invalidate the SSA property. This can happen when a pass has
98added new symbols or changed the program so that variables that
99were previously aliased aren't anymore. Whenever something like this
100happens, the affected symbols must be renamed into SSA form again.
101Transformations that emit new code or replicate existing statements
102will also need to update the SSA form.
103
104Since GCC implements two different SSA forms for register and virtual
105variables, keeping the SSA form up to date depends on whether you are
106updating register or virtual names. In both cases, the general idea
107behind incremental SSA updates is similar: when new SSA names are
108created, they typically are meant to replace other existing names in
109the program.
110
111For instance, given the following code:
112
113.. code-block:: c++
114
115 1 L0:
116 2 x_1 = PHI (0, x_5)
117 3 if (x_1 < 10)
118 4 if (x_1 > 7)
119 5 y_2 = 0
120 6 else
121 7 y_3 = x_1 + x_7
122 8 endif
123 9 x_5 = x_1 + 1
124 10 goto L0;
125 11 endif
126
127Suppose that we insert new names ``x_10`` and ``x_11`` (lines
128``4`` and ``8``).
129
130.. code-block:: c++
131
132 1 L0:
133 2 x_1 = PHI (0, x_5)
134 3 if (x_1 < 10)
135 4 x_10 = ...
136 5 if (x_1 > 7)
137 6 y_2 = 0
138 7 else
139 8 x_11 = ...
140 9 y_3 = x_1 + x_7
141 10 endif
142 11 x_5 = x_1 + 1
143 12 goto L0;
144 13 endif
145
146We want to replace all the uses of ``x_1`` with the new definitions
147of ``x_10`` and ``x_11``. Note that the only uses that should
148be replaced are those at lines ``5``, ``9`` and ``11``.
149Also, the use of ``x_7`` at line ``9`` should *not* be
150replaced (this is why we cannot just mark symbol ``x`` for
151renaming).
152
153Additionally, we may need to insert a PHI node at line ``11``
154because that is a merge point for ``x_10`` and ``x_11``. So the
155use of ``x_1`` at line ``11`` will be replaced with the new PHI
156node. The insertion of PHI nodes is optional. They are not strictly
157necessary to preserve the SSA form, and depending on what the caller
158inserted, they may not even be useful for the optimizers.
159
160Updating the SSA form is a two step process. First, the pass has to
161identify which names need to be updated and/or which symbols need to
162be renamed into SSA form for the first time. When new names are
163introduced to replace existing names in the program, the mapping
164between the old and the new names are registered by calling
165``register_new_name_mapping`` (note that if your pass creates new
166code by duplicating basic blocks, the call to ``tree_duplicate_bb``
167will set up the necessary mappings automatically).
168
169After the replacement mappings have been registered and new symbols
170marked for renaming, a call to ``update_ssa`` makes the registered
171changes. This can be done with an explicit call or by creating
172``TODO`` flags in the ``tree_opt_pass`` structure for your pass.
173There are several ``TODO`` flags that control the behavior of
174``update_ssa`` :
175
176* ``TODO_update_ssa``. Update the SSA form inserting PHI nodes
177 for newly exposed symbols and virtual names marked for updating.
178 When updating real names, only insert PHI nodes for a real name
179 ``O_j`` in blocks reached by all the new and old definitions for
180 ``O_j``. If the iterated dominance frontier for ``O_j``
181 is not pruned, we may end up inserting PHI nodes in blocks that
182 have one or more edges with no incoming definition for
183 ``O_j``. This would lead to uninitialized warnings for
184 ``O_j`` 's symbol.
185
186* ``TODO_update_ssa_no_phi``. Update the SSA form without
187 inserting any new PHI nodes at all. This is used by passes that
188 have either inserted all the PHI nodes themselves or passes that
189 need only to patch use-def and def-def chains for virtuals
190 (e.g., DCE).
191
192* ``TODO_update_ssa_full_phi``. Insert PHI nodes everywhere
193 they are needed. No pruning of the IDF is done. This is used
194 by passes that need the PHI nodes for ``O_j`` even if it
195 means that some arguments will come from the default definition
196 of ``O_j`` 's symbol (e.g., ``pass_linear_transform``).
197
198 WARNING: If you need to use this flag, chances are that your
199 pass may be doing something wrong. Inserting PHI nodes for an
200 old name where not all edges carry a new replacement may lead to
201 silent codegen errors or spurious uninitialized warnings.
202
203* ``TODO_update_ssa_only_virtuals``. Passes that update the
204 SSA form on their own may want to delegate the updating of
205 virtual names to the generic updater. Since FUD chains are
206 easier to maintain, this simplifies the work they need to do.
207 NOTE: If this flag is used, any OLD->NEW mappings for real names
208 are explicitly destroyed and only the symbols marked for
209 renaming are processed.
210
211.. index:: examining SSA_NAMEs
212
213Examining SSA_NAME nodes
214^^^^^^^^^^^^^^^^^^^^^^^^
215
216The following macros can be used to examine ``SSA_NAME`` nodes
217
218.. c:macro:: SSA_NAME_DEF_STMT (var)
219
220 Returns the statement :samp:`{s}` that creates the ``SSA_NAME``
221 :samp:`{var}`. If :samp:`{s}` is an empty statement (i.e., ``IS_EMPTY_STMT
222 (s)`` returns ``true``), it means that the first reference to
223 this variable is a USE or a VUSE.
224
225.. c:macro:: SSA_NAME_VERSION (var)
226
227 Returns the version number of the ``SSA_NAME`` object :samp:`{var}`.
228
229Walking the dominator tree
230^^^^^^^^^^^^^^^^^^^^^^^^^^
231
232.. function:: void walk_dominator_tree (walk_data, bb)
233
234 This function walks the dominator tree for the current CFG calling a
235 set of callback functions defined in :samp:`{struct dom_walk_data}` in
236 :samp:`domwalk.h`. The call back functions you need to define give you
237 hooks to execute custom code at various points during traversal:
238
239 * Once to initialize any local data needed while processing
240 :samp:`{bb}` and its children. This local data is pushed into an
241 internal stack which is automatically pushed and popped as the
242 walker traverses the dominator tree.
243
244 * Once before traversing all the statements in the :samp:`{bb}`.
245
246 * Once for every statement inside :samp:`{bb}`.
247
248 * Once after traversing all the statements and before recursing
249 into :samp:`{bb}` 's dominator children.
250
251 * It then recurses into all the dominator children of :samp:`{bb}`.
252
253 * After recursing into all the dominator children of :samp:`{bb}` it
254 can, optionally, traverse every statement in :samp:`{bb}` again
255 (i.e., repeating steps 2 and 3).
256
257 * Once after walking the statements in :samp:`{bb}` and :samp:`{bb}` 's
258 dominator children. At this stage, the block local data stack
3ed1b4ce 259 is popped.