]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-sink.c
invoke.texi (-fvar-tracking-assignments): New.
[thirdparty/gcc.git] / gcc / tree-ssa-sink.c
CommitLineData
ec1e9f7c 1/* Code sinking for trees
66647d44 2 Copyright (C) 2001, 2002, 2003, 2004, 2007, 2008, 2009
fc3103e7 3 Free Software Foundation, Inc.
ec1e9f7c
DB
4 Contributed by Daniel Berlin <dan@dberlin.org>
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)
ec1e9f7c
DB
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/>. */
ec1e9f7c
DB
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
25#include "tm.h"
ec1e9f7c
DB
26#include "ggc.h"
27#include "tree.h"
28#include "basic-block.h"
29#include "diagnostic.h"
30#include "tree-inline.h"
31#include "tree-flow.h"
726a989a 32#include "gimple.h"
ec1e9f7c
DB
33#include "tree-dump.h"
34#include "timevar.h"
35#include "fibheap.h"
36#include "hashtab.h"
37#include "tree-iterator.h"
38#include "real.h"
39#include "alloc-pool.h"
40#include "tree-pass.h"
41#include "flags.h"
42#include "bitmap.h"
43#include "langhooks.h"
44#include "cfgloop.h"
45
46/* TODO:
47 1. Sinking store only using scalar promotion (IE without moving the RHS):
48
49 *q = p;
50 p = p + 1;
51 if (something)
52 *q = <not p>;
53 else
54 y = *q;
55
56
57 should become
58 sinktemp = p;
59 p = p + 1;
60 if (something)
61 *q = <not p>;
62 else
63 {
64 *q = sinktemp;
65 y = *q
66 }
67 Store copy propagation will take care of the store elimination above.
68
69
70 2. Sinking using Partial Dead Code Elimination. */
71
72
73static struct
74{
6c6cfbfd 75 /* The number of statements sunk down the flowgraph by code sinking. */
ec1e9f7c
DB
76 int sunk;
77
78} sink_stats;
79
80
f652d14b 81/* Given a PHI, and one of its arguments (DEF), find the edge for
ec1e9f7c
DB
82 that argument and return it. If the argument occurs twice in the PHI node,
83 we return NULL. */
84
85static basic_block
726a989a 86find_bb_for_arg (gimple phi, tree def)
ec1e9f7c 87{
726a989a 88 size_t i;
ec1e9f7c
DB
89 bool foundone = false;
90 basic_block result = NULL;
726a989a 91 for (i = 0; i < gimple_phi_num_args (phi); i++)
ec1e9f7c
DB
92 if (PHI_ARG_DEF (phi, i) == def)
93 {
94 if (foundone)
95 return NULL;
96 foundone = true;
726a989a 97 result = gimple_phi_arg_edge (phi, i)->src;
ec1e9f7c
DB
98 }
99 return result;
100}
101
102/* When the first immediate use is in a statement, then return true if all
103 immediate uses in IMM are in the same statement.
104 We could also do the case where the first immediate use is in a phi node,
105 and all the other uses are in phis in the same basic block, but this
106 requires some expensive checking later (you have to make sure no def/vdef
107 in the statement occurs for multiple edges in the various phi nodes it's
6c6cfbfd 108 used in, so that you only have one place you can sink it to. */
ec1e9f7c
DB
109
110static bool
726a989a 111all_immediate_uses_same_place (gimple stmt)
ec1e9f7c 112{
726a989a 113 gimple firstuse = NULL;
f430bae8
AM
114 ssa_op_iter op_iter;
115 imm_use_iterator imm_iter;
116 use_operand_p use_p;
117 tree var;
ec1e9f7c 118
f430bae8 119 FOR_EACH_SSA_TREE_OPERAND (var, stmt, op_iter, SSA_OP_ALL_DEFS)
ec1e9f7c 120 {
f430bae8
AM
121 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
122 {
b5b8b0ac
AO
123 if (is_gimple_debug (USE_STMT (use_p)))
124 continue;
726a989a 125 if (firstuse == NULL)
f430bae8
AM
126 firstuse = USE_STMT (use_p);
127 else
128 if (firstuse != USE_STMT (use_p))
129 return false;
130 }
ec1e9f7c 131 }
f430bae8 132
ec1e9f7c
DB
133 return true;
134}
135
38635499 136/* Some global stores don't necessarily have VDEF's of global variables,
ec1e9f7c
DB
137 but we still must avoid moving them around. */
138
139bool
726a989a 140is_hidden_global_store (gimple stmt)
ec1e9f7c 141{
ec1e9f7c 142 /* Check virtual definitions. If we get here, the only virtual
726a989a 143 definitions we should see are those generated by assignment or call
ec1e9f7c 144 statements. */
5006671f 145 if (gimple_vdef (stmt))
ec1e9f7c
DB
146 {
147 tree lhs;
148
726a989a 149 gcc_assert (is_gimple_assign (stmt) || is_gimple_call (stmt));
ec1e9f7c
DB
150
151 /* Note that we must not check the individual virtual operands
152 here. In particular, if this is an aliased store, we could
153 end up with something like the following (SSA notation
154 redacted for brevity):
155
156 foo (int *p, int i)
157 {
158 int x;
159 p_1 = (i_2 > 3) ? &x : p;
160
38635499 161 # x_4 = VDEF <x_3>
ec1e9f7c
DB
162 *p_1 = 5;
163
164 return 2;
165 }
166
167 Notice that the store to '*p_1' should be preserved, if we
168 were to check the virtual definitions in that store, we would
169 not mark it needed. This is because 'x' is not a global
170 variable.
171
172 Therefore, we check the base address of the LHS. If the
18cd8a03 173 address is a pointer, we check if its name tag or symbol tag is
ec1e9f7c
DB
174 a global variable. Otherwise, we check if the base variable
175 is a global. */
726a989a
RB
176 lhs = gimple_get_lhs (stmt);
177
ec1e9f7c
DB
178 if (REFERENCE_CLASS_P (lhs))
179 lhs = get_base_address (lhs);
180
181 if (lhs == NULL_TREE)
182 {
183 /* If LHS is NULL, it means that we couldn't get the base
184 address of the reference. In which case, we should not
185 move this store. */
186 return true;
187 }
188 else if (DECL_P (lhs))
189 {
190 /* If the store is to a global symbol, we need to keep it. */
191 if (is_global_var (lhs))
192 return true;
193
194 }
195 else if (INDIRECT_REF_P (lhs))
5006671f 196 return ptr_deref_may_alias_global_p (TREE_OPERAND (lhs, 0));
ec1e9f7c
DB
197 else
198 gcc_unreachable ();
199 }
38635499 200
ec1e9f7c
DB
201 return false;
202}
203
204/* Find the nearest common dominator of all of the immediate uses in IMM. */
205
206static basic_block
b5b8b0ac 207nearest_common_dominator_of_uses (gimple stmt, bool *debug_stmts)
ec1e9f7c
DB
208{
209 bitmap blocks = BITMAP_ALLOC (NULL);
210 basic_block commondom;
ec1e9f7c
DB
211 unsigned int j;
212 bitmap_iterator bi;
f430bae8
AM
213 ssa_op_iter op_iter;
214 imm_use_iterator imm_iter;
215 use_operand_p use_p;
216 tree var;
217
ec1e9f7c 218 bitmap_clear (blocks);
f430bae8 219 FOR_EACH_SSA_TREE_OPERAND (var, stmt, op_iter, SSA_OP_ALL_DEFS)
ec1e9f7c 220 {
f430bae8
AM
221 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
222 {
726a989a 223 gimple usestmt = USE_STMT (use_p);
f430bae8 224 basic_block useblock;
000b62dc 225
726a989a 226 if (gimple_code (usestmt) == GIMPLE_PHI)
f430bae8 227 {
55b12f0d 228 int idx = PHI_ARG_INDEX_FROM_USE (use_p);
ab798313 229
726a989a 230 useblock = gimple_phi_arg_edge (usestmt, idx)->src;
f430bae8 231 }
b5b8b0ac
AO
232 else if (is_gimple_debug (usestmt))
233 {
234 *debug_stmts = true;
235 continue;
236 }
f430bae8 237 else
ec1e9f7c 238 {
726a989a 239 useblock = gimple_bb (usestmt);
000b62dc 240 }
f430bae8 241
000b62dc
KH
242 /* Short circuit. Nothing dominates the entry block. */
243 if (useblock == ENTRY_BLOCK_PTR)
244 {
245 BITMAP_FREE (blocks);
246 return NULL;
ec1e9f7c 247 }
000b62dc 248 bitmap_set_bit (blocks, useblock->index);
ec1e9f7c 249 }
ec1e9f7c
DB
250 }
251 commondom = BASIC_BLOCK (bitmap_first_set_bit (blocks));
252 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, j, bi)
253 commondom = nearest_common_dominator (CDI_DOMINATORS, commondom,
254 BASIC_BLOCK (j));
255 BITMAP_FREE (blocks);
256 return commondom;
257}
258
259/* Given a statement (STMT) and the basic block it is currently in (FROMBB),
260 determine the location to sink the statement to, if any.
726a989a
RB
261 Returns true if there is such location; in that case, TOGSI points to the
262 statement before that STMT should be moved. */
ec1e9f7c 263
18965703 264static bool
726a989a
RB
265statement_sink_location (gimple stmt, basic_block frombb,
266 gimple_stmt_iterator *togsi)
ec1e9f7c 267{
726a989a
RB
268 gimple use;
269 tree def;
f430bae8 270 use_operand_p one_use = NULL_USE_OPERAND_P;
ec1e9f7c
DB
271 basic_block sinkbb;
272 use_operand_p use_p;
273 def_operand_p def_p;
274 ssa_op_iter iter;
f430bae8 275 imm_use_iterator imm_iter;
726a989a 276 enum tree_code code;
f430bae8
AM
277
278 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
279 {
280 FOR_EACH_IMM_USE_FAST (one_use, imm_iter, def)
281 {
b5b8b0ac
AO
282 if (is_gimple_debug (USE_STMT (one_use)))
283 continue;
284
f430bae8
AM
285 break;
286 }
287 if (one_use != NULL_USE_OPERAND_P)
288 break;
289 }
ec1e9f7c 290
f430bae8
AM
291 /* Return if there are no immediate uses of this stmt. */
292 if (one_use == NULL_USE_OPERAND_P)
18965703 293 return false;
ec1e9f7c 294
726a989a 295 if (gimple_code (stmt) != GIMPLE_ASSIGN)
18965703 296 return false;
ec1e9f7c
DB
297
298 /* There are a few classes of things we can't or don't move, some because we
299 don't have code to handle it, some because it's not profitable and some
300 because it's not legal.
301
302 We can't sink things that may be global stores, at least not without
303 calculating a lot more information, because we may cause it to no longer
304 be seen by an external routine that needs it depending on where it gets
305 moved to.
306
307 We don't want to sink loads from memory.
308
309 We can't sink statements that end basic blocks without splitting the
310 incoming edge for the sink location to place it there.
311
312 We can't sink statements that have volatile operands.
313
314 We don't want to sink dead code, so anything with 0 immediate uses is not
fc3103e7
JJ
315 sunk.
316
317 Don't sink BLKmode assignments if current function has any local explicit
318 register variables, as BLKmode assignments may involve memcpy or memset
319 calls or, on some targets, inline expansion thereof that sometimes need
320 to use specific hard registers.
ec1e9f7c
DB
321
322 */
726a989a 323 code = gimple_assign_rhs_code (stmt);
f47c96aa 324 if (stmt_ends_bb_p (stmt)
726a989a
RB
325 || gimple_has_side_effects (stmt)
326 || code == EXC_PTR_EXPR
327 || code == FILTER_EXPR
ec1e9f7c 328 || is_hidden_global_store (stmt)
726a989a 329 || gimple_has_volatile_ops (stmt)
5006671f 330 || gimple_vuse (stmt)
fc3103e7
JJ
331 || (cfun->has_local_explicit_reg_vars
332 && TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))) == BLKmode))
18965703 333 return false;
ec1e9f7c
DB
334
335 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
336 {
337 tree def = DEF_FROM_PTR (def_p);
338 if (is_global_var (SSA_NAME_VAR (def))
339 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
18965703 340 return false;
ec1e9f7c
DB
341 }
342
343 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
344 {
345 tree use = USE_FROM_PTR (use_p);
346 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use))
18965703 347 return false;
ec1e9f7c
DB
348 }
349
350 /* If all the immediate uses are not in the same place, find the nearest
351 common dominator of all the immediate uses. For PHI nodes, we have to
352 find the nearest common dominator of all of the predecessor blocks, since
353 that is where insertion would have to take place. */
f430bae8 354 if (!all_immediate_uses_same_place (stmt))
ec1e9f7c 355 {
b5b8b0ac
AO
356 bool debug_stmts = false;
357 basic_block commondom = nearest_common_dominator_of_uses (stmt,
358 &debug_stmts);
ec1e9f7c
DB
359
360 if (commondom == frombb)
18965703 361 return false;
ec1e9f7c
DB
362
363 /* Our common dominator has to be dominated by frombb in order to be a
364 trivially safe place to put this statement, since it has multiple
365 uses. */
366 if (!dominated_by_p (CDI_DOMINATORS, commondom, frombb))
18965703 367 return false;
ec1e9f7c
DB
368
369 /* It doesn't make sense to move to a dominator that post-dominates
370 frombb, because it means we've just moved it into a path that always
371 executes if frombb executes, instead of reducing the number of
372 executions . */
373 if (dominated_by_p (CDI_POST_DOMINATORS, frombb, commondom))
374 {
375 if (dump_file && (dump_flags & TDF_DETAILS))
376 fprintf (dump_file, "Not moving store, common dominator post-dominates from block.\n");
18965703 377 return false;
ec1e9f7c
DB
378 }
379
380 if (commondom == frombb || commondom->loop_depth > frombb->loop_depth)
18965703 381 return false;
ec1e9f7c
DB
382 if (dump_file && (dump_flags & TDF_DETAILS))
383 {
384 fprintf (dump_file, "Common dominator of all uses is %d\n",
385 commondom->index);
386 }
b5b8b0ac 387
726a989a 388 *togsi = gsi_after_labels (commondom);
b5b8b0ac
AO
389
390 if (debug_stmts)
391 propagate_defs_into_debug_stmts (stmt, commondom, togsi);
392
18965703 393 return true;
ec1e9f7c
DB
394 }
395
f430bae8 396 use = USE_STMT (one_use);
726a989a 397 if (gimple_code (use) != GIMPLE_PHI)
ec1e9f7c 398 {
726a989a 399 sinkbb = gimple_bb (use);
ec1e9f7c
DB
400 if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth
401 || sinkbb->loop_father != frombb->loop_father)
18965703 402 return false;
726a989a 403
791b59e3
WG
404 /* Move the expression to a post dominator can't reduce the number of
405 executions. */
406 if (dominated_by_p (CDI_POST_DOMINATORS, frombb, sinkbb))
407 return false;
408
726a989a 409 *togsi = gsi_for_stmt (use);
b5b8b0ac
AO
410
411 propagate_defs_into_debug_stmts (stmt, sinkbb, togsi);
412
18965703 413 return true;
ec1e9f7c
DB
414 }
415
416 /* Note that at this point, all uses must be in the same statement, so it
f47c96aa
AM
417 doesn't matter which def op we choose, pick the first one. */
418 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
419 break;
420
ec1e9f7c
DB
421 sinkbb = find_bb_for_arg (use, def);
422 if (!sinkbb)
18965703 423 return false;
ec1e9f7c
DB
424
425 /* This will happen when you have
426 a_3 = PHI <a_13, a_26>
427
38635499 428 a_26 = VDEF <a_3>
ec1e9f7c
DB
429
430 If the use is a phi, and is in the same bb as the def,
431 we can't sink it. */
432
726a989a 433 if (gimple_bb (use) == frombb)
18965703 434 return false;
ec1e9f7c
DB
435 if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth
436 || sinkbb->loop_father != frombb->loop_father)
18965703
ZD
437 return false;
438
791b59e3
WG
439 /* Move the expression to a post dominator can't reduce the number of
440 executions. */
441 if (dominated_by_p (CDI_POST_DOMINATORS, frombb, sinkbb))
442 return false;
443
726a989a 444 *togsi = gsi_after_labels (sinkbb);
ec1e9f7c 445
b5b8b0ac
AO
446 propagate_defs_into_debug_stmts (stmt, sinkbb, togsi);
447
18965703 448 return true;
ec1e9f7c
DB
449}
450
451/* Perform code sinking on BB */
452
453static void
454sink_code_in_bb (basic_block bb)
455{
456 basic_block son;
726a989a 457 gimple_stmt_iterator gsi;
ec1e9f7c
DB
458 edge_iterator ei;
459 edge e;
9a287593 460 bool last = true;
ec1e9f7c
DB
461
462 /* If this block doesn't dominate anything, there can't be any place to sink
463 the statements to. */
464 if (first_dom_son (CDI_DOMINATORS, bb) == NULL)
465 goto earlyout;
466
467 /* We can't move things across abnormal edges, so don't try. */
468 FOR_EACH_EDGE (e, ei, bb->succs)
469 if (e->flags & EDGE_ABNORMAL)
470 goto earlyout;
471
726a989a 472 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);)
ec1e9f7c 473 {
726a989a
RB
474 gimple stmt = gsi_stmt (gsi);
475 gimple_stmt_iterator togsi;
18965703 476
726a989a 477 if (!statement_sink_location (stmt, bb, &togsi))
ec1e9f7c 478 {
726a989a
RB
479 if (!gsi_end_p (gsi))
480 gsi_prev (&gsi);
9a287593 481 last = false;
ec1e9f7c
DB
482 continue;
483 }
484 if (dump_file)
485 {
486 fprintf (dump_file, "Sinking ");
726a989a 487 print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS);
ec1e9f7c 488 fprintf (dump_file, " from bb %d to bb %d\n",
726a989a 489 bb->index, (gsi_bb (togsi))->index);
ec1e9f7c 490 }
ec1e9f7c
DB
491
492 /* If this is the end of the basic block, we need to insert at the end
493 of the basic block. */
726a989a
RB
494 if (gsi_end_p (togsi))
495 gsi_move_to_bb_end (&gsi, gsi_bb (togsi));
ec1e9f7c 496 else
726a989a 497 gsi_move_before (&gsi, &togsi);
ec1e9f7c
DB
498
499 sink_stats.sunk++;
9a287593
AO
500
501 /* If we've just removed the last statement of the BB, the
726a989a 502 gsi_end_p() test below would fail, but gsi_prev() would have
9a287593
AO
503 succeeded, and we want it to succeed. So we keep track of
504 whether we're at the last statement and pick up the new last
505 statement. */
506 if (last)
507 {
726a989a 508 gsi = gsi_last_bb (bb);
9a287593
AO
509 continue;
510 }
511
512 last = false;
726a989a
RB
513 if (!gsi_end_p (gsi))
514 gsi_prev (&gsi);
ec1e9f7c
DB
515
516 }
517 earlyout:
518 for (son = first_dom_son (CDI_POST_DOMINATORS, bb);
519 son;
520 son = next_dom_son (CDI_POST_DOMINATORS, son))
521 {
522 sink_code_in_bb (son);
523 }
524}
525
526/* Perform code sinking.
527 This moves code down the flowgraph when we know it would be
528 profitable to do so, or it wouldn't increase the number of
529 executions of the statement.
530
531 IE given
532
533 a_1 = b + c;
534 if (<something>)
535 {
536 }
537 else
538 {
539 foo (&b, &c);
540 a_5 = b + c;
541 }
542 a_6 = PHI (a_5, a_1);
543 USE a_6.
544
545 we'll transform this into:
546
547 if (<something>)
548 {
549 a_1 = b + c;
550 }
551 else
552 {
553 foo (&b, &c);
554 a_5 = b + c;
555 }
556 a_6 = PHI (a_5, a_1);
557 USE a_6.
558
559 Note that this reduces the number of computations of a = b + c to 1
560 when we take the else edge, instead of 2.
561*/
562static void
563execute_sink_code (void)
564{
598ec7bd 565 loop_optimizer_init (LOOPS_NORMAL);
10d22567 566
ec1e9f7c
DB
567 connect_infinite_loops_to_exit ();
568 memset (&sink_stats, 0, sizeof (sink_stats));
3b5ee6a4
RG
569 calculate_dominance_info (CDI_DOMINATORS);
570 calculate_dominance_info (CDI_POST_DOMINATORS);
ec1e9f7c 571 sink_code_in_bb (EXIT_BLOCK_PTR);
01902653 572 statistics_counter_event (cfun, "Sunk statements", sink_stats.sunk);
ec1e9f7c
DB
573 free_dominance_info (CDI_POST_DOMINATORS);
574 remove_fake_exit_edges ();
598ec7bd 575 loop_optimizer_finalize ();
ec1e9f7c
DB
576}
577
578/* Gate and execute functions for PRE. */
579
c2924966 580static unsigned int
ec1e9f7c
DB
581do_sink (void)
582{
583 execute_sink_code ();
c2924966 584 return 0;
ec1e9f7c
DB
585}
586
587static bool
588gate_sink (void)
589{
590 return flag_tree_sink != 0;
591}
592
8ddbbcae 593struct gimple_opt_pass pass_sink_code =
ec1e9f7c 594{
8ddbbcae
JH
595 {
596 GIMPLE_PASS,
ec1e9f7c
DB
597 "sink", /* name */
598 gate_sink, /* gate */
599 do_sink, /* execute */
600 NULL, /* sub */
601 NULL, /* next */
602 0, /* static_pass_number */
603 TV_TREE_SINK, /* tv_id */
604 PROP_no_crit_edges | PROP_cfg
4effdf02 605 | PROP_ssa, /* properties_required */
ec1e9f7c
DB
606 0, /* properties_provided */
607 0, /* properties_destroyed */
608 0, /* todo_flags_start */
0bca51f0
DN
609 TODO_update_ssa
610 | TODO_dump_func
611 | TODO_ggc_collect
8ddbbcae
JH
612 | TODO_verify_ssa /* todo_flags_finish */
613 }
ec1e9f7c 614};