]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-ter.c
Update Copyright years for files modified in 2011 and/or 2012.
[thirdparty/gcc.git] / gcc / tree-ssa-ter.c
CommitLineData
bdf50f60 1/* Routines for performing Temporary Expression Replacement (TER) in SSA trees.
71e45bc2 2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
ce084dfc 3 Free Software Foundation, Inc.
bdf50f60 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
8c4c00c1 10the Free Software Foundation; either version 3, or (at your option)
bdf50f60 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
8c4c00c1 19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
bdf50f60 21
22
23#include "config.h"
24#include "system.h"
25#include "coretypes.h"
26#include "tm.h"
27#include "tree.h"
ce084dfc 28#include "gimple-pretty-print.h"
bdf50f60 29#include "bitmap.h"
30#include "tree-flow.h"
b9ed1410 31#include "dumpfile.h"
bdf50f60 32#include "tree-ssa-live.h"
bff4202c 33#include "flags.h"
bdf50f60 34
35
36/* Temporary Expression Replacement (TER)
37
38 Replace SSA version variables during out-of-ssa with their defining
48e1416a 39 expression if there is only one use of the variable.
bdf50f60 40
41 This pass is required in order for the RTL expansion pass to see larger
42 chunks of code. This allows it to make better choices on RTL pattern
43 selection. When expand is rewritten and merged with out-of-ssa, and
48e1416a 44 understands SSA, this should be eliminated.
bdf50f60 45
46 A pass is made through the function, one block at a time. No cross block
47 information is tracked.
48
49 Variables which only have one use, and whose defining stmt is considered
50 a replaceable expression (see is_replaceable_p) are tracked to see whether
48e1416a 51 they can be replaced at their use location.
52
bdf50f60 53 n_12 = C * 10
54 a_2 = b_5 + 6
55 v_9 = a_2 * n_12
56
57 if there are the only use of n_12 and a_2, TER will substitute in their
58 expressions in v_9, and end up with:
59
60 v_9 = (b_5 + 6) * (C * 10)
61
62 which will then have the ssa_name assigned to regular variables, and the
f0b5f617 63 resulting code which will be passed to the expander looks something like:
bdf50f60 64
65 v = (b + 6) * (C * 10)
66
48e1416a 67
68 This requires ensuring that none of the variables used by the expression
69 change between the def point and where it is used. Furthermore, if any
70 of the ssa_names used in this expression are themselves replaceable, we
71 have to ensure none of that expressions' arguments change either.
72 Although SSA_NAMES themselves don't change, this pass is performed after
73 coalescing has coalesced different SSA_NAMES together, so there could be a
bdf50f60 74 definition of an SSA_NAME which is coalesced with a use that causes a
f0b5f617 75 problem, i.e.,
48e1416a 76
bdf50f60 77 PHI b_5 = <b_8(2), b_14(1)>
78 <...>
79 a_2 = b_5 + 6
80 b_8 = c_4 + 4
81 v_9 = a_2 * n_12
82 <...>
83
7920eed5 84 If b_5, b_8 and b_14 are all coalesced together...
bdf50f60 85 The expression b_5 + 6 CANNOT replace the use in the statement defining v_9
86 because b_8 is in fact killing the value of b_5 since they share a partition
7920eed5 87 and will be assigned the same memory or register location.
48e1416a 88
bdf50f60 89 TER implements this but stepping through the instructions in a block and
7920eed5 90 tracking potential expressions for replacement, and the partitions they are
bdf50f60 91 dependent on. Expressions are represented by the SSA_NAME_VERSION of the
75a70cf9 92 DEF on the LHS of a GIMPLE_ASSIGN and the expression is the RHS.
bdf50f60 93
94 When a stmt is determined to be a possible replacement expression, the
95 following steps are taken:
96
48e1416a 97 EXPR_DECL_UID bitmap is allocated and set to the base variable UID of the
98 def and any uses in the expression. non-NULL means the expression is being
bdf50f60 99 tracked. The UID's themselves are used to prevent TER substitution into
f0b5f617 100 accumulating sequences, i.e.,
101
bdf50f60 102 x = x + y
103 x = x + z
104 x = x + w
105 etc.
106 this can result in very large expressions which don't accomplish anything
48e1416a 107 see PR tree-optimization/17549.
bdf50f60 108
48e1416a 109 PARTITION_DEPENDENCIES is another bitmap array, and it has a bit set for any
bdf50f60 110 partition which is used in the expression. This is primarily used to remove
111 an expression from the partition kill lists when a decision is made whether
112 to replace it or not. This is indexed by ssa version number as well, and
113 indicates a partition number. virtual operands are not tracked individually,
7920eed5 114 but they are summarized by an artificial partition called VIRTUAL_PARTITION.
115 This means a MAY or MUST def will kill *ALL* expressions that are dependent
bdf50f60 116 on a virtual operand.
48e1416a 117 Note that the EXPR_DECL_UID and this bitmap represent very similar
bdf50f60 118 information, but the info in one is not easy to obtain from the other.
119
120 KILL_LIST is yet another bitmap array, this time it is indexed by partition
48e1416a 121 number, and represents a list of active expressions which will will no
bdf50f60 122 longer be valid if a definition into this partition takes place.
123
124 PARTITION_IN_USE is simply a bitmap which is used to track which partitions
48e1416a 125 currently have something in their kill list. This is used at the end of
bdf50f60 126 a block to clear out the KILL_LIST bitmaps at the end of each block.
127
48e1416a 128 NEW_REPLACEABLE_DEPENDENCIES is used as a temporary place to store
f0b5f617 129 dependencies which will be reused by the current definition. All the uses
bdf50f60 130 on an expression are processed before anything else is done. If a use is
131 determined to be a replaceable expression AND the current stmt is also going
132 to be replaceable, all the dependencies of this replaceable use will be
133 picked up by the current stmt's expression. Rather than recreate them, they
134 are simply copied here and then copied into the new expression when it is
135 processed.
136
137 a_2 = b_5 + 6
138 v_8 = a_2 + c_4
139
48e1416a 140 a_2's expression 'b_5 + 6' is determined to be replaceable at the use
bdf50f60 141 location. It is dependent on the partition 'b_5' is in. This is cached into
f0b5f617 142 the NEW_REPLACEABLE_DEPENDENCIES bitmap, and when v_8 is examined for
143 replaceability, it is a candidate, and it is dependent on the partition
bdf50f60 144 b_5 is in *NOT* a_2, as well as c_4's partition.
145
146 if v_8 is also replaceable:
147
148 x_9 = v_8 * 5
149
150 x_9 is dependent on partitions b_5, and c_4
48e1416a 151
152 if a statement is found which has either of those partitions written to
bdf50f60 153 before x_9 is used, then x_9 itself is NOT replaceable. */
154
155
156/* Temporary Expression Replacement (TER) table information. */
157
48e1416a 158typedef struct temp_expr_table_d
bdf50f60 159{
160 var_map map;
161 bitmap *partition_dependencies; /* Partitions expr is dependent on. */
dfdbf3fd 162 bitmap replaceable_expressions; /* Replacement expression table. */
bdf50f60 163 bitmap *expr_decl_uids; /* Base uids of exprs. */
164 bitmap *kill_list; /* Expr's killed by a partition. */
7920eed5 165 int virtual_partition; /* Pseudo partition for virtual ops. */
166 bitmap partition_in_use; /* Partitions with kill entries. */
bdf50f60 167 bitmap new_replaceable_dependencies; /* Holding place for pending dep's. */
168 int *num_in_part; /* # of ssa_names in a partition. */
b029d3b7 169 int *call_cnt; /* Call count at definition. */
bdf50f60 170} *temp_expr_table_p;
171
4fb5e5ca 172/* Used to indicate a dependency on VDEFs. */
bdf50f60 173#define VIRTUAL_PARTITION(table) (table->virtual_partition)
174
4fb07d00 175/* A place for the many, many bitmaps we create. */
176static bitmap_obstack ter_bitmap_obstack;
177
bdf50f60 178#ifdef ENABLE_CHECKING
179extern void debug_ter (FILE *, temp_expr_table_p);
180#endif
181
182
183/* Create a new TER table for MAP. */
184
185static temp_expr_table_p
186new_temp_expr_table (var_map map)
187{
188 temp_expr_table_p t;
189 unsigned x;
190
191 t = XNEW (struct temp_expr_table_d);
192 t->map = map;
193
194 t->partition_dependencies = XCNEWVEC (bitmap, num_ssa_names + 1);
195 t->expr_decl_uids = XCNEWVEC (bitmap, num_ssa_names + 1);
196 t->kill_list = XCNEWVEC (bitmap, num_var_partitions (map) + 1);
197
4fb07d00 198 t->partition_in_use = BITMAP_ALLOC (&ter_bitmap_obstack);
bdf50f60 199
200 t->virtual_partition = num_var_partitions (map);
4fb07d00 201 t->new_replaceable_dependencies = BITMAP_ALLOC (&ter_bitmap_obstack);
bdf50f60 202
203 t->replaceable_expressions = NULL;
204 t->num_in_part = XCNEWVEC (int, num_var_partitions (map));
205 for (x = 1; x < num_ssa_names; x++)
206 {
207 int p;
208 tree name = ssa_name (x);
209 if (!name)
210 continue;
211 p = var_to_partition (map, name);
212 if (p != NO_PARTITION)
213 t->num_in_part[p]++;
214 }
b029d3b7 215 t->call_cnt = XCNEWVEC (int, num_ssa_names + 1);
bdf50f60 216
217 return t;
218}
219
220
48e1416a 221/* Free TER table T. If there are valid replacements, return the expression
bdf50f60 222 vector. */
223
dfdbf3fd 224static bitmap
bdf50f60 225free_temp_expr_table (temp_expr_table_p t)
226{
dfdbf3fd 227 bitmap ret = NULL;
bdf50f60 228
229#ifdef ENABLE_CHECKING
230 unsigned x;
231 for (x = 0; x <= num_var_partitions (t->map); x++)
232 gcc_assert (!t->kill_list[x]);
0d3f8fd5 233 for (x = 0; x < num_ssa_names; x++)
464cc29a 234 {
235 gcc_assert (t->expr_decl_uids[x] == NULL);
236 gcc_assert (t->partition_dependencies[x] == NULL);
237 }
bdf50f60 238#endif
239
240 BITMAP_FREE (t->partition_in_use);
c2df357d 241 BITMAP_FREE (t->new_replaceable_dependencies);
bdf50f60 242
bdf50f60 243 free (t->expr_decl_uids);
bdf50f60 244 free (t->kill_list);
245 free (t->partition_dependencies);
c2df357d 246 free (t->num_in_part);
b029d3b7 247 free (t->call_cnt);
bdf50f60 248
249 if (t->replaceable_expressions)
250 ret = t->replaceable_expressions;
251
252 free (t);
253 return ret;
254}
255
256
257/* Return TRUE if VERSION is to be replaced by an expression in TAB. */
258
259static inline bool
260version_to_be_replaced_p (temp_expr_table_p tab, int version)
261{
262 if (!tab->replaceable_expressions)
263 return false;
dfdbf3fd 264 return bitmap_bit_p (tab->replaceable_expressions, version);
bdf50f60 265}
266
267
48e1416a 268/* Add partition P to the list if partitions VERSION is dependent on. TAB is
bdf50f60 269 the expression table */
270
271static inline void
272make_dependent_on_partition (temp_expr_table_p tab, int version, int p)
273{
274 if (!tab->partition_dependencies[version])
4fb07d00 275 tab->partition_dependencies[version] = BITMAP_ALLOC (&ter_bitmap_obstack);
bdf50f60 276
277 bitmap_set_bit (tab->partition_dependencies[version], p);
278}
279
280
281/* Add VER to the kill list for P. TAB is the expression table */
282
283static inline void
284add_to_partition_kill_list (temp_expr_table_p tab, int p, int ver)
285{
286 if (!tab->kill_list[p])
287 {
4fb07d00 288 tab->kill_list[p] = BITMAP_ALLOC (&ter_bitmap_obstack);
bdf50f60 289 bitmap_set_bit (tab->partition_in_use, p);
290 }
291 bitmap_set_bit (tab->kill_list[p], ver);
292}
293
294
48e1416a 295/* Remove VER from the partition kill list for P. TAB is the expression
bdf50f60 296 table. */
297
48e1416a 298static inline void
bdf50f60 299remove_from_partition_kill_list (temp_expr_table_p tab, int p, int version)
300{
1b4345f7 301 gcc_checking_assert (tab->kill_list[p]);
bdf50f60 302 bitmap_clear_bit (tab->kill_list[p], version);
303 if (bitmap_empty_p (tab->kill_list[p]))
304 {
305 bitmap_clear_bit (tab->partition_in_use, p);
306 BITMAP_FREE (tab->kill_list[p]);
307 }
308}
309
310
48e1416a 311/* Add a dependency between the def of ssa VERSION and VAR. If VAR is
312 replaceable by an expression, add a dependence each of the elements of the
bdf50f60 313 expression. These are contained in the new_replaceable list. TAB is the
314 expression table. */
315
316static void
317add_dependence (temp_expr_table_p tab, int version, tree var)
318{
319 int i;
320 bitmap_iterator bi;
321 unsigned x;
322
323 i = SSA_NAME_VERSION (var);
324 if (version_to_be_replaced_p (tab, i))
325 {
326 if (!bitmap_empty_p (tab->new_replaceable_dependencies))
327 {
48e1416a 328 /* Version will now be killed by a write to any partition the
bdf50f60 329 substituted expression would have been killed by. */
330 EXECUTE_IF_SET_IN_BITMAP (tab->new_replaceable_dependencies, 0, x, bi)
331 add_to_partition_kill_list (tab, x, version);
332
48e1416a 333 /* Rather than set partition_dependencies and in_use lists bit by
bdf50f60 334 bit, simply OR in the new_replaceable_dependencies bits. */
335 if (!tab->partition_dependencies[version])
4fb07d00 336 tab->partition_dependencies[version] =
337 BITMAP_ALLOC (&ter_bitmap_obstack);
48e1416a 338 bitmap_ior_into (tab->partition_dependencies[version],
bdf50f60 339 tab->new_replaceable_dependencies);
48e1416a 340 bitmap_ior_into (tab->partition_in_use,
bdf50f60 341 tab->new_replaceable_dependencies);
342 /* It is only necessary to add these once. */
343 bitmap_clear (tab->new_replaceable_dependencies);
344 }
345 }
346 else
347 {
348 i = var_to_partition (tab->map, var);
1b4345f7 349 gcc_checking_assert (i != NO_PARTITION);
350 gcc_checking_assert (tab->num_in_part[i] != 0);
bdf50f60 351 /* Only dependencies on ssa_names which are coalesced with something need
352 to be tracked. Partitions with containing only a single SSA_NAME
353 *cannot* have their value changed. */
354 if (tab->num_in_part[i] > 1)
355 {
356 add_to_partition_kill_list (tab, i, version);
357 make_dependent_on_partition (tab, version, i);
358 }
359 }
360}
361
362
351b6ccf 363/* Return TRUE if expression STMT is suitable for replacement.
364 TER is true if is_replaceable_p is called from within TER, false
365 when used from within stmt_is_replaceable_p, i.e. EXPAND_INITIALIZER
366 expansion. The differences are that with !TER some tests are skipped
367 to make it more aggressive (doesn't require the same bb, or for -O0
368 same locus and same BLOCK), on the other side never considers memory
369 loads as replaceable, because those don't ever lead into constant
370 expressions. */
bdf50f60 371
372static inline bool
351b6ccf 373is_replaceable_p (gimple stmt, bool ter)
bdf50f60 374{
bdf50f60 375 use_operand_p use_p;
75a70cf9 376 tree def;
377 gimple use_stmt;
bff4202c 378 location_t locus1, locus2;
379 tree block1, block2;
bdf50f60 380
381 /* Only consider modify stmts. */
75a70cf9 382 if (!is_gimple_assign (stmt))
bdf50f60 383 return false;
384
52dfd149 385 /* If the statement may throw an exception, it cannot be replaced. */
75a70cf9 386 if (stmt_could_throw_p (stmt))
52dfd149 387 return false;
388
bdf50f60 389 /* Punt if there is more than 1 def. */
390 def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF);
391 if (!def)
392 return false;
393
394 /* Only consider definitions which have a single use. */
395 if (!single_imm_use (def, &use_p, &use_stmt))
396 return false;
397
398 /* If the use isn't in this block, it wont be replaced either. */
351b6ccf 399 if (ter && gimple_bb (use_stmt) != gimple_bb (stmt))
bdf50f60 400 return false;
401
75a70cf9 402 locus1 = gimple_location (stmt);
403 block1 = gimple_block (stmt);
404
405 if (gimple_code (use_stmt) == GIMPLE_PHI)
bff4202c 406 {
407 locus2 = 0;
408 block2 = NULL_TREE;
409 }
410 else
411 {
75a70cf9 412 locus2 = gimple_location (use_stmt);
413 block2 = gimple_block (use_stmt);
bff4202c 414 }
415
416 if (!optimize
351b6ccf 417 && ter
bff4202c 418 && ((locus1 && locus1 != locus2) || (block1 && block1 != block2)))
419 return false;
420
bdf50f60 421 /* Used in this block, but at the TOP of the block, not the end. */
75a70cf9 422 if (gimple_code (use_stmt) == GIMPLE_PHI)
bdf50f60 423 return false;
424
4fb5e5ca 425 /* There must be no VDEFs. */
dd277d48 426 if (gimple_vdef (stmt))
bdf50f60 427 return false;
428
bff4202c 429 /* Without alias info we can't move around loads. */
351b6ccf 430 if ((!optimize || !ter)
7d9a35b8 431 && gimple_assign_single_p (stmt)
432 && !is_gimple_val (gimple_assign_rhs1 (stmt)))
bff4202c 433 return false;
434
bdf50f60 435 /* Float expressions must go through memory if float-store is on. */
48e1416a 436 if (flag_float_store
75a70cf9 437 && FLOAT_TYPE_P (gimple_expr_type (stmt)))
bdf50f60 438 return false;
439
dac21d57 440 /* An assignment with a register variable on the RHS is not
441 replaceable. */
75a70cf9 442 if (gimple_assign_rhs_code (stmt) == VAR_DECL
443 && DECL_HARD_REGISTER (gimple_assign_rhs1 (stmt)))
dac21d57 444 return false;
445
abfb4f34 446 /* No function calls can be replaced. */
75a70cf9 447 if (is_gimple_call (stmt))
abfb4f34 448 return false;
bdf50f60 449
d819917f 450 /* Leave any stmt with volatile operands alone as well. */
75a70cf9 451 if (gimple_has_volatile_ops (stmt))
bdf50f60 452 return false;
bdf50f60 453
454 return true;
455}
456
457
351b6ccf 458/* Variant of is_replaceable_p test for use in EXPAND_INITIALIZER
459 expansion. */
460
461bool
462stmt_is_replaceable_p (gimple stmt)
463{
464 return is_replaceable_p (stmt, false);
465}
466
467
48e1416a 468/* This function will remove the expression for VERSION from replacement
469 consideration in table TAB. If FREE_EXPR is true, then remove the
bdf50f60 470 expression from consideration as well by freeing the decl uid bitmap. */
471
472static void
473finished_with_expr (temp_expr_table_p tab, int version, bool free_expr)
474{
475 unsigned i;
476 bitmap_iterator bi;
477
478 /* Remove this expression from its dependent lists. The partition dependence
9d75589a 479 list is retained and transferred later to whomever uses this version. */
bdf50f60 480 if (tab->partition_dependencies[version])
481 {
482 EXECUTE_IF_SET_IN_BITMAP (tab->partition_dependencies[version], 0, i, bi)
483 remove_from_partition_kill_list (tab, i, version);
484 BITMAP_FREE (tab->partition_dependencies[version]);
485 }
486 if (free_expr)
487 BITMAP_FREE (tab->expr_decl_uids[version]);
488}
489
490
0b7780cd 491/* Create an expression entry for a replaceable expression. */
bdf50f60 492
48e1416a 493static void
b029d3b7 494process_replaceable (temp_expr_table_p tab, gimple stmt, int call_cnt)
bdf50f60 495{
496 tree var, def, basevar;
497 int version;
498 ssa_op_iter iter;
499 bitmap def_vars, use_vars;
500
351b6ccf 501 gcc_checking_assert (is_replaceable_p (stmt, true));
bdf50f60 502
503 def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF);
504 version = SSA_NAME_VERSION (def);
4fb07d00 505 def_vars = BITMAP_ALLOC (&ter_bitmap_obstack);
bdf50f60 506
ec11736b 507 basevar = SSA_NAME_VAR (def);
508 if (basevar)
509 bitmap_set_bit (def_vars, DECL_UID (basevar));
bdf50f60 510
511 /* Add this expression to the dependency list for each use partition. */
512 FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
513 {
514 int var_version = SSA_NAME_VERSION (var);
515
516 use_vars = tab->expr_decl_uids[var_version];
517 add_dependence (tab, version, var);
518 if (use_vars)
519 {
520 bitmap_ior_into (def_vars, use_vars);
521 BITMAP_FREE (tab->expr_decl_uids[var_version]);
522 }
ec11736b 523 else if (SSA_NAME_VAR (var))
bdf50f60 524 bitmap_set_bit (def_vars, DECL_UID (SSA_NAME_VAR (var)));
525 }
526 tab->expr_decl_uids[version] = def_vars;
527
528 /* If there are VUSES, add a dependence on virtual defs. */
dd277d48 529 if (gimple_vuse (stmt))
bdf50f60 530 {
531 make_dependent_on_partition (tab, version, VIRTUAL_PARTITION (tab));
532 add_to_partition_kill_list (tab, VIRTUAL_PARTITION (tab), version);
533 }
b029d3b7 534
535 tab->call_cnt[version] = call_cnt;
bdf50f60 536}
537
538
539/* This function removes any expression in TAB which is dependent on PARTITION
540 from consideration, making it not replaceable. */
541
542static inline void
543kill_expr (temp_expr_table_p tab, int partition)
544{
545 unsigned version;
546
48e1416a 547 /* Mark every active expr dependent on this var as not replaceable.
bdf50f60 548 finished_with_expr can modify the bitmap, so we can't execute over it. */
549 while (tab->kill_list[partition])
550 {
551 version = bitmap_first_set_bit (tab->kill_list[partition]);
552 finished_with_expr (tab, version, true);
553 }
554
1b4345f7 555 gcc_checking_assert (!tab->kill_list[partition]);
bdf50f60 556}
557
558
48e1416a 559/* This function kills all expressions in TAB which are dependent on virtual
bdf50f60 560 partitions. */
561
562static inline void
563kill_virtual_exprs (temp_expr_table_p tab)
564{
565 kill_expr (tab, VIRTUAL_PARTITION (tab));
566}
567
568
569/* Mark the expression associated with VAR as replaceable, and enter
f0b5f617 570 the defining stmt into the partition_dependencies table TAB. If
bdf50f60 571 MORE_REPLACING is true, accumulate the pending partition dependencies. */
572
573static void
574mark_replaceable (temp_expr_table_p tab, tree var, bool more_replacing)
575{
576 int version = SSA_NAME_VERSION (var);
577
578 /* Move the dependence list to the pending listpending. */
579 if (more_replacing && tab->partition_dependencies[version])
48e1416a 580 bitmap_ior_into (tab->new_replaceable_dependencies,
bdf50f60 581 tab->partition_dependencies[version]);
582
583 finished_with_expr (tab, version, !more_replacing);
584
4fb07d00 585 /* Set the replaceable expression.
586 The bitmap for this "escapes" from this file so it's allocated
587 on the default obstack. */
bdf50f60 588 if (!tab->replaceable_expressions)
dfdbf3fd 589 tab->replaceable_expressions = BITMAP_ALLOC (NULL);
590 bitmap_set_bit (tab->replaceable_expressions, version);
bdf50f60 591}
592
593
594/* This function processes basic block BB, and looks for variables which can
595 be replaced by their expressions. Results are stored in the table TAB. */
596
597static void
598find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb)
599{
75a70cf9 600 gimple_stmt_iterator bsi;
601 gimple stmt;
b029d3b7 602 tree def, use, fndecl;
bdf50f60 603 int partition;
604 var_map map = tab->map;
605 ssa_op_iter iter;
606 bool stmt_replaceable;
b029d3b7 607 int cur_call_cnt = 0;
bdf50f60 608
75a70cf9 609 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
bdf50f60 610 {
75a70cf9 611 stmt = gsi_stmt (bsi);
bdf50f60 612
9845d120 613 if (is_gimple_debug (stmt))
614 continue;
615
351b6ccf 616 stmt_replaceable = is_replaceable_p (stmt, true);
75a70cf9 617
bdf50f60 618 /* Determine if this stmt finishes an existing expression. */
619 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
620 {
621 unsigned ver = SSA_NAME_VERSION (use);
622
623 /* If this use is a potential replacement variable, process it. */
624 if (tab->expr_decl_uids[ver])
625 {
626 bool same_root_var = false;
627 ssa_op_iter iter2;
628 bitmap vars = tab->expr_decl_uids[ver];
629
630 /* See if the root variables are the same. If they are, we
631 do not want to do the replacement to avoid problems with
632 code size, see PR tree-optimization/17549. */
633 if (!bitmap_empty_p (vars))
634 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter2, SSA_OP_DEF)
635 {
ec11736b 636 if (SSA_NAME_VAR (def)
637 && bitmap_bit_p (vars, DECL_UID (SSA_NAME_VAR (def))))
bdf50f60 638 {
639 same_root_var = true;
640 break;
641 }
642 }
643
182cf5a9 644 /* If the stmt does a memory store and the replacement
645 is a load aliasing it avoid creating overlapping
646 assignments which we cannot expand correctly. */
647 if (gimple_vdef (stmt)
648 && gimple_assign_single_p (stmt))
649 {
650 gimple def_stmt = SSA_NAME_DEF_STMT (use);
651 while (is_gimple_assign (def_stmt)
652 && gimple_assign_rhs_code (def_stmt) == SSA_NAME)
653 def_stmt
654 = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (def_stmt));
655 if (gimple_vuse (def_stmt)
656 && gimple_assign_single_p (def_stmt)
657 && refs_may_alias_p (gimple_assign_lhs (stmt),
658 gimple_assign_rhs1 (def_stmt)))
659 same_root_var = true;
660 }
661
b029d3b7 662 /* Mark expression as replaceable unless stmt is volatile, or the
48e1416a 663 def variable has the same root variable as something in the
b029d3b7 664 substitution list, or the def and use span a call such that
665 we'll expand lifetimes across a call. */
9f80d051 666 if (gimple_has_volatile_ops (stmt) || same_root_var
667 || (tab->call_cnt[ver] != cur_call_cnt
668 && SINGLE_SSA_USE_OPERAND (SSA_NAME_DEF_STMT (use), SSA_OP_USE)
669 == NULL_USE_OPERAND_P))
bdf50f60 670 finished_with_expr (tab, ver, true);
671 else
672 mark_replaceable (tab, use, stmt_replaceable);
673 }
674 }
48e1416a 675
bdf50f60 676 /* Next, see if this stmt kills off an active expression. */
677 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
678 {
679 partition = var_to_partition (map, def);
680 if (partition != NO_PARTITION && tab->kill_list[partition])
681 kill_expr (tab, partition);
682 }
683
b029d3b7 684 /* Increment counter if this is a non BUILT_IN call. We allow
685 replacement over BUILT_IN calls since many will expand to inline
686 insns instead of a true call. */
687 if (is_gimple_call (stmt)
688 && !((fndecl = gimple_call_fndecl (stmt))
689 && DECL_BUILT_IN (fndecl)))
690 cur_call_cnt++;
691
bdf50f60 692 /* Now see if we are creating a new expression or not. */
693 if (stmt_replaceable)
b029d3b7 694 process_replaceable (tab, stmt, cur_call_cnt);
bdf50f60 695
696 /* Free any unused dependency lists. */
697 bitmap_clear (tab->new_replaceable_dependencies);
698
699 /* A V_{MAY,MUST}_DEF kills any expression using a virtual operand,
700 including the current stmt. */
dd277d48 701 if (gimple_vdef (stmt))
bdf50f60 702 kill_virtual_exprs (tab);
703 }
704}
705
706
707/* This function is the driver routine for replacement of temporary expressions
48e1416a 708 in the SSA->normal phase, operating on MAP. If there are replaceable
709 expressions, a table is returned which maps SSA versions to the
710 expressions they should be replaced with. A NULL_TREE indicates no
711 replacement should take place. If there are no replacements at all,
bdf50f60 712 NULL is returned by the function, otherwise an expression vector indexed
713 by SSA_NAME version numbers. */
714
4fb07d00 715bitmap
bdf50f60 716find_replaceable_exprs (var_map map)
717{
718 basic_block bb;
719 temp_expr_table_p table;
dfdbf3fd 720 bitmap ret;
bdf50f60 721
4fb07d00 722 bitmap_obstack_initialize (&ter_bitmap_obstack);
bdf50f60 723 table = new_temp_expr_table (map);
724 FOR_EACH_BB (bb)
725 {
726 find_replaceable_in_bb (table, bb);
1b4345f7 727 gcc_checking_assert (bitmap_empty_p (table->partition_in_use));
bdf50f60 728 }
bdf50f60 729 ret = free_temp_expr_table (table);
4fb07d00 730 bitmap_obstack_release (&ter_bitmap_obstack);
bdf50f60 731 return ret;
48e1416a 732}
bdf50f60 733
734/* Dump TER expression table EXPR to file F. */
735
75a70cf9 736void
dfdbf3fd 737dump_replaceable_exprs (FILE *f, bitmap expr)
bdf50f60 738{
75a70cf9 739 tree var;
740 unsigned x;
bdf50f60 741
742 fprintf (f, "\nReplacing Expressions\n");
75a70cf9 743 for (x = 0; x < num_ssa_names; x++)
dfdbf3fd 744 if (bitmap_bit_p (expr, x))
bdf50f60 745 {
75a70cf9 746 var = ssa_name (x);
bdf50f60 747 print_generic_expr (f, var, TDF_SLIM);
748 fprintf (f, " replace with --> ");
dfdbf3fd 749 print_gimple_stmt (f, SSA_NAME_DEF_STMT (var), 0, TDF_SLIM);
bdf50f60 750 fprintf (f, "\n");
751 }
752 fprintf (f, "\n");
753}
754
755
756#ifdef ENABLE_CHECKING
757/* Dump the status of the various tables in the expression table. This is used
758 exclusively to debug TER. F is the place to send debug info and T is the
759 table being debugged. */
760
4b987fac 761DEBUG_FUNCTION void
bdf50f60 762debug_ter (FILE *f, temp_expr_table_p t)
763{
764 unsigned x, y;
765 bitmap_iterator bi;
766
48e1416a 767 fprintf (f, "\nDumping current state of TER\n virtual partition = %d\n",
bdf50f60 768 VIRTUAL_PARTITION (t));
769 if (t->replaceable_expressions)
770 dump_replaceable_exprs (f, t->replaceable_expressions);
771 fprintf (f, "Currently tracking the following expressions:\n");
772
773 for (x = 1; x < num_ssa_names; x++)
774 if (t->expr_decl_uids[x])
775 {
b029d3b7 776 print_generic_expr (f, ssa_name (x), TDF_SLIM);
bdf50f60 777 fprintf (f, " dep-parts : ");
48e1416a 778 if (t->partition_dependencies[x]
bdf50f60 779 && !bitmap_empty_p (t->partition_dependencies[x]))
780 {
781 EXECUTE_IF_SET_IN_BITMAP (t->partition_dependencies[x], 0, y, bi)
782 fprintf (f, "P%d ",y);
783 }
b029d3b7 784 fprintf (f, " basedecls: ");
bdf50f60 785 EXECUTE_IF_SET_IN_BITMAP (t->expr_decl_uids[x], 0, y, bi)
786 fprintf (f, "%d ",y);
b029d3b7 787 fprintf (f, " call_cnt : %d",t->call_cnt[x]);
788 fprintf (f, "\n");
bdf50f60 789 }
790
48e1416a 791 bitmap_print (f, t->partition_in_use, "Partitions in use ",
bdf50f60 792 "\npartition KILL lists:\n");
793
794 for (x = 0; x <= num_var_partitions (t->map); x++)
795 if (t->kill_list[x])
796 {
797 fprintf (f, "Partition %d : ", x);
798 EXECUTE_IF_SET_IN_BITMAP (t->kill_list[x], 0, y, bi)
799 fprintf (f, "_%d ",y);
800 }
801
802 fprintf (f, "\n----------\n");
803}
804#endif