1*e4b17023SJohn Marino /* Rename SSA copies.
2*e4b17023SJohn Marino Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2011
3*e4b17023SJohn Marino Free Software Foundation, Inc.
4*e4b17023SJohn Marino Contributed by Andrew MacLeod <amacleod@redhat.com>
5*e4b17023SJohn Marino
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
9*e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
10*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino any later version.
12*e4b17023SJohn Marino
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*e4b17023SJohn Marino GNU General Public License for more details.
17*e4b17023SJohn Marino
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
21*e4b17023SJohn Marino
22*e4b17023SJohn Marino #include "config.h"
23*e4b17023SJohn Marino #include "system.h"
24*e4b17023SJohn Marino #include "coretypes.h"
25*e4b17023SJohn Marino #include "tm.h"
26*e4b17023SJohn Marino #include "tree.h"
27*e4b17023SJohn Marino #include "gimple.h"
28*e4b17023SJohn Marino #include "flags.h"
29*e4b17023SJohn Marino #include "basic-block.h"
30*e4b17023SJohn Marino #include "function.h"
31*e4b17023SJohn Marino #include "tree-pretty-print.h"
32*e4b17023SJohn Marino #include "bitmap.h"
33*e4b17023SJohn Marino #include "tree-flow.h"
34*e4b17023SJohn Marino #include "gimple.h"
35*e4b17023SJohn Marino #include "tree-inline.h"
36*e4b17023SJohn Marino #include "timevar.h"
37*e4b17023SJohn Marino #include "hashtab.h"
38*e4b17023SJohn Marino #include "tree-dump.h"
39*e4b17023SJohn Marino #include "tree-ssa-live.h"
40*e4b17023SJohn Marino #include "tree-pass.h"
41*e4b17023SJohn Marino #include "langhooks.h"
42*e4b17023SJohn Marino
43*e4b17023SJohn Marino static struct
44*e4b17023SJohn Marino {
45*e4b17023SJohn Marino /* Number of copies coalesced. */
46*e4b17023SJohn Marino int coalesced;
47*e4b17023SJohn Marino } stats;
48*e4b17023SJohn Marino
49*e4b17023SJohn Marino /* The following routines implement the SSA copy renaming phase.
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino This optimization looks for copies between 2 SSA_NAMES, either through a
52*e4b17023SJohn Marino direct copy, or an implicit one via a PHI node result and its arguments.
53*e4b17023SJohn Marino
54*e4b17023SJohn Marino Each copy is examined to determine if it is possible to rename the base
55*e4b17023SJohn Marino variable of one of the operands to the same variable as the other operand.
56*e4b17023SJohn Marino i.e.
57*e4b17023SJohn Marino T.3_5 = <blah>
58*e4b17023SJohn Marino a_1 = T.3_5
59*e4b17023SJohn Marino
60*e4b17023SJohn Marino If this copy couldn't be copy propagated, it could possibly remain in the
61*e4b17023SJohn Marino program throughout the optimization phases. After SSA->normal, it would
62*e4b17023SJohn Marino become:
63*e4b17023SJohn Marino
64*e4b17023SJohn Marino T.3 = <blah>
65*e4b17023SJohn Marino a = T.3
66*e4b17023SJohn Marino
67*e4b17023SJohn Marino Since T.3_5 is distinct from all other SSA versions of T.3, there is no
68*e4b17023SJohn Marino fundamental reason why the base variable needs to be T.3, subject to
69*e4b17023SJohn Marino certain restrictions. This optimization attempts to determine if we can
70*e4b17023SJohn Marino change the base variable on copies like this, and result in code such as:
71*e4b17023SJohn Marino
72*e4b17023SJohn Marino a_5 = <blah>
73*e4b17023SJohn Marino a_1 = a_5
74*e4b17023SJohn Marino
75*e4b17023SJohn Marino This gives the SSA->normal pass a shot at coalescing a_1 and a_5. If it is
76*e4b17023SJohn Marino possible, the copy goes away completely. If it isn't possible, a new temp
77*e4b17023SJohn Marino will be created for a_5, and you will end up with the exact same code:
78*e4b17023SJohn Marino
79*e4b17023SJohn Marino a.8 = <blah>
80*e4b17023SJohn Marino a = a.8
81*e4b17023SJohn Marino
82*e4b17023SJohn Marino The other benefit of performing this optimization relates to what variables
83*e4b17023SJohn Marino are chosen in copies. Gimplification of the program uses temporaries for
84*e4b17023SJohn Marino a lot of things. expressions like
85*e4b17023SJohn Marino
86*e4b17023SJohn Marino a_1 = <blah>
87*e4b17023SJohn Marino <blah2> = a_1
88*e4b17023SJohn Marino
89*e4b17023SJohn Marino get turned into
90*e4b17023SJohn Marino
91*e4b17023SJohn Marino T.3_5 = <blah>
92*e4b17023SJohn Marino a_1 = T.3_5
93*e4b17023SJohn Marino <blah2> = a_1
94*e4b17023SJohn Marino
95*e4b17023SJohn Marino Copy propagation is done in a forward direction, and if we can propagate
96*e4b17023SJohn Marino through the copy, we end up with:
97*e4b17023SJohn Marino
98*e4b17023SJohn Marino T.3_5 = <blah>
99*e4b17023SJohn Marino <blah2> = T.3_5
100*e4b17023SJohn Marino
101*e4b17023SJohn Marino The copy is gone, but so is all reference to the user variable 'a'. By
102*e4b17023SJohn Marino performing this optimization, we would see the sequence:
103*e4b17023SJohn Marino
104*e4b17023SJohn Marino a_5 = <blah>
105*e4b17023SJohn Marino a_1 = a_5
106*e4b17023SJohn Marino <blah2> = a_1
107*e4b17023SJohn Marino
108*e4b17023SJohn Marino which copy propagation would then turn into:
109*e4b17023SJohn Marino
110*e4b17023SJohn Marino a_5 = <blah>
111*e4b17023SJohn Marino <blah2> = a_5
112*e4b17023SJohn Marino
113*e4b17023SJohn Marino and so we still retain the user variable whenever possible. */
114*e4b17023SJohn Marino
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino /* Coalesce the partitions in MAP representing VAR1 and VAR2 if it is valid.
117*e4b17023SJohn Marino Choose a representative for the partition, and send debug info to DEBUG. */
118*e4b17023SJohn Marino
119*e4b17023SJohn Marino static bool
copy_rename_partition_coalesce(var_map map,tree var1,tree var2,FILE * debug)120*e4b17023SJohn Marino copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
121*e4b17023SJohn Marino {
122*e4b17023SJohn Marino int p1, p2, p3;
123*e4b17023SJohn Marino tree root1, root2;
124*e4b17023SJohn Marino tree rep1, rep2;
125*e4b17023SJohn Marino bool ign1, ign2, abnorm;
126*e4b17023SJohn Marino
127*e4b17023SJohn Marino gcc_assert (TREE_CODE (var1) == SSA_NAME);
128*e4b17023SJohn Marino gcc_assert (TREE_CODE (var2) == SSA_NAME);
129*e4b17023SJohn Marino
130*e4b17023SJohn Marino register_ssa_partition (map, var1);
131*e4b17023SJohn Marino register_ssa_partition (map, var2);
132*e4b17023SJohn Marino
133*e4b17023SJohn Marino p1 = partition_find (map->var_partition, SSA_NAME_VERSION (var1));
134*e4b17023SJohn Marino p2 = partition_find (map->var_partition, SSA_NAME_VERSION (var2));
135*e4b17023SJohn Marino
136*e4b17023SJohn Marino if (debug)
137*e4b17023SJohn Marino {
138*e4b17023SJohn Marino fprintf (debug, "Try : ");
139*e4b17023SJohn Marino print_generic_expr (debug, var1, TDF_SLIM);
140*e4b17023SJohn Marino fprintf (debug, "(P%d) & ", p1);
141*e4b17023SJohn Marino print_generic_expr (debug, var2, TDF_SLIM);
142*e4b17023SJohn Marino fprintf (debug, "(P%d)", p2);
143*e4b17023SJohn Marino }
144*e4b17023SJohn Marino
145*e4b17023SJohn Marino gcc_assert (p1 != NO_PARTITION);
146*e4b17023SJohn Marino gcc_assert (p2 != NO_PARTITION);
147*e4b17023SJohn Marino
148*e4b17023SJohn Marino rep1 = partition_to_var (map, p1);
149*e4b17023SJohn Marino rep2 = partition_to_var (map, p2);
150*e4b17023SJohn Marino root1 = SSA_NAME_VAR (rep1);
151*e4b17023SJohn Marino root2 = SSA_NAME_VAR (rep2);
152*e4b17023SJohn Marino
153*e4b17023SJohn Marino if (p1 == p2)
154*e4b17023SJohn Marino {
155*e4b17023SJohn Marino if (debug)
156*e4b17023SJohn Marino fprintf (debug, " : Already coalesced.\n");
157*e4b17023SJohn Marino return false;
158*e4b17023SJohn Marino }
159*e4b17023SJohn Marino
160*e4b17023SJohn Marino /* Don't coalesce if one of the variables occurs in an abnormal PHI. */
161*e4b17023SJohn Marino abnorm = (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rep1)
162*e4b17023SJohn Marino || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rep2));
163*e4b17023SJohn Marino if (abnorm)
164*e4b17023SJohn Marino {
165*e4b17023SJohn Marino if (debug)
166*e4b17023SJohn Marino fprintf (debug, " : Abnormal PHI barrier. No coalesce.\n");
167*e4b17023SJohn Marino return false;
168*e4b17023SJohn Marino }
169*e4b17023SJohn Marino
170*e4b17023SJohn Marino /* Partitions already have the same root, simply merge them. */
171*e4b17023SJohn Marino if (root1 == root2)
172*e4b17023SJohn Marino {
173*e4b17023SJohn Marino p1 = partition_union (map->var_partition, p1, p2);
174*e4b17023SJohn Marino if (debug)
175*e4b17023SJohn Marino fprintf (debug, " : Same root, coalesced --> P%d.\n", p1);
176*e4b17023SJohn Marino return false;
177*e4b17023SJohn Marino }
178*e4b17023SJohn Marino
179*e4b17023SJohn Marino /* Never attempt to coalesce 2 different parameters. */
180*e4b17023SJohn Marino if (TREE_CODE (root1) == PARM_DECL && TREE_CODE (root2) == PARM_DECL)
181*e4b17023SJohn Marino {
182*e4b17023SJohn Marino if (debug)
183*e4b17023SJohn Marino fprintf (debug, " : 2 different PARM_DECLS. No coalesce.\n");
184*e4b17023SJohn Marino return false;
185*e4b17023SJohn Marino }
186*e4b17023SJohn Marino
187*e4b17023SJohn Marino if ((TREE_CODE (root1) == RESULT_DECL) != (TREE_CODE (root2) == RESULT_DECL))
188*e4b17023SJohn Marino {
189*e4b17023SJohn Marino if (debug)
190*e4b17023SJohn Marino fprintf (debug, " : One root a RESULT_DECL. No coalesce.\n");
191*e4b17023SJohn Marino return false;
192*e4b17023SJohn Marino }
193*e4b17023SJohn Marino
194*e4b17023SJohn Marino ign1 = TREE_CODE (root1) == VAR_DECL && DECL_IGNORED_P (root1);
195*e4b17023SJohn Marino ign2 = TREE_CODE (root2) == VAR_DECL && DECL_IGNORED_P (root2);
196*e4b17023SJohn Marino
197*e4b17023SJohn Marino /* Never attempt to coalesce 2 user variables unless one is an inline
198*e4b17023SJohn Marino variable. */
199*e4b17023SJohn Marino if (!ign1 && !ign2)
200*e4b17023SJohn Marino {
201*e4b17023SJohn Marino if (DECL_FROM_INLINE (root2))
202*e4b17023SJohn Marino ign2 = true;
203*e4b17023SJohn Marino else if (DECL_FROM_INLINE (root1))
204*e4b17023SJohn Marino ign1 = true;
205*e4b17023SJohn Marino else
206*e4b17023SJohn Marino {
207*e4b17023SJohn Marino if (debug)
208*e4b17023SJohn Marino fprintf (debug, " : 2 different USER vars. No coalesce.\n");
209*e4b17023SJohn Marino return false;
210*e4b17023SJohn Marino }
211*e4b17023SJohn Marino }
212*e4b17023SJohn Marino
213*e4b17023SJohn Marino /* If both values have default defs, we can't coalesce. If only one has a
214*e4b17023SJohn Marino tag, make sure that variable is the new root partition. */
215*e4b17023SJohn Marino if (gimple_default_def (cfun, root1))
216*e4b17023SJohn Marino {
217*e4b17023SJohn Marino if (gimple_default_def (cfun, root2))
218*e4b17023SJohn Marino {
219*e4b17023SJohn Marino if (debug)
220*e4b17023SJohn Marino fprintf (debug, " : 2 default defs. No coalesce.\n");
221*e4b17023SJohn Marino return false;
222*e4b17023SJohn Marino }
223*e4b17023SJohn Marino else
224*e4b17023SJohn Marino {
225*e4b17023SJohn Marino ign2 = true;
226*e4b17023SJohn Marino ign1 = false;
227*e4b17023SJohn Marino }
228*e4b17023SJohn Marino }
229*e4b17023SJohn Marino else if (gimple_default_def (cfun, root2))
230*e4b17023SJohn Marino {
231*e4b17023SJohn Marino ign1 = true;
232*e4b17023SJohn Marino ign2 = false;
233*e4b17023SJohn Marino }
234*e4b17023SJohn Marino
235*e4b17023SJohn Marino /* Don't coalesce if the new chosen root variable would be read-only.
236*e4b17023SJohn Marino If both ign1 && ign2, then the root var of the larger partition
237*e4b17023SJohn Marino wins, so reject in that case if any of the root vars is TREE_READONLY.
238*e4b17023SJohn Marino Otherwise reject only if the root var, on which replace_ssa_name_symbol
239*e4b17023SJohn Marino will be called below, is readonly. */
240*e4b17023SJohn Marino if ((TREE_READONLY (root1) && ign2) || (TREE_READONLY (root2) && ign1))
241*e4b17023SJohn Marino {
242*e4b17023SJohn Marino if (debug)
243*e4b17023SJohn Marino fprintf (debug, " : Readonly variable. No coalesce.\n");
244*e4b17023SJohn Marino return false;
245*e4b17023SJohn Marino }
246*e4b17023SJohn Marino
247*e4b17023SJohn Marino /* Don't coalesce if the two variables aren't type compatible . */
248*e4b17023SJohn Marino if (!types_compatible_p (TREE_TYPE (root1), TREE_TYPE (root2))
249*e4b17023SJohn Marino /* There is a disconnect between the middle-end type-system and
250*e4b17023SJohn Marino VRP, avoid coalescing enum types with different bounds. */
251*e4b17023SJohn Marino || ((TREE_CODE (TREE_TYPE (root1)) == ENUMERAL_TYPE
252*e4b17023SJohn Marino || TREE_CODE (TREE_TYPE (root2)) == ENUMERAL_TYPE)
253*e4b17023SJohn Marino && TREE_TYPE (root1) != TREE_TYPE (root2)))
254*e4b17023SJohn Marino {
255*e4b17023SJohn Marino if (debug)
256*e4b17023SJohn Marino fprintf (debug, " : Incompatible types. No coalesce.\n");
257*e4b17023SJohn Marino return false;
258*e4b17023SJohn Marino }
259*e4b17023SJohn Marino
260*e4b17023SJohn Marino /* Merge the two partitions. */
261*e4b17023SJohn Marino p3 = partition_union (map->var_partition, p1, p2);
262*e4b17023SJohn Marino
263*e4b17023SJohn Marino /* Set the root variable of the partition to the better choice, if there is
264*e4b17023SJohn Marino one. */
265*e4b17023SJohn Marino if (!ign2)
266*e4b17023SJohn Marino replace_ssa_name_symbol (partition_to_var (map, p3), root2);
267*e4b17023SJohn Marino else if (!ign1)
268*e4b17023SJohn Marino replace_ssa_name_symbol (partition_to_var (map, p3), root1);
269*e4b17023SJohn Marino
270*e4b17023SJohn Marino if (debug)
271*e4b17023SJohn Marino {
272*e4b17023SJohn Marino fprintf (debug, " --> P%d ", p3);
273*e4b17023SJohn Marino print_generic_expr (debug, SSA_NAME_VAR (partition_to_var (map, p3)),
274*e4b17023SJohn Marino TDF_SLIM);
275*e4b17023SJohn Marino fprintf (debug, "\n");
276*e4b17023SJohn Marino }
277*e4b17023SJohn Marino return true;
278*e4b17023SJohn Marino }
279*e4b17023SJohn Marino
280*e4b17023SJohn Marino
281*e4b17023SJohn Marino /* This function will make a pass through the IL, and attempt to coalesce any
282*e4b17023SJohn Marino SSA versions which occur in PHI's or copies. Coalescing is accomplished by
283*e4b17023SJohn Marino changing the underlying root variable of all coalesced version. This will
284*e4b17023SJohn Marino then cause the SSA->normal pass to attempt to coalesce them all to the same
285*e4b17023SJohn Marino variable. */
286*e4b17023SJohn Marino
287*e4b17023SJohn Marino static unsigned int
rename_ssa_copies(void)288*e4b17023SJohn Marino rename_ssa_copies (void)
289*e4b17023SJohn Marino {
290*e4b17023SJohn Marino var_map map;
291*e4b17023SJohn Marino basic_block bb;
292*e4b17023SJohn Marino gimple_stmt_iterator gsi;
293*e4b17023SJohn Marino tree var, part_var;
294*e4b17023SJohn Marino gimple stmt, phi;
295*e4b17023SJohn Marino unsigned x;
296*e4b17023SJohn Marino FILE *debug;
297*e4b17023SJohn Marino bool updated = false;
298*e4b17023SJohn Marino
299*e4b17023SJohn Marino memset (&stats, 0, sizeof (stats));
300*e4b17023SJohn Marino
301*e4b17023SJohn Marino if (dump_file && (dump_flags & TDF_DETAILS))
302*e4b17023SJohn Marino debug = dump_file;
303*e4b17023SJohn Marino else
304*e4b17023SJohn Marino debug = NULL;
305*e4b17023SJohn Marino
306*e4b17023SJohn Marino map = init_var_map (num_ssa_names);
307*e4b17023SJohn Marino
308*e4b17023SJohn Marino FOR_EACH_BB (bb)
309*e4b17023SJohn Marino {
310*e4b17023SJohn Marino /* Scan for real copies. */
311*e4b17023SJohn Marino for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
312*e4b17023SJohn Marino {
313*e4b17023SJohn Marino stmt = gsi_stmt (gsi);
314*e4b17023SJohn Marino if (gimple_assign_ssa_name_copy_p (stmt))
315*e4b17023SJohn Marino {
316*e4b17023SJohn Marino tree lhs = gimple_assign_lhs (stmt);
317*e4b17023SJohn Marino tree rhs = gimple_assign_rhs1 (stmt);
318*e4b17023SJohn Marino
319*e4b17023SJohn Marino updated |= copy_rename_partition_coalesce (map, lhs, rhs, debug);
320*e4b17023SJohn Marino }
321*e4b17023SJohn Marino }
322*e4b17023SJohn Marino }
323*e4b17023SJohn Marino
324*e4b17023SJohn Marino FOR_EACH_BB (bb)
325*e4b17023SJohn Marino {
326*e4b17023SJohn Marino /* Treat PHI nodes as copies between the result and each argument. */
327*e4b17023SJohn Marino for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
328*e4b17023SJohn Marino {
329*e4b17023SJohn Marino size_t i;
330*e4b17023SJohn Marino tree res;
331*e4b17023SJohn Marino
332*e4b17023SJohn Marino phi = gsi_stmt (gsi);
333*e4b17023SJohn Marino res = gimple_phi_result (phi);
334*e4b17023SJohn Marino
335*e4b17023SJohn Marino /* Do not process virtual SSA_NAMES. */
336*e4b17023SJohn Marino if (!is_gimple_reg (SSA_NAME_VAR (res)))
337*e4b17023SJohn Marino continue;
338*e4b17023SJohn Marino
339*e4b17023SJohn Marino for (i = 0; i < gimple_phi_num_args (phi); i++)
340*e4b17023SJohn Marino {
341*e4b17023SJohn Marino tree arg = gimple_phi_arg (phi, i)->def;
342*e4b17023SJohn Marino if (TREE_CODE (arg) == SSA_NAME)
343*e4b17023SJohn Marino updated |= copy_rename_partition_coalesce (map, res, arg, debug);
344*e4b17023SJohn Marino }
345*e4b17023SJohn Marino }
346*e4b17023SJohn Marino }
347*e4b17023SJohn Marino
348*e4b17023SJohn Marino if (debug)
349*e4b17023SJohn Marino dump_var_map (debug, map);
350*e4b17023SJohn Marino
351*e4b17023SJohn Marino /* Now one more pass to make all elements of a partition share the same
352*e4b17023SJohn Marino root variable. */
353*e4b17023SJohn Marino
354*e4b17023SJohn Marino for (x = 1; x < num_ssa_names; x++)
355*e4b17023SJohn Marino {
356*e4b17023SJohn Marino part_var = partition_to_var (map, x);
357*e4b17023SJohn Marino if (!part_var)
358*e4b17023SJohn Marino continue;
359*e4b17023SJohn Marino var = ssa_name (x);
360*e4b17023SJohn Marino if (SSA_NAME_VAR (var) == SSA_NAME_VAR (part_var))
361*e4b17023SJohn Marino continue;
362*e4b17023SJohn Marino if (debug)
363*e4b17023SJohn Marino {
364*e4b17023SJohn Marino fprintf (debug, "Coalesced ");
365*e4b17023SJohn Marino print_generic_expr (debug, var, TDF_SLIM);
366*e4b17023SJohn Marino fprintf (debug, " to ");
367*e4b17023SJohn Marino print_generic_expr (debug, part_var, TDF_SLIM);
368*e4b17023SJohn Marino fprintf (debug, "\n");
369*e4b17023SJohn Marino }
370*e4b17023SJohn Marino stats.coalesced++;
371*e4b17023SJohn Marino replace_ssa_name_symbol (var, SSA_NAME_VAR (part_var));
372*e4b17023SJohn Marino }
373*e4b17023SJohn Marino
374*e4b17023SJohn Marino statistics_counter_event (cfun, "copies coalesced",
375*e4b17023SJohn Marino stats.coalesced);
376*e4b17023SJohn Marino delete_var_map (map);
377*e4b17023SJohn Marino return updated ? TODO_remove_unused_locals : 0;
378*e4b17023SJohn Marino }
379*e4b17023SJohn Marino
380*e4b17023SJohn Marino /* Return true if copy rename is to be performed. */
381*e4b17023SJohn Marino
382*e4b17023SJohn Marino static bool
gate_copyrename(void)383*e4b17023SJohn Marino gate_copyrename (void)
384*e4b17023SJohn Marino {
385*e4b17023SJohn Marino return flag_tree_copyrename != 0;
386*e4b17023SJohn Marino }
387*e4b17023SJohn Marino
388*e4b17023SJohn Marino struct gimple_opt_pass pass_rename_ssa_copies =
389*e4b17023SJohn Marino {
390*e4b17023SJohn Marino {
391*e4b17023SJohn Marino GIMPLE_PASS,
392*e4b17023SJohn Marino "copyrename", /* name */
393*e4b17023SJohn Marino gate_copyrename, /* gate */
394*e4b17023SJohn Marino rename_ssa_copies, /* execute */
395*e4b17023SJohn Marino NULL, /* sub */
396*e4b17023SJohn Marino NULL, /* next */
397*e4b17023SJohn Marino 0, /* static_pass_number */
398*e4b17023SJohn Marino TV_TREE_COPY_RENAME, /* tv_id */
399*e4b17023SJohn Marino PROP_cfg | PROP_ssa, /* properties_required */
400*e4b17023SJohn Marino 0, /* properties_provided */
401*e4b17023SJohn Marino 0, /* properties_destroyed */
402*e4b17023SJohn Marino 0, /* todo_flags_start */
403*e4b17023SJohn Marino TODO_verify_ssa /* todo_flags_finish */
404*e4b17023SJohn Marino }
405*e4b17023SJohn Marino };
406