xref: /netbsd-src/external/gpl3/gcc/dist/gcc/tree-ssa-sink.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Code sinking for trees
2    Copyright (C) 2001-2022 Free Software Foundation, Inc.
3    Contributed by Daniel Berlin <dan@dberlin.org>
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "cfghooks.h"
28 #include "tree-pass.h"
29 #include "ssa.h"
30 #include "gimple-pretty-print.h"
31 #include "fold-const.h"
32 #include "stor-layout.h"
33 #include "cfganal.h"
34 #include "gimple-iterator.h"
35 #include "tree-cfg.h"
36 #include "cfgloop.h"
37 #include "tree-eh.h"
38 
39 /* TODO:
40    1. Sinking store only using scalar promotion (IE without moving the RHS):
41 
42    *q = p;
43    p = p + 1;
44    if (something)
45      *q = <not p>;
46    else
47      y = *q;
48 
49 
50    should become
51    sinktemp = p;
52    p = p + 1;
53    if (something)
54      *q = <not p>;
55    else
56    {
57      *q = sinktemp;
58      y = *q
59    }
60    Store copy propagation will take care of the store elimination above.
61 
62 
63    2. Sinking using Partial Dead Code Elimination.  */
64 
65 
66 static struct
67 {
68   /* The number of statements sunk down the flowgraph by code sinking.  */
69   int sunk;
70 
71   /* The number of stores commoned and sunk down by store commoning.  */
72   int commoned;
73 } sink_stats;
74 
75 
76 /* Given a PHI, and one of its arguments (DEF), find the edge for
77    that argument and return it.  If the argument occurs twice in the PHI node,
78    we return NULL.  */
79 
80 static basic_block
find_bb_for_arg(gphi * phi,tree def)81 find_bb_for_arg (gphi *phi, tree def)
82 {
83   size_t i;
84   bool foundone = false;
85   basic_block result = NULL;
86   for (i = 0; i < gimple_phi_num_args (phi); i++)
87     if (PHI_ARG_DEF (phi, i) == def)
88       {
89 	if (foundone)
90 	  return NULL;
91 	foundone = true;
92 	result = gimple_phi_arg_edge (phi, i)->src;
93       }
94   return result;
95 }
96 
97 /* When the first immediate use is in a statement, then return true if all
98    immediate uses in IMM are in the same statement.
99    We could also do the case where  the first immediate use is in a phi node,
100    and all the other uses are in phis in the same basic block, but this
101    requires some expensive checking later (you have to make sure no def/vdef
102    in the statement occurs for multiple edges in the various phi nodes it's
103    used in, so that you only have one place you can sink it to.  */
104 
105 static bool
all_immediate_uses_same_place(def_operand_p def_p)106 all_immediate_uses_same_place (def_operand_p def_p)
107 {
108   tree var = DEF_FROM_PTR (def_p);
109   imm_use_iterator imm_iter;
110   use_operand_p use_p;
111 
112   gimple *firstuse = NULL;
113   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
114     {
115       if (is_gimple_debug (USE_STMT (use_p)))
116 	continue;
117       if (firstuse == NULL)
118 	firstuse = USE_STMT (use_p);
119       else
120 	if (firstuse != USE_STMT (use_p))
121 	  return false;
122     }
123 
124   return true;
125 }
126 
127 /* Find the nearest common dominator of all of the immediate uses in IMM.  */
128 
129 static basic_block
nearest_common_dominator_of_uses(def_operand_p def_p,bool * debug_stmts)130 nearest_common_dominator_of_uses (def_operand_p def_p, bool *debug_stmts)
131 {
132   tree var = DEF_FROM_PTR (def_p);
133   auto_bitmap blocks;
134   basic_block commondom;
135   unsigned int j;
136   bitmap_iterator bi;
137   imm_use_iterator imm_iter;
138   use_operand_p use_p;
139 
140   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
141     {
142       gimple *usestmt = USE_STMT (use_p);
143       basic_block useblock;
144 
145       if (gphi *phi = dyn_cast <gphi *> (usestmt))
146 	{
147 	  int idx = PHI_ARG_INDEX_FROM_USE (use_p);
148 
149 	  useblock = gimple_phi_arg_edge (phi, idx)->src;
150 	}
151       else if (is_gimple_debug (usestmt))
152 	{
153 	  *debug_stmts = true;
154 	  continue;
155 	}
156       else
157 	{
158 	  useblock = gimple_bb (usestmt);
159 	}
160 
161       /* Short circuit. Nothing dominates the entry block.  */
162       if (useblock == ENTRY_BLOCK_PTR_FOR_FN (cfun))
163 	return NULL;
164 
165       bitmap_set_bit (blocks, useblock->index);
166     }
167   commondom = BASIC_BLOCK_FOR_FN (cfun, bitmap_first_set_bit (blocks));
168   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, j, bi)
169     commondom = nearest_common_dominator (CDI_DOMINATORS, commondom,
170 					  BASIC_BLOCK_FOR_FN (cfun, j));
171   return commondom;
172 }
173 
174 /* Given EARLY_BB and LATE_BB, two blocks in a path through the dominator
175    tree, return the best basic block between them (inclusive) to place
176    statements.
177 
178    We want the most control dependent block in the shallowest loop nest.
179 
180    If the resulting block is in a shallower loop nest, then use it.  Else
181    only use the resulting block if it has significantly lower execution
182    frequency than EARLY_BB to avoid gratuitous statement movement.  We
183    consider statements with VOPS more desirable to move.
184 
185    This pass would obviously benefit from PDO as it utilizes block
186    frequencies.  It would also benefit from recomputing frequencies
187    if profile data is not available since frequencies often get out
188    of sync with reality.  */
189 
190 static basic_block
select_best_block(basic_block early_bb,basic_block late_bb,gimple * stmt)191 select_best_block (basic_block early_bb,
192 		   basic_block late_bb,
193 		   gimple *stmt)
194 {
195   basic_block best_bb = late_bb;
196   basic_block temp_bb = late_bb;
197   int threshold;
198 
199   while (temp_bb != early_bb)
200     {
201       /* If we've moved into a lower loop nest, then that becomes
202 	 our best block.  */
203       if (bb_loop_depth (temp_bb) < bb_loop_depth (best_bb))
204 	best_bb = temp_bb;
205 
206       /* Walk up the dominator tree, hopefully we'll find a shallower
207  	 loop nest.  */
208       temp_bb = get_immediate_dominator (CDI_DOMINATORS, temp_bb);
209     }
210 
211   /* If we found a shallower loop nest, then we always consider that
212      a win.  This will always give us the most control dependent block
213      within that loop nest.  */
214   if (bb_loop_depth (best_bb) < bb_loop_depth (early_bb))
215     return best_bb;
216 
217   /* Get the sinking threshold.  If the statement to be moved has memory
218      operands, then increase the threshold by 7% as those are even more
219      profitable to avoid, clamping at 100%.  */
220   threshold = param_sink_frequency_threshold;
221   if (gimple_vuse (stmt) || gimple_vdef (stmt))
222     {
223       threshold += 7;
224       if (threshold > 100)
225 	threshold = 100;
226     }
227 
228   /* If BEST_BB is at the same nesting level, then require it to have
229      significantly lower execution frequency to avoid gratuitous movement.  */
230   if (bb_loop_depth (best_bb) == bb_loop_depth (early_bb)
231       /* If result of comparsion is unknown, prefer EARLY_BB.
232 	 Thus use !(...>=..) rather than (...<...)  */
233       && !(best_bb->count.apply_scale (100, 1)
234 	   >= early_bb->count.apply_scale (threshold, 1)))
235     return best_bb;
236 
237   /* No better block found, so return EARLY_BB, which happens to be the
238      statement's original block.  */
239   return early_bb;
240 }
241 
242 /* Given a statement (STMT) and the basic block it is currently in (FROMBB),
243    determine the location to sink the statement to, if any.
244    Returns true if there is such location; in that case, TOGSI points to the
245    statement before that STMT should be moved.  */
246 
247 static bool
statement_sink_location(gimple * stmt,basic_block frombb,gimple_stmt_iterator * togsi,bool * zero_uses_p)248 statement_sink_location (gimple *stmt, basic_block frombb,
249 			 gimple_stmt_iterator *togsi, bool *zero_uses_p)
250 {
251   gimple *use;
252   use_operand_p one_use = NULL_USE_OPERAND_P;
253   basic_block sinkbb;
254   use_operand_p use_p;
255   def_operand_p def_p;
256   ssa_op_iter iter;
257   imm_use_iterator imm_iter;
258 
259   *zero_uses_p = false;
260 
261   /* We only can sink assignments and non-looping const/pure calls.  */
262   int cf;
263   if (!is_gimple_assign (stmt)
264       && (!is_gimple_call (stmt)
265 	  || !((cf = gimple_call_flags (stmt)) & (ECF_CONST|ECF_PURE))
266 	  || (cf & ECF_LOOPING_CONST_OR_PURE)))
267     return false;
268 
269   /* We only can sink stmts with a single definition.  */
270   def_p = single_ssa_def_operand (stmt, SSA_OP_ALL_DEFS);
271   if (def_p == NULL_DEF_OPERAND_P)
272     return false;
273 
274   /* There are a few classes of things we can't or don't move, some because we
275      don't have code to handle it, some because it's not profitable and some
276      because it's not legal.
277 
278      We can't sink things that may be global stores, at least not without
279      calculating a lot more information, because we may cause it to no longer
280      be seen by an external routine that needs it depending on where it gets
281      moved to.
282 
283      We can't sink statements that end basic blocks without splitting the
284      incoming edge for the sink location to place it there.
285 
286      We can't sink statements that have volatile operands.
287 
288      We don't want to sink dead code, so anything with 0 immediate uses is not
289      sunk.
290 
291      Don't sink BLKmode assignments if current function has any local explicit
292      register variables, as BLKmode assignments may involve memcpy or memset
293      calls or, on some targets, inline expansion thereof that sometimes need
294      to use specific hard registers.
295 
296   */
297   if (stmt_ends_bb_p (stmt)
298       || gimple_has_side_effects (stmt)
299       || (cfun->has_local_explicit_reg_vars
300 	  && TYPE_MODE (TREE_TYPE (gimple_get_lhs (stmt))) == BLKmode))
301     return false;
302 
303   /* Return if there are no immediate uses of this stmt.  */
304   if (has_zero_uses (DEF_FROM_PTR (def_p)))
305     {
306       *zero_uses_p = true;
307       return false;
308     }
309 
310   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (DEF_FROM_PTR (def_p)))
311     return false;
312 
313   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
314     {
315       tree use = USE_FROM_PTR (use_p);
316       if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use))
317 	return false;
318     }
319 
320   use = NULL;
321 
322   /* If stmt is a store the one and only use needs to be the VOP
323      merging PHI node.  */
324   if (virtual_operand_p (DEF_FROM_PTR (def_p)))
325     {
326       FOR_EACH_IMM_USE_FAST (use_p, imm_iter, DEF_FROM_PTR (def_p))
327 	{
328 	  gimple *use_stmt = USE_STMT (use_p);
329 
330 	  /* A killing definition is not a use.  */
331 	  if ((gimple_has_lhs (use_stmt)
332 	       && operand_equal_p (gimple_get_lhs (stmt),
333 				   gimple_get_lhs (use_stmt), 0))
334 	      || stmt_kills_ref_p (use_stmt, gimple_get_lhs (stmt)))
335 	    {
336 	      /* If use_stmt is or might be a nop assignment then USE_STMT
337 	         acts as a use as well as definition.  */
338 	      if (stmt != use_stmt
339 		  && ref_maybe_used_by_stmt_p (use_stmt,
340 					       gimple_get_lhs (stmt)))
341 		return false;
342 	      continue;
343 	    }
344 
345 	  if (gimple_code (use_stmt) != GIMPLE_PHI)
346 	    return false;
347 
348 	  if (use
349 	      && use != use_stmt)
350 	    return false;
351 
352 	  use = use_stmt;
353 	}
354       if (!use)
355 	return false;
356     }
357   /* If all the immediate uses are not in the same place, find the nearest
358      common dominator of all the immediate uses.  For PHI nodes, we have to
359      find the nearest common dominator of all of the predecessor blocks, since
360      that is where insertion would have to take place.  */
361   else if (gimple_vuse (stmt)
362 	   || !all_immediate_uses_same_place (def_p))
363     {
364       bool debug_stmts = false;
365       basic_block commondom = nearest_common_dominator_of_uses (def_p,
366 								&debug_stmts);
367 
368       if (commondom == frombb)
369 	return false;
370 
371       /* If this is a load then do not sink past any stores.
372 	 Look for virtual definitions in the path from frombb to the sink
373 	 location computed from the real uses and if found, adjust
374 	 that it a common dominator.  */
375       if (gimple_vuse (stmt))
376 	{
377 	  /* Do not sink loads from hard registers.  */
378 	  if (gimple_assign_single_p (stmt)
379 	      && TREE_CODE (gimple_assign_rhs1 (stmt)) == VAR_DECL
380 	      && DECL_HARD_REGISTER (gimple_assign_rhs1 (stmt)))
381 	    return false;
382 
383 	  imm_use_iterator imm_iter;
384 	  use_operand_p use_p;
385 	  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_vuse (stmt))
386 	    {
387 	      gimple *use_stmt = USE_STMT (use_p);
388 	      basic_block bb = gimple_bb (use_stmt);
389 	      /* For PHI nodes the block we know sth about is the incoming block
390 		 with the use.  */
391 	      if (gimple_code (use_stmt) == GIMPLE_PHI)
392 		{
393 		  /* If the PHI defines the virtual operand, ignore it.  */
394 		  if (gimple_phi_result (use_stmt) == gimple_vuse (stmt))
395 		    continue;
396 		  /* In case the PHI node post-dominates the current insert
397 		     location we can disregard it.  But make sure it is not
398 		     dominating it as well as can happen in a CFG cycle.  */
399 		  if (commondom != bb
400 		      && !dominated_by_p (CDI_DOMINATORS, commondom, bb)
401 		      && dominated_by_p (CDI_POST_DOMINATORS, commondom, bb)
402 		      /* If the blocks are possibly within the same irreducible
403 			 cycle the above check breaks down.  */
404 		      && !((bb->flags & commondom->flags & BB_IRREDUCIBLE_LOOP)
405 			   && bb->loop_father == commondom->loop_father)
406 		      && !((commondom->flags & BB_IRREDUCIBLE_LOOP)
407 			   && flow_loop_nested_p (commondom->loop_father,
408 						  bb->loop_father))
409 		      && !((bb->flags & BB_IRREDUCIBLE_LOOP)
410 			   && flow_loop_nested_p (bb->loop_father,
411 						  commondom->loop_father)))
412 		    continue;
413 		  bb = EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src;
414 		}
415 	      else if (!gimple_vdef (use_stmt))
416 		continue;
417 	      /* If the use is not dominated by the path entry it is not on
418 		 the path.  */
419 	      if (!dominated_by_p (CDI_DOMINATORS, bb, frombb))
420 		continue;
421 	      /* There is no easy way to disregard defs not on the path from
422 		 frombb to commondom so just consider them all.  */
423 	      commondom = nearest_common_dominator (CDI_DOMINATORS,
424 						    bb, commondom);
425 	      if (commondom == frombb)
426 		return false;
427 	    }
428 	}
429 
430       /* Our common dominator has to be dominated by frombb in order to be a
431 	 trivially safe place to put this statement, since it has multiple
432 	 uses.  */
433       if (!dominated_by_p (CDI_DOMINATORS, commondom, frombb))
434 	return false;
435 
436       commondom = select_best_block (frombb, commondom, stmt);
437 
438       if (commondom == frombb)
439 	return false;
440 
441       *togsi = gsi_after_labels (commondom);
442 
443       return true;
444     }
445   else
446     {
447       FOR_EACH_IMM_USE_FAST (one_use, imm_iter, DEF_FROM_PTR (def_p))
448 	{
449 	  if (is_gimple_debug (USE_STMT (one_use)))
450 	    continue;
451 	  break;
452 	}
453       use = USE_STMT (one_use);
454 
455       if (gimple_code (use) != GIMPLE_PHI)
456 	{
457 	  sinkbb = select_best_block (frombb, gimple_bb (use), stmt);
458 
459 	  if (sinkbb == frombb)
460 	    return false;
461 
462 	  if (sinkbb == gimple_bb (use))
463 	    *togsi = gsi_for_stmt (use);
464 	  else
465 	    *togsi = gsi_after_labels (sinkbb);
466 
467 	  return true;
468 	}
469     }
470 
471   sinkbb = find_bb_for_arg (as_a <gphi *> (use), DEF_FROM_PTR (def_p));
472 
473   /* This can happen if there are multiple uses in a PHI.  */
474   if (!sinkbb)
475     return false;
476 
477   sinkbb = select_best_block (frombb, sinkbb, stmt);
478   if (!sinkbb || sinkbb == frombb)
479     return false;
480 
481   /* If the latch block is empty, don't make it non-empty by sinking
482      something into it.  */
483   if (sinkbb == frombb->loop_father->latch
484       && empty_block_p (sinkbb))
485     return false;
486 
487   *togsi = gsi_after_labels (sinkbb);
488 
489   return true;
490 }
491 
492 /* Very simplistic code to sink common stores from the predecessor through
493    our virtual PHI.  We do this before sinking stmts from BB as it might
494    expose sinking opportunities of the merged stores.
495    Once we have partial dead code elimination through sth like SSU-PRE this
496    should be moved there.  */
497 
498 static unsigned
sink_common_stores_to_bb(basic_block bb)499 sink_common_stores_to_bb (basic_block bb)
500 {
501   unsigned todo = 0;
502   gphi *phi;
503 
504   if (EDGE_COUNT (bb->preds) > 1
505       && (phi = get_virtual_phi (bb)))
506     {
507       /* Repeat until no more common stores are found.  */
508       while (1)
509 	{
510 	  gimple *first_store = NULL;
511 	  auto_vec <tree, 5> vdefs;
512 	  gimple_stmt_iterator gsi;
513 
514 	  /* Search for common stores defined by all virtual PHI args.
515 	     ???  Common stores not present in all predecessors could
516 	     be handled by inserting a forwarder to sink to.  Generally
517 	     this involves deciding which stores to do this for if
518 	     multiple common stores are present for different sets of
519 	     predecessors.  See PR11832 for an interesting case.  */
520 	  for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
521 	    {
522 	      tree arg = gimple_phi_arg_def (phi, i);
523 	      gimple *def = SSA_NAME_DEF_STMT (arg);
524 	      if (! is_gimple_assign (def)
525 		  || stmt_can_throw_internal (cfun, def)
526 		  || (gimple_phi_arg_edge (phi, i)->flags & EDGE_ABNORMAL))
527 		{
528 		  /* ???  We could handle some cascading with the def being
529 		     another PHI.  We'd have to insert multiple PHIs for
530 		     the rhs then though (if they are not all equal).  */
531 		  first_store = NULL;
532 		  break;
533 		}
534 	      /* ???  Do not try to do anything fancy with aliasing, thus
535 		 do not sink across non-aliased loads (or even stores,
536 		 so different store order will make the sinking fail).  */
537 	      bool all_uses_on_phi = true;
538 	      imm_use_iterator iter;
539 	      use_operand_p use_p;
540 	      FOR_EACH_IMM_USE_FAST (use_p, iter, arg)
541 		if (USE_STMT (use_p) != phi)
542 		  {
543 		    all_uses_on_phi = false;
544 		    break;
545 		  }
546 	      if (! all_uses_on_phi)
547 		{
548 		  first_store = NULL;
549 		  break;
550 		}
551 	      /* Check all stores are to the same LHS.  */
552 	      if (! first_store)
553 		first_store = def;
554 	      /* ??? We could handle differing SSA uses in the LHS by inserting
555 		 PHIs for them.  */
556 	      else if (! operand_equal_p (gimple_assign_lhs (first_store),
557 					  gimple_assign_lhs (def), 0)
558 		       || (gimple_clobber_p (first_store)
559 			   != gimple_clobber_p (def)))
560 		{
561 		  first_store = NULL;
562 		  break;
563 		}
564 	      vdefs.safe_push (arg);
565 	    }
566 	  if (! first_store)
567 	    break;
568 
569 	  /* Check if we need a PHI node to merge the stored values.  */
570 	  bool allsame = true;
571 	  if (!gimple_clobber_p (first_store))
572 	    for (unsigned i = 1; i < vdefs.length (); ++i)
573 	      {
574 		gimple *def = SSA_NAME_DEF_STMT (vdefs[i]);
575 		if (! operand_equal_p (gimple_assign_rhs1 (first_store),
576 				       gimple_assign_rhs1 (def), 0))
577 		  {
578 		    allsame = false;
579 		    break;
580 		  }
581 	      }
582 
583 	  /* We cannot handle aggregate values if we need to merge them.  */
584 	  tree type = TREE_TYPE (gimple_assign_lhs (first_store));
585 	  if (! allsame
586 	      && ! is_gimple_reg_type (type))
587 	    break;
588 
589 	  if (dump_enabled_p ())
590 	    {
591 	      dump_printf_loc (MSG_OPTIMIZED_LOCATIONS,
592 			       first_store,
593 			       "sinking common stores %sto ",
594 			       allsame ? "with same value " : "");
595 	      dump_generic_expr (MSG_OPTIMIZED_LOCATIONS, TDF_SLIM,
596 				 gimple_assign_lhs (first_store));
597 	      dump_printf (MSG_OPTIMIZED_LOCATIONS, "\n");
598 	    }
599 
600 	  /* Insert a PHI to merge differing stored values if necessary.
601 	     Note that in general inserting PHIs isn't a very good idea as
602 	     it makes the job of coalescing and register allocation harder.
603 	     Even common SSA uses on the rhs/lhs might extend their lifetime
604 	     across multiple edges by this code motion which makes
605 	     register allocation harder.  */
606 	  tree from;
607 	  if (! allsame)
608 	    {
609 	      from = make_ssa_name (type);
610 	      gphi *newphi = create_phi_node (from, bb);
611 	      for (unsigned i = 0; i < vdefs.length (); ++i)
612 		{
613 		  gimple *def = SSA_NAME_DEF_STMT (vdefs[i]);
614 		  add_phi_arg (newphi, gimple_assign_rhs1 (def),
615 			       EDGE_PRED (bb, i), UNKNOWN_LOCATION);
616 		}
617 	    }
618 	  else
619 	    from = gimple_assign_rhs1 (first_store);
620 
621 	  /* Remove all stores.  */
622 	  for (unsigned i = 0; i < vdefs.length (); ++i)
623 	    TREE_VISITED (vdefs[i]) = 1;
624 	  for (unsigned i = 0; i < vdefs.length (); ++i)
625 	    /* If we have more than one use of a VDEF on the PHI make sure
626 	       we remove the defining stmt only once.  */
627 	    if (TREE_VISITED (vdefs[i]))
628 	      {
629 		TREE_VISITED (vdefs[i]) = 0;
630 		gimple *def = SSA_NAME_DEF_STMT (vdefs[i]);
631 		gsi = gsi_for_stmt (def);
632 		unlink_stmt_vdef (def);
633 		gsi_remove (&gsi, true);
634 		release_defs (def);
635 	      }
636 
637 	  /* Insert the first store at the beginning of the merge BB.  */
638 	  gimple_set_vdef (first_store, gimple_phi_result (phi));
639 	  SSA_NAME_DEF_STMT (gimple_vdef (first_store)) = first_store;
640 	  gimple_phi_set_result (phi, make_ssa_name (gimple_vop (cfun)));
641 	  gimple_set_vuse (first_store, gimple_phi_result (phi));
642 	  gimple_assign_set_rhs1 (first_store, from);
643 	  /* ???  Should we reset first_stores location?  */
644 	  gsi = gsi_after_labels (bb);
645 	  gsi_insert_before (&gsi, first_store, GSI_SAME_STMT);
646 	  sink_stats.commoned++;
647 
648 	  todo |= TODO_cleanup_cfg;
649 	}
650 
651       /* We could now have empty predecessors that we could remove,
652 	 forming a proper CFG for further sinking.  Note that even
653 	 CFG cleanup doesn't do this fully at the moment and it
654 	 doesn't preserve post-dominators in the process either.
655 	 The mergephi pass might do it though.  gcc.dg/tree-ssa/ssa-sink-13.c
656 	 shows this nicely if you disable tail merging or (same effect)
657 	 make the stored values unequal.  */
658     }
659 
660   return todo;
661 }
662 
663 /* Perform code sinking on BB */
664 
665 static unsigned
sink_code_in_bb(basic_block bb)666 sink_code_in_bb (basic_block bb)
667 {
668   basic_block son;
669   gimple_stmt_iterator gsi;
670   edge_iterator ei;
671   edge e;
672   bool last = true;
673   unsigned todo = 0;
674 
675   /* Sink common stores from the predecessor through our virtual PHI.  */
676   todo |= sink_common_stores_to_bb (bb);
677 
678   /* If this block doesn't dominate anything, there can't be any place to sink
679      the statements to.  */
680   if (first_dom_son (CDI_DOMINATORS, bb) == NULL)
681     goto earlyout;
682 
683   /* We can't move things across abnormal edges, so don't try.  */
684   FOR_EACH_EDGE (e, ei, bb->succs)
685     if (e->flags & EDGE_ABNORMAL)
686       goto earlyout;
687 
688   for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);)
689     {
690       gimple *stmt = gsi_stmt (gsi);
691       gimple_stmt_iterator togsi;
692       bool zero_uses_p;
693 
694       if (!statement_sink_location (stmt, bb, &togsi, &zero_uses_p))
695 	{
696 	  gimple_stmt_iterator saved = gsi;
697 	  if (!gsi_end_p (gsi))
698 	    gsi_prev (&gsi);
699 	  /* If we face a dead stmt remove it as it possibly blocks
700 	     sinking of uses.  */
701 	  if (zero_uses_p
702 	      && !gimple_vdef (stmt)
703 	      && (cfun->can_delete_dead_exceptions
704 		  || !stmt_could_throw_p (cfun, stmt)))
705 	    {
706 	      gsi_remove (&saved, true);
707 	      release_defs (stmt);
708 	    }
709 	  else
710 	    last = false;
711 	  continue;
712 	}
713       if (dump_file)
714 	{
715 	  fprintf (dump_file, "Sinking ");
716 	  print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS);
717 	  fprintf (dump_file, " from bb %d to bb %d\n",
718 		   bb->index, (gsi_bb (togsi))->index);
719 	}
720 
721       /* Update virtual operands of statements in the path we
722          do not sink to.  */
723       if (gimple_vdef (stmt))
724 	{
725 	  imm_use_iterator iter;
726 	  use_operand_p use_p;
727 	  gimple *vuse_stmt;
728 
729 	  FOR_EACH_IMM_USE_STMT (vuse_stmt, iter, gimple_vdef (stmt))
730 	    if (gimple_code (vuse_stmt) != GIMPLE_PHI)
731 	      FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
732 		SET_USE (use_p, gimple_vuse (stmt));
733 	}
734 
735       /* If this is the end of the basic block, we need to insert at the end
736          of the basic block.  */
737       if (gsi_end_p (togsi))
738 	gsi_move_to_bb_end (&gsi, gsi_bb (togsi));
739       else
740 	gsi_move_before (&gsi, &togsi);
741 
742       sink_stats.sunk++;
743 
744       /* If we've just removed the last statement of the BB, the
745 	 gsi_end_p() test below would fail, but gsi_prev() would have
746 	 succeeded, and we want it to succeed.  So we keep track of
747 	 whether we're at the last statement and pick up the new last
748 	 statement.  */
749       if (last)
750 	{
751 	  gsi = gsi_last_bb (bb);
752 	  continue;
753 	}
754 
755       last = false;
756       if (!gsi_end_p (gsi))
757 	gsi_prev (&gsi);
758 
759     }
760  earlyout:
761   for (son = first_dom_son (CDI_POST_DOMINATORS, bb);
762        son;
763        son = next_dom_son (CDI_POST_DOMINATORS, son))
764     {
765       todo |= sink_code_in_bb (son);
766     }
767 
768   return todo;
769 }
770 
771 /* Perform code sinking.
772    This moves code down the flowgraph when we know it would be
773    profitable to do so, or it wouldn't increase the number of
774    executions of the statement.
775 
776    IE given
777 
778    a_1 = b + c;
779    if (<something>)
780    {
781    }
782    else
783    {
784      foo (&b, &c);
785      a_5 = b + c;
786    }
787    a_6 = PHI (a_5, a_1);
788    USE a_6.
789 
790    we'll transform this into:
791 
792    if (<something>)
793    {
794       a_1 = b + c;
795    }
796    else
797    {
798       foo (&b, &c);
799       a_5 = b + c;
800    }
801    a_6 = PHI (a_5, a_1);
802    USE a_6.
803 
804    Note that this reduces the number of computations of a = b + c to 1
805    when we take the else edge, instead of 2.
806 */
807 namespace {
808 
809 const pass_data pass_data_sink_code =
810 {
811   GIMPLE_PASS, /* type */
812   "sink", /* name */
813   OPTGROUP_NONE, /* optinfo_flags */
814   TV_TREE_SINK, /* tv_id */
815   /* PROP_no_crit_edges is ensured by running split_edges_for_insertion in
816      pass_data_sink_code::execute ().  */
817   ( PROP_cfg | PROP_ssa ), /* properties_required */
818   0, /* properties_provided */
819   0, /* properties_destroyed */
820   0, /* todo_flags_start */
821   TODO_update_ssa, /* todo_flags_finish */
822 };
823 
824 class pass_sink_code : public gimple_opt_pass
825 {
826 public:
pass_sink_code(gcc::context * ctxt)827   pass_sink_code (gcc::context *ctxt)
828     : gimple_opt_pass (pass_data_sink_code, ctxt), unsplit_edges (false)
829   {}
830 
831   /* opt_pass methods: */
gate(function *)832   virtual bool gate (function *) { return flag_tree_sink != 0; }
833   virtual unsigned int execute (function *);
clone(void)834   opt_pass *clone (void) { return new pass_sink_code (m_ctxt); }
set_pass_param(unsigned n,bool param)835   void set_pass_param (unsigned n, bool param)
836     {
837       gcc_assert (n == 0);
838       unsplit_edges = param;
839     }
840 
841 private:
842   bool unsplit_edges;
843 }; // class pass_sink_code
844 
845 unsigned int
execute(function * fun)846 pass_sink_code::execute (function *fun)
847 {
848   loop_optimizer_init (LOOPS_NORMAL);
849   split_edges_for_insertion ();
850   /* Arrange for the critical edge splitting to be undone if requested.  */
851   unsigned todo = unsplit_edges ? TODO_cleanup_cfg : 0;
852   connect_infinite_loops_to_exit ();
853   memset (&sink_stats, 0, sizeof (sink_stats));
854   calculate_dominance_info (CDI_DOMINATORS);
855   calculate_dominance_info (CDI_POST_DOMINATORS);
856   todo |= sink_code_in_bb (EXIT_BLOCK_PTR_FOR_FN (fun));
857   statistics_counter_event (fun, "Sunk statements", sink_stats.sunk);
858   statistics_counter_event (fun, "Commoned stores", sink_stats.commoned);
859   free_dominance_info (CDI_POST_DOMINATORS);
860   remove_fake_exit_edges ();
861   loop_optimizer_finalize ();
862 
863   return todo;
864 }
865 
866 } // anon namespace
867 
868 gimple_opt_pass *
make_pass_sink_code(gcc::context * ctxt)869 make_pass_sink_code (gcc::context *ctxt)
870 {
871   return new pass_sink_code (ctxt);
872 }
873