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