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