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