1 /* Tail merging for gimple.
2    Copyright (C) 2011-2018 Free Software Foundation, Inc.
3    Contributed by Tom de Vries (tom@codesourcery.com)
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 /* Pass overview.
22 
23 
24    MOTIVATIONAL EXAMPLE
25 
26    gimple representation of gcc/testsuite/gcc.dg/pr43864.c at
27 
28    hprofStartupp (charD.1 * outputFileNameD.2600, charD.1 * ctxD.2601)
29    {
30      struct FILED.1638 * fpD.2605;
31      charD.1 fileNameD.2604[1000];
32      intD.0 D.3915;
33      const charD.1 * restrict outputFileName.0D.3914;
34 
35      # BLOCK 2 freq:10000
36      # PRED: ENTRY [100.0%]  (fallthru,exec)
37      # PT = nonlocal { D.3926 } (restr)
38      outputFileName.0D.3914_3
39        = (const charD.1 * restrict) outputFileNameD.2600_2(D);
40      # .MEMD.3923_13 = VDEF <.MEMD.3923_12(D)>
41      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
42      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
43      sprintfD.759 (&fileNameD.2604, outputFileName.0D.3914_3);
44      # .MEMD.3923_14 = VDEF <.MEMD.3923_13>
45      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
46      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
47      D.3915_4 = accessD.2606 (&fileNameD.2604, 1);
48      if (D.3915_4 == 0)
49        goto <bb 3>;
50      else
51        goto <bb 4>;
52      # SUCC: 3 [10.0%]  (true,exec) 4 [90.0%]  (false,exec)
53 
54      # BLOCK 3 freq:1000
55      # PRED: 2 [10.0%]  (true,exec)
56      # .MEMD.3923_15 = VDEF <.MEMD.3923_14>
57      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
58      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
59      freeD.898 (ctxD.2601_5(D));
60      goto <bb 7>;
61      # SUCC: 7 [100.0%]  (fallthru,exec)
62 
63      # BLOCK 4 freq:9000
64      # PRED: 2 [90.0%]  (false,exec)
65      # .MEMD.3923_16 = VDEF <.MEMD.3923_14>
66      # PT = nonlocal escaped
67      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
68      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
69      fpD.2605_8 = fopenD.1805 (&fileNameD.2604[0], 0B);
70      if (fpD.2605_8 == 0B)
71        goto <bb 5>;
72      else
73        goto <bb 6>;
74      # SUCC: 5 [1.9%]  (true,exec) 6 [98.1%]  (false,exec)
75 
76      # BLOCK 5 freq:173
77      # PRED: 4 [1.9%]  (true,exec)
78      # .MEMD.3923_17 = VDEF <.MEMD.3923_16>
79      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
80      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
81      freeD.898 (ctxD.2601_5(D));
82      goto <bb 7>;
83      # SUCC: 7 [100.0%]  (fallthru,exec)
84 
85      # BLOCK 6 freq:8827
86      # PRED: 4 [98.1%]  (false,exec)
87      # .MEMD.3923_18 = VDEF <.MEMD.3923_16>
88      # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
89      # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
90      fooD.2599 (outputFileNameD.2600_2(D), fpD.2605_8);
91      # SUCC: 7 [100.0%]  (fallthru,exec)
92 
93      # BLOCK 7 freq:10000
94      # PRED: 3 [100.0%]  (fallthru,exec) 5 [100.0%]  (fallthru,exec)
95 	     6 [100.0%]  (fallthru,exec)
96      # PT = nonlocal null
97 
98      # ctxD.2601_1 = PHI <0B(3), 0B(5), ctxD.2601_5(D)(6)>
99      # .MEMD.3923_11 = PHI <.MEMD.3923_15(3), .MEMD.3923_17(5),
100 			    .MEMD.3923_18(6)>
101      # VUSE <.MEMD.3923_11>
102      return ctxD.2601_1;
103      # SUCC: EXIT [100.0%]
104    }
105 
106    bb 3 and bb 5 can be merged.  The blocks have different predecessors, but the
107    same successors, and the same operations.
108 
109 
110    CONTEXT
111 
112    A technique called tail merging (or cross jumping) can fix the example
113    above.  For a block, we look for common code at the end (the tail) of the
114    predecessor blocks, and insert jumps from one block to the other.
115    The example is a special case for tail merging, in that 2 whole blocks
116    can be merged, rather than just the end parts of it.
117    We currently only focus on whole block merging, so in that sense
118    calling this pass tail merge is a bit of a misnomer.
119 
120    We distinguish 2 kinds of situations in which blocks can be merged:
121    - same operations, same predecessors.  The successor edges coming from one
122      block are redirected to come from the other block.
123    - same operations, same successors.  The predecessor edges entering one block
124      are redirected to enter the other block.  Note that this operation might
125      involve introducing phi operations.
126 
127    For efficient implementation, we would like to value numbers the blocks, and
128    have a comparison operator that tells us whether the blocks are equal.
129    Besides being runtime efficient, block value numbering should also abstract
130    from irrelevant differences in order of operations, much like normal value
131    numbering abstracts from irrelevant order of operations.
132 
133    For the first situation (same_operations, same predecessors), normal value
134    numbering fits well.  We can calculate a block value number based on the
135    value numbers of the defs and vdefs.
136 
137    For the second situation (same operations, same successors), this approach
138    doesn't work so well.  We can illustrate this using the example.  The calls
139    to free use different vdefs: MEMD.3923_16 and MEMD.3923_14, and these will
140    remain different in value numbering, since they represent different memory
141    states.  So the resulting vdefs of the frees will be different in value
142    numbering, so the block value numbers will be different.
143 
144    The reason why we call the blocks equal is not because they define the same
145    values, but because uses in the blocks use (possibly different) defs in the
146    same way.  To be able to detect this efficiently, we need to do some kind of
147    reverse value numbering, meaning number the uses rather than the defs, and
148    calculate a block value number based on the value number of the uses.
149    Ideally, a block comparison operator will also indicate which phis are needed
150    to merge the blocks.
151 
152    For the moment, we don't do block value numbering, but we do insn-by-insn
153    matching, using scc value numbers to match operations with results, and
154    structural comparison otherwise, while ignoring vop mismatches.
155 
156 
157    IMPLEMENTATION
158 
159    1. The pass first determines all groups of blocks with the same successor
160       blocks.
161    2. Within each group, it tries to determine clusters of equal basic blocks.
162    3. The clusters are applied.
163    4. The same successor groups are updated.
164    5. This process is repeated from 2 onwards, until no more changes.
165 
166 
167    LIMITATIONS/TODO
168 
169    - block only
170    - handles only 'same operations, same successors'.
171      It handles same predecessors as a special subcase though.
172    - does not implement the reverse value numbering and block value numbering.
173    - improve memory allocation: use garbage collected memory, obstacks,
174      allocpools where appropriate.
175    - no insertion of gimple_reg phis,  We only introduce vop-phis.
176    - handle blocks with gimple_reg phi_nodes.
177 
178 
179    PASS PLACEMENT
180    This 'pass' is not a stand-alone gimple pass, but runs as part of
181    pass_pre, in order to share the value numbering.
182 
183 
184    SWITCHES
185 
186    - ftree-tail-merge.  On at -O2.  We may have to enable it only at -Os.  */
187 
188 #include "config.h"
189 #include "system.h"
190 #include "coretypes.h"
191 #include "backend.h"
192 #include "tree.h"
193 #include "gimple.h"
194 #include "cfghooks.h"
195 #include "tree-pass.h"
196 #include "ssa.h"
197 #include "fold-const.h"
198 #include "trans-mem.h"
199 #include "cfganal.h"
200 #include "cfgcleanup.h"
201 #include "gimple-iterator.h"
202 #include "tree-cfg.h"
203 #include "tree-into-ssa.h"
204 #include "params.h"
205 #include "tree-ssa-sccvn.h"
206 #include "cfgloop.h"
207 #include "tree-eh.h"
208 #include "tree-cfgcleanup.h"
209 
210 const int ignore_edge_flags = EDGE_DFS_BACK | EDGE_EXECUTABLE;
211 
212 /* Describes a group of bbs with the same successors.  The successor bbs are
213    cached in succs, and the successor edge flags are cached in succ_flags.
214    If a bb has the EDGE_TRUE/FALSE_VALUE flags swapped compared to succ_flags,
215    it's marked in inverse.
216    Additionally, the hash value for the struct is cached in hashval, and
217    in_worklist indicates whether it's currently part of worklist.  */
218 
219 struct same_succ : pointer_hash <same_succ>
220 {
221   /* The bbs that have the same successor bbs.  */
222   bitmap bbs;
223   /* The successor bbs.  */
224   bitmap succs;
225   /* Indicates whether the EDGE_TRUE/FALSE_VALUEs of succ_flags are swapped for
226      bb.  */
227   bitmap inverse;
228   /* The edge flags for each of the successor bbs.  */
229   vec<int> succ_flags;
230   /* Indicates whether the struct is currently in the worklist.  */
231   bool in_worklist;
232   /* The hash value of the struct.  */
233   hashval_t hashval;
234 
235   /* hash_table support.  */
236   static inline hashval_t hash (const same_succ *);
237   static int equal (const same_succ *, const same_succ *);
238   static void remove (same_succ *);
239 };
240 
241 /* hash routine for hash_table support, returns hashval of E.  */
242 
243 inline hashval_t
244 same_succ::hash (const same_succ *e)
245 {
246   return e->hashval;
247 }
248 
249 /* A group of bbs where 1 bb from bbs can replace the other bbs.  */
250 
251 struct bb_cluster
252 {
253   /* The bbs in the cluster.  */
254   bitmap bbs;
255   /* The preds of the bbs in the cluster.  */
256   bitmap preds;
257   /* Index in all_clusters vector.  */
258   int index;
259   /* The bb to replace the cluster with.  */
260   basic_block rep_bb;
261 };
262 
263 /* Per bb-info.  */
264 
265 struct aux_bb_info
266 {
267   /* The number of non-debug statements in the bb.  */
268   int size;
269   /* The same_succ that this bb is a member of.  */
270   same_succ *bb_same_succ;
271   /* The cluster that this bb is a member of.  */
272   bb_cluster *cluster;
273   /* The vop state at the exit of a bb.  This is shortlived data, used to
274      communicate data between update_block_by and update_vuses.  */
275   tree vop_at_exit;
276   /* The bb that either contains or is dominated by the dependencies of the
277      bb.  */
278   basic_block dep_bb;
279 };
280 
281 /* Macros to access the fields of struct aux_bb_info.  */
282 
283 #define BB_SIZE(bb) (((struct aux_bb_info *)bb->aux)->size)
284 #define BB_SAME_SUCC(bb) (((struct aux_bb_info *)bb->aux)->bb_same_succ)
285 #define BB_CLUSTER(bb) (((struct aux_bb_info *)bb->aux)->cluster)
286 #define BB_VOP_AT_EXIT(bb) (((struct aux_bb_info *)bb->aux)->vop_at_exit)
287 #define BB_DEP_BB(bb) (((struct aux_bb_info *)bb->aux)->dep_bb)
288 
289 /* Returns true if the only effect a statement STMT has, is to define locally
290    used SSA_NAMEs.  */
291 
292 static bool
293 stmt_local_def (gimple *stmt)
294 {
295   basic_block bb, def_bb;
296   imm_use_iterator iter;
297   use_operand_p use_p;
298   tree val;
299   def_operand_p def_p;
300 
301   if (gimple_vdef (stmt) != NULL_TREE
302       || gimple_has_side_effects (stmt)
303       || gimple_could_trap_p_1 (stmt, false, false)
304       || gimple_vuse (stmt) != NULL_TREE)
305     return false;
306 
307   def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
308   if (def_p == NULL)
309     return false;
310 
311   val = DEF_FROM_PTR (def_p);
312   if (val == NULL_TREE || TREE_CODE (val) != SSA_NAME)
313     return false;
314 
315   def_bb = gimple_bb (stmt);
316 
317   FOR_EACH_IMM_USE_FAST (use_p, iter, val)
318     {
319       if (is_gimple_debug (USE_STMT (use_p)))
320 	continue;
321       bb = gimple_bb (USE_STMT (use_p));
322       if (bb == def_bb)
323 	continue;
324 
325       if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
326 	  && EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src == def_bb)
327 	continue;
328 
329       return false;
330     }
331 
332   return true;
333 }
334 
335 /* Let GSI skip forwards over local defs.  */
336 
337 static void
338 gsi_advance_fw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
339 {
340   gimple *stmt;
341 
342   while (true)
343     {
344       if (gsi_end_p (*gsi))
345 	return;
346       stmt = gsi_stmt (*gsi);
347       if (!stmt_local_def (stmt))
348 	return;
349       gsi_next_nondebug (gsi);
350     }
351 }
352 
353 /* VAL1 and VAL2 are either:
354    - uses in BB1 and BB2, or
355    - phi alternatives for BB1 and BB2.
356    Return true if the uses have the same gvn value.  */
357 
358 static bool
359 gvn_uses_equal (tree val1, tree val2)
360 {
361   gcc_checking_assert (val1 != NULL_TREE && val2 != NULL_TREE);
362 
363   if (val1 == val2)
364     return true;
365 
366   if (vn_valueize (val1) != vn_valueize (val2))
367     return false;
368 
369   return ((TREE_CODE (val1) == SSA_NAME || CONSTANT_CLASS_P (val1))
370 	  && (TREE_CODE (val2) == SSA_NAME || CONSTANT_CLASS_P (val2)));
371 }
372 
373 /* Prints E to FILE.  */
374 
375 static void
376 same_succ_print (FILE *file, const same_succ *e)
377 {
378   unsigned int i;
379   bitmap_print (file, e->bbs, "bbs:", "\n");
380   bitmap_print (file, e->succs, "succs:", "\n");
381   bitmap_print (file, e->inverse, "inverse:", "\n");
382   fprintf (file, "flags:");
383   for (i = 0; i < e->succ_flags.length (); ++i)
384     fprintf (file, " %x", e->succ_flags[i]);
385   fprintf (file, "\n");
386 }
387 
388 /* Prints same_succ VE to VFILE.  */
389 
390 inline int
391 ssa_same_succ_print_traverse (same_succ **pe, FILE *file)
392 {
393   const same_succ *e = *pe;
394   same_succ_print (file, e);
395   return 1;
396 }
397 
398 /* Update BB_DEP_BB (USE_BB), given a use of VAL in USE_BB.  */
399 
400 static void
401 update_dep_bb (basic_block use_bb, tree val)
402 {
403   basic_block dep_bb;
404 
405   /* Not a dep.  */
406   if (TREE_CODE (val) != SSA_NAME)
407     return;
408 
409   /* Skip use of global def.  */
410   if (SSA_NAME_IS_DEFAULT_DEF (val))
411     return;
412 
413   /* Skip use of local def.  */
414   dep_bb = gimple_bb (SSA_NAME_DEF_STMT (val));
415   if (dep_bb == use_bb)
416     return;
417 
418   if (BB_DEP_BB (use_bb) == NULL
419       || dominated_by_p (CDI_DOMINATORS, dep_bb, BB_DEP_BB (use_bb)))
420     BB_DEP_BB (use_bb) = dep_bb;
421 }
422 
423 /* Update BB_DEP_BB, given the dependencies in STMT.  */
424 
425 static void
426 stmt_update_dep_bb (gimple *stmt)
427 {
428   ssa_op_iter iter;
429   use_operand_p use;
430 
431   FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE)
432     update_dep_bb (gimple_bb (stmt), USE_FROM_PTR (use));
433 }
434 
435 /* Calculates hash value for same_succ VE.  */
436 
437 static hashval_t
438 same_succ_hash (const same_succ *e)
439 {
440   inchash::hash hstate (bitmap_hash (e->succs));
441   int flags;
442   unsigned int i;
443   unsigned int first = bitmap_first_set_bit (e->bbs);
444   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, first);
445   int size = 0;
446   gimple *stmt;
447   tree arg;
448   unsigned int s;
449   bitmap_iterator bs;
450 
451   for (gimple_stmt_iterator gsi = gsi_start_nondebug_bb (bb);
452        !gsi_end_p (gsi); gsi_next_nondebug (&gsi))
453     {
454       stmt = gsi_stmt (gsi);
455       stmt_update_dep_bb (stmt);
456       if (stmt_local_def (stmt))
457 	continue;
458       size++;
459 
460       hstate.add_int (gimple_code (stmt));
461       if (is_gimple_assign (stmt))
462 	hstate.add_int (gimple_assign_rhs_code (stmt));
463       if (!is_gimple_call (stmt))
464 	continue;
465       if (gimple_call_internal_p (stmt))
466 	hstate.add_int (gimple_call_internal_fn (stmt));
467       else
468 	{
469 	  inchash::add_expr (gimple_call_fn (stmt), hstate);
470 	  if (gimple_call_chain (stmt))
471 	    inchash::add_expr (gimple_call_chain (stmt), hstate);
472 	}
473       for (i = 0; i < gimple_call_num_args (stmt); i++)
474 	{
475 	  arg = gimple_call_arg (stmt, i);
476 	  arg = vn_valueize (arg);
477 	  inchash::add_expr (arg, hstate);
478 	}
479     }
480 
481   hstate.add_int (size);
482   BB_SIZE (bb) = size;
483 
484   hstate.add_int (bb->loop_father->num);
485 
486   for (i = 0; i < e->succ_flags.length (); ++i)
487     {
488       flags = e->succ_flags[i];
489       flags = flags & ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
490       hstate.add_int (flags);
491     }
492 
493   EXECUTE_IF_SET_IN_BITMAP (e->succs, 0, s, bs)
494     {
495       int n = find_edge (bb, BASIC_BLOCK_FOR_FN (cfun, s))->dest_idx;
496       for (gphi_iterator gsi = gsi_start_phis (BASIC_BLOCK_FOR_FN (cfun, s));
497 	   !gsi_end_p (gsi);
498 	   gsi_next (&gsi))
499 	{
500 	  gphi *phi = gsi.phi ();
501 	  tree lhs = gimple_phi_result (phi);
502 	  tree val = gimple_phi_arg_def (phi, n);
503 
504 	  if (virtual_operand_p (lhs))
505 	    continue;
506 	  update_dep_bb (bb, val);
507 	}
508     }
509 
510   return hstate.end ();
511 }
512 
513 /* Returns true if E1 and E2 have 2 successors, and if the successor flags
514    are inverse for the EDGE_TRUE_VALUE and EDGE_FALSE_VALUE flags, and equal for
515    the other edge flags.  */
516 
517 static bool
518 inverse_flags (const same_succ *e1, const same_succ *e2)
519 {
520   int f1a, f1b, f2a, f2b;
521   int mask = ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
522 
523   if (e1->succ_flags.length () != 2)
524     return false;
525 
526   f1a = e1->succ_flags[0];
527   f1b = e1->succ_flags[1];
528   f2a = e2->succ_flags[0];
529   f2b = e2->succ_flags[1];
530 
531   if (f1a == f2a && f1b == f2b)
532     return false;
533 
534   return (f1a & mask) == (f2a & mask) && (f1b & mask) == (f2b & mask);
535 }
536 
537 /* Compares SAME_SUCCs E1 and E2.  */
538 
539 int
540 same_succ::equal (const same_succ *e1, const same_succ *e2)
541 {
542   unsigned int i, first1, first2;
543   gimple_stmt_iterator gsi1, gsi2;
544   gimple *s1, *s2;
545   basic_block bb1, bb2;
546 
547   if (e1 == e2)
548     return 1;
549 
550   if (e1->hashval != e2->hashval)
551     return 0;
552 
553   if (e1->succ_flags.length () != e2->succ_flags.length ())
554     return 0;
555 
556   if (!bitmap_equal_p (e1->succs, e2->succs))
557     return 0;
558 
559   if (!inverse_flags (e1, e2))
560     {
561       for (i = 0; i < e1->succ_flags.length (); ++i)
562 	if (e1->succ_flags[i] != e2->succ_flags[i])
563 	  return 0;
564     }
565 
566   first1 = bitmap_first_set_bit (e1->bbs);
567   first2 = bitmap_first_set_bit (e2->bbs);
568 
569   bb1 = BASIC_BLOCK_FOR_FN (cfun, first1);
570   bb2 = BASIC_BLOCK_FOR_FN (cfun, first2);
571 
572   if (BB_SIZE (bb1) != BB_SIZE (bb2))
573     return 0;
574 
575   if (bb1->loop_father != bb2->loop_father)
576     return 0;
577 
578   gsi1 = gsi_start_nondebug_bb (bb1);
579   gsi2 = gsi_start_nondebug_bb (bb2);
580   gsi_advance_fw_nondebug_nonlocal (&gsi1);
581   gsi_advance_fw_nondebug_nonlocal (&gsi2);
582   while (!(gsi_end_p (gsi1) || gsi_end_p (gsi2)))
583     {
584       s1 = gsi_stmt (gsi1);
585       s2 = gsi_stmt (gsi2);
586       if (gimple_code (s1) != gimple_code (s2))
587 	return 0;
588       if (is_gimple_call (s1) && !gimple_call_same_target_p (s1, s2))
589 	return 0;
590       gsi_next_nondebug (&gsi1);
591       gsi_next_nondebug (&gsi2);
592       gsi_advance_fw_nondebug_nonlocal (&gsi1);
593       gsi_advance_fw_nondebug_nonlocal (&gsi2);
594     }
595 
596   return 1;
597 }
598 
599 /* Alloc and init a new SAME_SUCC.  */
600 
601 static same_succ *
602 same_succ_alloc (void)
603 {
604   same_succ *same = XNEW (struct same_succ);
605 
606   same->bbs = BITMAP_ALLOC (NULL);
607   same->succs = BITMAP_ALLOC (NULL);
608   same->inverse = BITMAP_ALLOC (NULL);
609   same->succ_flags.create (10);
610   same->in_worklist = false;
611 
612   return same;
613 }
614 
615 /* Delete same_succ E.  */
616 
617 void
618 same_succ::remove (same_succ *e)
619 {
620   BITMAP_FREE (e->bbs);
621   BITMAP_FREE (e->succs);
622   BITMAP_FREE (e->inverse);
623   e->succ_flags.release ();
624 
625   XDELETE (e);
626 }
627 
628 /* Reset same_succ SAME.  */
629 
630 static void
631 same_succ_reset (same_succ *same)
632 {
633   bitmap_clear (same->bbs);
634   bitmap_clear (same->succs);
635   bitmap_clear (same->inverse);
636   same->succ_flags.truncate (0);
637 }
638 
639 static hash_table<same_succ> *same_succ_htab;
640 
641 /* Array that is used to store the edge flags for a successor.  */
642 
643 static int *same_succ_edge_flags;
644 
645 /* Bitmap that is used to mark bbs that are recently deleted.  */
646 
647 static bitmap deleted_bbs;
648 
649 /* Bitmap that is used to mark predecessors of bbs that are
650    deleted.  */
651 
652 static bitmap deleted_bb_preds;
653 
654 /* Prints same_succ_htab to stderr.  */
655 
656 extern void debug_same_succ (void);
657 DEBUG_FUNCTION void
658 debug_same_succ ( void)
659 {
660   same_succ_htab->traverse <FILE *, ssa_same_succ_print_traverse> (stderr);
661 }
662 
663 
664 /* Vector of bbs to process.  */
665 
666 static vec<same_succ *> worklist;
667 
668 /* Prints worklist to FILE.  */
669 
670 static void
671 print_worklist (FILE *file)
672 {
673   unsigned int i;
674   for (i = 0; i < worklist.length (); ++i)
675     same_succ_print (file, worklist[i]);
676 }
677 
678 /* Adds SAME to worklist.  */
679 
680 static void
681 add_to_worklist (same_succ *same)
682 {
683   if (same->in_worklist)
684     return;
685 
686   if (bitmap_count_bits (same->bbs) < 2)
687     return;
688 
689   same->in_worklist = true;
690   worklist.safe_push (same);
691 }
692 
693 /* Add BB to same_succ_htab.  */
694 
695 static void
696 find_same_succ_bb (basic_block bb, same_succ **same_p)
697 {
698   unsigned int j;
699   bitmap_iterator bj;
700   same_succ *same = *same_p;
701   same_succ **slot;
702   edge_iterator ei;
703   edge e;
704 
705   if (bb == NULL)
706     return;
707   bitmap_set_bit (same->bbs, bb->index);
708   FOR_EACH_EDGE (e, ei, bb->succs)
709     {
710       int index = e->dest->index;
711       bitmap_set_bit (same->succs, index);
712       same_succ_edge_flags[index] = (e->flags & ~ignore_edge_flags);
713     }
714   EXECUTE_IF_SET_IN_BITMAP (same->succs, 0, j, bj)
715     same->succ_flags.safe_push (same_succ_edge_flags[j]);
716 
717   same->hashval = same_succ_hash (same);
718 
719   slot = same_succ_htab->find_slot_with_hash (same, same->hashval, INSERT);
720   if (*slot == NULL)
721     {
722       *slot = same;
723       BB_SAME_SUCC (bb) = same;
724       add_to_worklist (same);
725       *same_p = NULL;
726     }
727   else
728     {
729       bitmap_set_bit ((*slot)->bbs, bb->index);
730       BB_SAME_SUCC (bb) = *slot;
731       add_to_worklist (*slot);
732       if (inverse_flags (same, *slot))
733 	bitmap_set_bit ((*slot)->inverse, bb->index);
734       same_succ_reset (same);
735     }
736 }
737 
738 /* Find bbs with same successors.  */
739 
740 static void
741 find_same_succ (void)
742 {
743   same_succ *same = same_succ_alloc ();
744   basic_block bb;
745 
746   FOR_EACH_BB_FN (bb, cfun)
747     {
748       find_same_succ_bb (bb, &same);
749       if (same == NULL)
750 	same = same_succ_alloc ();
751     }
752 
753   same_succ::remove (same);
754 }
755 
756 /* Initializes worklist administration.  */
757 
758 static void
759 init_worklist (void)
760 {
761   alloc_aux_for_blocks (sizeof (struct aux_bb_info));
762   same_succ_htab = new hash_table<same_succ> (n_basic_blocks_for_fn (cfun));
763   same_succ_edge_flags = XCNEWVEC (int, last_basic_block_for_fn (cfun));
764   deleted_bbs = BITMAP_ALLOC (NULL);
765   deleted_bb_preds = BITMAP_ALLOC (NULL);
766   worklist.create (n_basic_blocks_for_fn (cfun));
767   find_same_succ ();
768 
769   if (dump_file && (dump_flags & TDF_DETAILS))
770     {
771       fprintf (dump_file, "initial worklist:\n");
772       print_worklist (dump_file);
773     }
774 }
775 
776 /* Deletes worklist administration.  */
777 
778 static void
779 delete_worklist (void)
780 {
781   free_aux_for_blocks ();
782   delete same_succ_htab;
783   same_succ_htab = NULL;
784   XDELETEVEC (same_succ_edge_flags);
785   same_succ_edge_flags = NULL;
786   BITMAP_FREE (deleted_bbs);
787   BITMAP_FREE (deleted_bb_preds);
788   worklist.release ();
789 }
790 
791 /* Mark BB as deleted, and mark its predecessors.  */
792 
793 static void
794 mark_basic_block_deleted (basic_block bb)
795 {
796   edge e;
797   edge_iterator ei;
798 
799   bitmap_set_bit (deleted_bbs, bb->index);
800 
801   FOR_EACH_EDGE (e, ei, bb->preds)
802     bitmap_set_bit (deleted_bb_preds, e->src->index);
803 }
804 
805 /* Removes BB from its corresponding same_succ.  */
806 
807 static void
808 same_succ_flush_bb (basic_block bb)
809 {
810   same_succ *same = BB_SAME_SUCC (bb);
811   if (! same)
812     return;
813 
814   BB_SAME_SUCC (bb) = NULL;
815   if (bitmap_single_bit_set_p (same->bbs))
816     same_succ_htab->remove_elt_with_hash (same, same->hashval);
817   else
818     bitmap_clear_bit (same->bbs, bb->index);
819 }
820 
821 /* Removes all bbs in BBS from their corresponding same_succ.  */
822 
823 static void
824 same_succ_flush_bbs (bitmap bbs)
825 {
826   unsigned int i;
827   bitmap_iterator bi;
828 
829   EXECUTE_IF_SET_IN_BITMAP (bbs, 0, i, bi)
830     same_succ_flush_bb (BASIC_BLOCK_FOR_FN (cfun, i));
831 }
832 
833 /* Release the last vdef in BB, either normal or phi result.  */
834 
835 static void
836 release_last_vdef (basic_block bb)
837 {
838   for (gimple_stmt_iterator i = gsi_last_bb (bb); !gsi_end_p (i);
839        gsi_prev_nondebug (&i))
840     {
841       gimple *stmt = gsi_stmt (i);
842       if (gimple_vdef (stmt) == NULL_TREE)
843 	continue;
844 
845       mark_virtual_operand_for_renaming (gimple_vdef (stmt));
846       return;
847     }
848 
849   for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i);
850        gsi_next (&i))
851     {
852       gphi *phi = i.phi ();
853       tree res = gimple_phi_result (phi);
854 
855       if (!virtual_operand_p (res))
856 	continue;
857 
858       mark_virtual_phi_result_for_renaming (phi);
859       return;
860     }
861 }
862 
863 /* For deleted_bb_preds, find bbs with same successors.  */
864 
865 static void
866 update_worklist (void)
867 {
868   unsigned int i;
869   bitmap_iterator bi;
870   basic_block bb;
871   same_succ *same;
872 
873   bitmap_and_compl_into (deleted_bb_preds, deleted_bbs);
874   bitmap_clear (deleted_bbs);
875 
876   bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK);
877   same_succ_flush_bbs (deleted_bb_preds);
878 
879   same = same_succ_alloc ();
880   EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi)
881     {
882       bb = BASIC_BLOCK_FOR_FN (cfun, i);
883       gcc_assert (bb != NULL);
884       find_same_succ_bb (bb, &same);
885       if (same == NULL)
886 	same = same_succ_alloc ();
887     }
888   same_succ::remove (same);
889   bitmap_clear (deleted_bb_preds);
890 }
891 
892 /* Prints cluster C to FILE.  */
893 
894 static void
895 print_cluster (FILE *file, bb_cluster *c)
896 {
897   if (c == NULL)
898     return;
899   bitmap_print (file, c->bbs, "bbs:", "\n");
900   bitmap_print (file, c->preds, "preds:", "\n");
901 }
902 
903 /* Prints cluster C to stderr.  */
904 
905 extern void debug_cluster (bb_cluster *);
906 DEBUG_FUNCTION void
907 debug_cluster (bb_cluster *c)
908 {
909   print_cluster (stderr, c);
910 }
911 
912 /* Update C->rep_bb, given that BB is added to the cluster.  */
913 
914 static void
915 update_rep_bb (bb_cluster *c, basic_block bb)
916 {
917   /* Initial.  */
918   if (c->rep_bb == NULL)
919     {
920       c->rep_bb = bb;
921       return;
922     }
923 
924   /* Current needs no deps, keep it.  */
925   if (BB_DEP_BB (c->rep_bb) == NULL)
926     return;
927 
928   /* Bb needs no deps, change rep_bb.  */
929   if (BB_DEP_BB (bb) == NULL)
930     {
931       c->rep_bb = bb;
932       return;
933     }
934 
935   /* Bb needs last deps earlier than current, change rep_bb.  A potential
936      problem with this, is that the first deps might also be earlier, which
937      would mean we prefer longer lifetimes for the deps.  To be able to check
938      for this, we would have to trace BB_FIRST_DEP_BB as well, besides
939      BB_DEP_BB, which is really BB_LAST_DEP_BB.
940      The benefit of choosing the bb with last deps earlier, is that it can
941      potentially be used as replacement for more bbs.  */
942   if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb)))
943     c->rep_bb = bb;
944 }
945 
946 /* Add BB to cluster C.  Sets BB in C->bbs, and preds of BB in C->preds.  */
947 
948 static void
949 add_bb_to_cluster (bb_cluster *c, basic_block bb)
950 {
951   edge e;
952   edge_iterator ei;
953 
954   bitmap_set_bit (c->bbs, bb->index);
955 
956   FOR_EACH_EDGE (e, ei, bb->preds)
957     bitmap_set_bit (c->preds, e->src->index);
958 
959   update_rep_bb (c, bb);
960 }
961 
962 /* Allocate and init new cluster.  */
963 
964 static bb_cluster *
965 new_cluster (void)
966 {
967   bb_cluster *c;
968   c = XCNEW (bb_cluster);
969   c->bbs = BITMAP_ALLOC (NULL);
970   c->preds = BITMAP_ALLOC (NULL);
971   c->rep_bb = NULL;
972   return c;
973 }
974 
975 /* Delete clusters.  */
976 
977 static void
978 delete_cluster (bb_cluster *c)
979 {
980   if (c == NULL)
981     return;
982   BITMAP_FREE (c->bbs);
983   BITMAP_FREE (c->preds);
984   XDELETE (c);
985 }
986 
987 
988 /* Array that contains all clusters.  */
989 
990 static vec<bb_cluster *> all_clusters;
991 
992 /* Allocate all cluster vectors.  */
993 
994 static void
995 alloc_cluster_vectors (void)
996 {
997   all_clusters.create (n_basic_blocks_for_fn (cfun));
998 }
999 
1000 /* Reset all cluster vectors.  */
1001 
1002 static void
1003 reset_cluster_vectors (void)
1004 {
1005   unsigned int i;
1006   basic_block bb;
1007   for (i = 0; i < all_clusters.length (); ++i)
1008     delete_cluster (all_clusters[i]);
1009   all_clusters.truncate (0);
1010   FOR_EACH_BB_FN (bb, cfun)
1011     BB_CLUSTER (bb) = NULL;
1012 }
1013 
1014 /* Delete all cluster vectors.  */
1015 
1016 static void
1017 delete_cluster_vectors (void)
1018 {
1019   unsigned int i;
1020   for (i = 0; i < all_clusters.length (); ++i)
1021     delete_cluster (all_clusters[i]);
1022   all_clusters.release ();
1023 }
1024 
1025 /* Merge cluster C2 into C1.  */
1026 
1027 static void
1028 merge_clusters (bb_cluster *c1, bb_cluster *c2)
1029 {
1030   bitmap_ior_into (c1->bbs, c2->bbs);
1031   bitmap_ior_into (c1->preds, c2->preds);
1032 }
1033 
1034 /* Register equivalence of BB1 and BB2 (members of cluster C).  Store c in
1035    all_clusters, or merge c with existing cluster.  */
1036 
1037 static void
1038 set_cluster (basic_block bb1, basic_block bb2)
1039 {
1040   basic_block merge_bb, other_bb;
1041   bb_cluster *merge, *old, *c;
1042 
1043   if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL)
1044     {
1045       c = new_cluster ();
1046       add_bb_to_cluster (c, bb1);
1047       add_bb_to_cluster (c, bb2);
1048       BB_CLUSTER (bb1) = c;
1049       BB_CLUSTER (bb2) = c;
1050       c->index = all_clusters.length ();
1051       all_clusters.safe_push (c);
1052     }
1053   else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL)
1054     {
1055       merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1;
1056       other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2;
1057       merge = BB_CLUSTER (merge_bb);
1058       add_bb_to_cluster (merge, other_bb);
1059       BB_CLUSTER (other_bb) = merge;
1060     }
1061   else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2))
1062     {
1063       unsigned int i;
1064       bitmap_iterator bi;
1065 
1066       old = BB_CLUSTER (bb2);
1067       merge = BB_CLUSTER (bb1);
1068       merge_clusters (merge, old);
1069       EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi)
1070 	BB_CLUSTER (BASIC_BLOCK_FOR_FN (cfun, i)) = merge;
1071       all_clusters[old->index] = NULL;
1072       update_rep_bb (merge, old->rep_bb);
1073       delete_cluster (old);
1074     }
1075   else
1076     gcc_unreachable ();
1077 }
1078 
1079 /* Return true if gimple operands T1 and T2 have the same value.  */
1080 
1081 static bool
1082 gimple_operand_equal_value_p (tree t1, tree t2)
1083 {
1084   if (t1 == t2)
1085     return true;
1086 
1087   if (t1 == NULL_TREE
1088       || t2 == NULL_TREE)
1089     return false;
1090 
1091   if (operand_equal_p (t1, t2, OEP_MATCH_SIDE_EFFECTS))
1092     return true;
1093 
1094   return gvn_uses_equal (t1, t2);
1095 }
1096 
1097 /* Return true if gimple statements S1 and S2 are equal.  Gimple_bb (s1) and
1098    gimple_bb (s2) are members of SAME_SUCC.  */
1099 
1100 static bool
1101 gimple_equal_p (same_succ *same_succ, gimple *s1, gimple *s2)
1102 {
1103   unsigned int i;
1104   tree lhs1, lhs2;
1105   basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
1106   tree t1, t2;
1107   bool inv_cond;
1108   enum tree_code code1, code2;
1109 
1110   if (gimple_code (s1) != gimple_code (s2))
1111     return false;
1112 
1113   switch (gimple_code (s1))
1114     {
1115     case GIMPLE_CALL:
1116       if (!gimple_call_same_target_p (s1, s2))
1117 	return false;
1118 
1119       t1 = gimple_call_chain (s1);
1120       t2 = gimple_call_chain (s2);
1121       if (!gimple_operand_equal_value_p (t1, t2))
1122 	return false;
1123 
1124       if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
1125 	return false;
1126 
1127       for (i = 0; i < gimple_call_num_args (s1); ++i)
1128 	{
1129 	  t1 = gimple_call_arg (s1, i);
1130 	  t2 = gimple_call_arg (s2, i);
1131 	  if (!gimple_operand_equal_value_p (t1, t2))
1132 	    return false;
1133 	}
1134 
1135       lhs1 = gimple_get_lhs (s1);
1136       lhs2 = gimple_get_lhs (s2);
1137       if (lhs1 == NULL_TREE && lhs2 == NULL_TREE)
1138 	return true;
1139       if (lhs1 == NULL_TREE || lhs2 == NULL_TREE)
1140 	return false;
1141       if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME)
1142 	return vn_valueize (lhs1) == vn_valueize (lhs2);
1143       return operand_equal_p (lhs1, lhs2, 0);
1144 
1145     case GIMPLE_ASSIGN:
1146       lhs1 = gimple_get_lhs (s1);
1147       lhs2 = gimple_get_lhs (s2);
1148       if (TREE_CODE (lhs1) != SSA_NAME
1149 	  && TREE_CODE (lhs2) != SSA_NAME)
1150 	return (operand_equal_p (lhs1, lhs2, 0)
1151 		&& gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
1152 						 gimple_assign_rhs1 (s2)));
1153       else if (TREE_CODE (lhs1) == SSA_NAME
1154 	       && TREE_CODE (lhs2) == SSA_NAME)
1155 	return operand_equal_p (gimple_assign_rhs1 (s1),
1156 				gimple_assign_rhs1 (s2), 0);
1157       return false;
1158 
1159     case GIMPLE_COND:
1160       t1 = gimple_cond_lhs (s1);
1161       t2 = gimple_cond_lhs (s2);
1162       if (!gimple_operand_equal_value_p (t1, t2))
1163 	return false;
1164 
1165       t1 = gimple_cond_rhs (s1);
1166       t2 = gimple_cond_rhs (s2);
1167       if (!gimple_operand_equal_value_p (t1, t2))
1168 	return false;
1169 
1170       code1 = gimple_expr_code (s1);
1171       code2 = gimple_expr_code (s2);
1172       inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index)
1173 		  != bitmap_bit_p (same_succ->inverse, bb2->index));
1174       if (inv_cond)
1175 	{
1176 	  bool honor_nans = HONOR_NANS (t1);
1177 	  code2 = invert_tree_comparison (code2, honor_nans);
1178 	}
1179       return code1 == code2;
1180 
1181     default:
1182       return false;
1183     }
1184 }
1185 
1186 /* Let GSI skip backwards over local defs.  Return the earliest vuse in VUSE.
1187    Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the
1188    processed statements.  */
1189 
1190 static void
1191 gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
1192 				  bool *vuse_escaped)
1193 {
1194   gimple *stmt;
1195   tree lvuse;
1196 
1197   while (true)
1198     {
1199       if (gsi_end_p (*gsi))
1200 	return;
1201       stmt = gsi_stmt (*gsi);
1202 
1203       lvuse = gimple_vuse (stmt);
1204       if (lvuse != NULL_TREE)
1205 	{
1206 	  *vuse = lvuse;
1207 	  if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF))
1208 	    *vuse_escaped = true;
1209 	}
1210 
1211       if (!stmt_local_def (stmt))
1212 	return;
1213       gsi_prev_nondebug (gsi);
1214     }
1215 }
1216 
1217 /* Return true if equal (in the sense of gimple_equal_p) statements STMT1 and
1218    STMT2 are allowed to be merged.  */
1219 
1220 static bool
1221 merge_stmts_p (gimple *stmt1, gimple *stmt2)
1222 {
1223   /* What could be better than this here is to blacklist the bb
1224      containing the stmt, when encountering the stmt f.i. in
1225      same_succ_hash.  */
1226   if (is_tm_ending (stmt1))
1227     return false;
1228 
1229   /* Verify EH landing pads.  */
1230   if (lookup_stmt_eh_lp_fn (cfun, stmt1) != lookup_stmt_eh_lp_fn (cfun, stmt2))
1231     return false;
1232 
1233   if (is_gimple_call (stmt1)
1234       && gimple_call_internal_p (stmt1))
1235     switch (gimple_call_internal_fn (stmt1))
1236       {
1237       case IFN_UBSAN_NULL:
1238       case IFN_UBSAN_BOUNDS:
1239       case IFN_UBSAN_VPTR:
1240       case IFN_UBSAN_CHECK_ADD:
1241       case IFN_UBSAN_CHECK_SUB:
1242       case IFN_UBSAN_CHECK_MUL:
1243       case IFN_UBSAN_OBJECT_SIZE:
1244       case IFN_UBSAN_PTR:
1245       case IFN_ASAN_CHECK:
1246 	/* For these internal functions, gimple_location is an implicit
1247 	   parameter, which will be used explicitly after expansion.
1248 	   Merging these statements may cause confusing line numbers in
1249 	   sanitizer messages.  */
1250 	return gimple_location (stmt1) == gimple_location (stmt2);
1251       default:
1252 	break;
1253       }
1254 
1255   return true;
1256 }
1257 
1258 /* Determines whether BB1 and BB2 (members of same_succ) are duplicates.  If so,
1259    clusters them.  */
1260 
1261 static void
1262 find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2)
1263 {
1264   gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
1265   gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
1266   tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
1267   bool vuse_escaped = false;
1268 
1269   gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
1270   gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
1271 
1272   while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
1273     {
1274       gimple *stmt1 = gsi_stmt (gsi1);
1275       gimple *stmt2 = gsi_stmt (gsi2);
1276 
1277       if (gimple_code (stmt1) == GIMPLE_LABEL
1278 	  && gimple_code (stmt2) == GIMPLE_LABEL)
1279 	break;
1280 
1281       if (!gimple_equal_p (same_succ, stmt1, stmt2))
1282 	return;
1283 
1284       if (!merge_stmts_p (stmt1, stmt2))
1285 	return;
1286 
1287       gsi_prev_nondebug (&gsi1);
1288       gsi_prev_nondebug (&gsi2);
1289       gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
1290       gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
1291     }
1292 
1293   while (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
1294     {
1295       tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1)));
1296       if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
1297 	return;
1298       gsi_prev (&gsi1);
1299     }
1300   while (!gsi_end_p (gsi2) && gimple_code (gsi_stmt (gsi2)) == GIMPLE_LABEL)
1301     {
1302       tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi2)));
1303       if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
1304 	return;
1305       gsi_prev (&gsi2);
1306     }
1307   if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
1308     return;
1309 
1310   /* If the incoming vuses are not the same, and the vuse escaped into an
1311      SSA_OP_DEF, then merging the 2 blocks will change the value of the def,
1312      which potentially means the semantics of one of the blocks will be changed.
1313      TODO: make this check more precise.  */
1314   if (vuse_escaped && vuse1 != vuse2)
1315     return;
1316 
1317   if (dump_file)
1318     fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
1319 	     bb1->index, bb2->index);
1320 
1321   set_cluster (bb1, bb2);
1322 }
1323 
1324 /* Returns whether for all phis in DEST the phi alternatives for E1 and
1325    E2 are equal.  */
1326 
1327 static bool
1328 same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
1329 {
1330   int n1 = e1->dest_idx, n2 = e2->dest_idx;
1331   gphi_iterator gsi;
1332 
1333   for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
1334     {
1335       gphi *phi = gsi.phi ();
1336       tree lhs = gimple_phi_result (phi);
1337       tree val1 = gimple_phi_arg_def (phi, n1);
1338       tree val2 = gimple_phi_arg_def (phi, n2);
1339 
1340       if (virtual_operand_p (lhs))
1341 	continue;
1342 
1343       if (operand_equal_for_phi_arg_p (val1, val2))
1344 	continue;
1345       if (gvn_uses_equal (val1, val2))
1346 	continue;
1347 
1348       return false;
1349     }
1350 
1351   return true;
1352 }
1353 
1354 /* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the
1355    phi alternatives for BB1 and BB2 are equal.  */
1356 
1357 static bool
1358 same_phi_alternatives (same_succ *same_succ, basic_block bb1, basic_block bb2)
1359 {
1360   unsigned int s;
1361   bitmap_iterator bs;
1362   edge e1, e2;
1363   basic_block succ;
1364 
1365   EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs)
1366     {
1367       succ = BASIC_BLOCK_FOR_FN (cfun, s);
1368       e1 = find_edge (bb1, succ);
1369       e2 = find_edge (bb2, succ);
1370       if (e1->flags & EDGE_COMPLEX
1371 	  || e2->flags & EDGE_COMPLEX)
1372 	return false;
1373 
1374       /* For all phis in bb, the phi alternatives for e1 and e2 need to have
1375 	 the same value.  */
1376       if (!same_phi_alternatives_1 (succ, e1, e2))
1377 	return false;
1378     }
1379 
1380   return true;
1381 }
1382 
1383 /* Return true if BB has non-vop phis.  */
1384 
1385 static bool
1386 bb_has_non_vop_phi (basic_block bb)
1387 {
1388   gimple_seq phis = phi_nodes (bb);
1389   gimple *phi;
1390 
1391   if (phis == NULL)
1392     return false;
1393 
1394   if (!gimple_seq_singleton_p (phis))
1395     return true;
1396 
1397   phi = gimple_seq_first_stmt (phis);
1398   return !virtual_operand_p (gimple_phi_result (phi));
1399 }
1400 
1401 /* Returns true if redirecting the incoming edges of FROM to TO maintains the
1402    invariant that uses in FROM are dominates by their defs.  */
1403 
1404 static bool
1405 deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to)
1406 {
1407   basic_block cd, dep_bb = BB_DEP_BB (to);
1408   edge_iterator ei;
1409   edge e;
1410 
1411   if (dep_bb == NULL)
1412     return true;
1413 
1414   bitmap from_preds = BITMAP_ALLOC (NULL);
1415   FOR_EACH_EDGE (e, ei, from->preds)
1416     bitmap_set_bit (from_preds, e->src->index);
1417   cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
1418   BITMAP_FREE (from_preds);
1419 
1420   return dominated_by_p (CDI_DOMINATORS, dep_bb, cd);
1421 }
1422 
1423 /* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its
1424    replacement bb) and vice versa maintains the invariant that uses in the
1425    replacement are dominates by their defs.  */
1426 
1427 static bool
1428 deps_ok_for_redirect (basic_block bb1, basic_block bb2)
1429 {
1430   if (BB_CLUSTER (bb1) != NULL)
1431     bb1 = BB_CLUSTER (bb1)->rep_bb;
1432 
1433   if (BB_CLUSTER (bb2) != NULL)
1434     bb2 = BB_CLUSTER (bb2)->rep_bb;
1435 
1436   return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2)
1437 	  && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1));
1438 }
1439 
1440 /* Within SAME_SUCC->bbs, find clusters of bbs which can be merged.  */
1441 
1442 static void
1443 find_clusters_1 (same_succ *same_succ)
1444 {
1445   basic_block bb1, bb2;
1446   unsigned int i, j;
1447   bitmap_iterator bi, bj;
1448   int nr_comparisons;
1449   int max_comparisons = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_COMPARISONS);
1450 
1451   EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
1452     {
1453       bb1 = BASIC_BLOCK_FOR_FN (cfun, i);
1454 
1455       /* TODO: handle blocks with phi-nodes.  We'll have to find corresponding
1456 	 phi-nodes in bb1 and bb2, with the same alternatives for the same
1457 	 preds.  */
1458       if (bb_has_non_vop_phi (bb1) || bb_has_eh_pred (bb1)
1459 	  || bb_has_abnormal_pred (bb1))
1460 	continue;
1461 
1462       nr_comparisons = 0;
1463       EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj)
1464 	{
1465 	  bb2 = BASIC_BLOCK_FOR_FN (cfun, j);
1466 
1467 	  if (bb_has_non_vop_phi (bb2) || bb_has_eh_pred (bb2)
1468 	      || bb_has_abnormal_pred (bb2))
1469 	    continue;
1470 
1471 	  if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2))
1472 	    continue;
1473 
1474 	  /* Limit quadratic behavior.  */
1475 	  nr_comparisons++;
1476 	  if (nr_comparisons > max_comparisons)
1477 	    break;
1478 
1479 	  /* This is a conservative dependency check.  We could test more
1480 	     precise for allowed replacement direction.  */
1481 	  if (!deps_ok_for_redirect (bb1, bb2))
1482 	    continue;
1483 
1484 	  if (!(same_phi_alternatives (same_succ, bb1, bb2)))
1485 	    continue;
1486 
1487 	  find_duplicate (same_succ, bb1, bb2);
1488 	}
1489     }
1490 }
1491 
1492 /* Find clusters of bbs which can be merged.  */
1493 
1494 static void
1495 find_clusters (void)
1496 {
1497   same_succ *same;
1498 
1499   while (!worklist.is_empty ())
1500     {
1501       same = worklist.pop ();
1502       same->in_worklist = false;
1503       if (dump_file && (dump_flags & TDF_DETAILS))
1504 	{
1505 	  fprintf (dump_file, "processing worklist entry\n");
1506 	  same_succ_print (dump_file, same);
1507 	}
1508       find_clusters_1 (same);
1509     }
1510 }
1511 
1512 /* Returns the vop phi of BB, if any.  */
1513 
1514 static gphi *
1515 vop_phi (basic_block bb)
1516 {
1517   gphi *stmt;
1518   gphi_iterator gsi;
1519   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1520     {
1521       stmt = gsi.phi ();
1522       if (! virtual_operand_p (gimple_phi_result (stmt)))
1523 	continue;
1524       return stmt;
1525     }
1526   return NULL;
1527 }
1528 
1529 /* Redirect all edges from BB1 to BB2, removes BB1 and marks it as removed.  */
1530 
1531 static void
1532 replace_block_by (basic_block bb1, basic_block bb2)
1533 {
1534   edge pred_edge;
1535   unsigned int i;
1536   gphi *bb2_phi;
1537 
1538   bb2_phi = vop_phi (bb2);
1539 
1540   /* Mark the basic block as deleted.  */
1541   mark_basic_block_deleted (bb1);
1542 
1543   /* Redirect the incoming edges of bb1 to bb2.  */
1544   for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
1545     {
1546       pred_edge = EDGE_PRED (bb1, i - 1);
1547       pred_edge = redirect_edge_and_branch (pred_edge, bb2);
1548       gcc_assert (pred_edge != NULL);
1549 
1550       if (bb2_phi == NULL)
1551 	continue;
1552 
1553       /* The phi might have run out of capacity when the redirect added an
1554 	 argument, which means it could have been replaced.  Refresh it.  */
1555       bb2_phi = vop_phi (bb2);
1556 
1557       add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
1558 		   pred_edge, UNKNOWN_LOCATION);
1559     }
1560 
1561 
1562   /* Merge the outgoing edge counts from bb1 onto bb2.  */
1563   edge e1, e2;
1564   edge_iterator ei;
1565 
1566   if (bb2->count.initialized_p ())
1567     FOR_EACH_EDGE (e1, ei, bb1->succs)
1568       {
1569         e2 = find_edge (bb2, e1->dest);
1570         gcc_assert (e2);
1571 
1572 	/* If probabilities are same, we are done.
1573 	   If counts are nonzero we can distribute accordingly. In remaining
1574 	   cases just avreage the values and hope for the best.  */
1575 	e2->probability = e1->probability.combine_with_count
1576 	                     (bb1->count, e2->probability, bb2->count);
1577       }
1578   bb2->count += bb1->count;
1579 
1580   /* Move over any user labels from bb1 after the bb2 labels.  */
1581   gimple_stmt_iterator gsi1 = gsi_start_bb (bb1);
1582   if (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
1583     {
1584       gimple_stmt_iterator gsi2 = gsi_after_labels (bb2);
1585       while (!gsi_end_p (gsi1)
1586 	     && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
1587 	{
1588 	  tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1)));
1589 	  gcc_assert (!DECL_NONLOCAL (label) && !FORCED_LABEL (label));
1590 	  if (DECL_ARTIFICIAL (label))
1591 	    gsi_next (&gsi1);
1592 	  else
1593 	    gsi_move_before (&gsi1, &gsi2);
1594 	}
1595     }
1596 
1597   /* Clear range info from all stmts in BB2 -- this transformation
1598      could make them out of date.  */
1599   reset_flow_sensitive_info_in_bb (bb2);
1600 
1601   /* Do updates that use bb1, before deleting bb1.  */
1602   release_last_vdef (bb1);
1603   same_succ_flush_bb (bb1);
1604 
1605   delete_basic_block (bb1);
1606 }
1607 
1608 /* Bbs for which update_debug_stmt need to be called.  */
1609 
1610 static bitmap update_bbs;
1611 
1612 /* For each cluster in all_clusters, merge all cluster->bbs.  Returns
1613    number of bbs removed.  */
1614 
1615 static int
1616 apply_clusters (void)
1617 {
1618   basic_block bb1, bb2;
1619   bb_cluster *c;
1620   unsigned int i, j;
1621   bitmap_iterator bj;
1622   int nr_bbs_removed = 0;
1623 
1624   for (i = 0; i < all_clusters.length (); ++i)
1625     {
1626       c = all_clusters[i];
1627       if (c == NULL)
1628 	continue;
1629 
1630       bb2 = c->rep_bb;
1631       bitmap_set_bit (update_bbs, bb2->index);
1632 
1633       bitmap_clear_bit (c->bbs, bb2->index);
1634       EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
1635 	{
1636 	  bb1 = BASIC_BLOCK_FOR_FN (cfun, j);
1637 	  bitmap_clear_bit (update_bbs, bb1->index);
1638 
1639 	  replace_block_by (bb1, bb2);
1640 	  nr_bbs_removed++;
1641 	}
1642     }
1643 
1644   return nr_bbs_removed;
1645 }
1646 
1647 /* Resets debug statement STMT if it has uses that are not dominated by their
1648    defs.  */
1649 
1650 static void
1651 update_debug_stmt (gimple *stmt)
1652 {
1653   use_operand_p use_p;
1654   ssa_op_iter oi;
1655   basic_block bbuse;
1656 
1657   if (!gimple_debug_bind_p (stmt))
1658     return;
1659 
1660   bbuse = gimple_bb (stmt);
1661   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
1662     {
1663       tree name = USE_FROM_PTR (use_p);
1664       gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1665       basic_block bbdef = gimple_bb (def_stmt);
1666       if (bbdef == NULL || bbuse == bbdef
1667 	  || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
1668 	continue;
1669 
1670       gimple_debug_bind_reset_value (stmt);
1671       update_stmt (stmt);
1672       break;
1673     }
1674 }
1675 
1676 /* Resets all debug statements that have uses that are not
1677    dominated by their defs.  */
1678 
1679 static void
1680 update_debug_stmts (void)
1681 {
1682   basic_block bb;
1683   bitmap_iterator bi;
1684   unsigned int i;
1685 
1686   EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
1687     {
1688       gimple *stmt;
1689       gimple_stmt_iterator gsi;
1690 
1691       bb = BASIC_BLOCK_FOR_FN (cfun, i);
1692       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1693 	{
1694 	  stmt = gsi_stmt (gsi);
1695 	  if (!is_gimple_debug (stmt))
1696 	    continue;
1697 	  update_debug_stmt (stmt);
1698 	}
1699     }
1700 }
1701 
1702 /* Runs tail merge optimization.  */
1703 
1704 unsigned int
1705 tail_merge_optimize (unsigned int todo)
1706 {
1707   int nr_bbs_removed_total = 0;
1708   int nr_bbs_removed;
1709   bool loop_entered = false;
1710   int iteration_nr = 0;
1711   int max_iterations = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_ITERATIONS);
1712 
1713   if (!flag_tree_tail_merge
1714       || max_iterations == 0)
1715     return 0;
1716 
1717   timevar_push (TV_TREE_TAIL_MERGE);
1718 
1719   /* We enter from PRE which has critical edges split.  Elimination
1720      does not process trivially dead code so cleanup the CFG if we
1721      are told so.  And re-split critical edges then.  */
1722   if (todo & TODO_cleanup_cfg)
1723     {
1724       cleanup_tree_cfg ();
1725       todo &= ~TODO_cleanup_cfg;
1726       split_critical_edges ();
1727     }
1728 
1729   if (!dom_info_available_p (CDI_DOMINATORS))
1730     {
1731       /* PRE can leave us with unreachable blocks, remove them now.  */
1732       delete_unreachable_blocks ();
1733       calculate_dominance_info (CDI_DOMINATORS);
1734     }
1735   init_worklist ();
1736 
1737   while (!worklist.is_empty ())
1738     {
1739       if (!loop_entered)
1740 	{
1741 	  loop_entered = true;
1742 	  alloc_cluster_vectors ();
1743 	  update_bbs = BITMAP_ALLOC (NULL);
1744 	}
1745       else
1746 	reset_cluster_vectors ();
1747 
1748       iteration_nr++;
1749       if (dump_file && (dump_flags & TDF_DETAILS))
1750 	fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
1751 
1752       find_clusters ();
1753       gcc_assert (worklist.is_empty ());
1754       if (all_clusters.is_empty ())
1755 	break;
1756 
1757       nr_bbs_removed = apply_clusters ();
1758       nr_bbs_removed_total += nr_bbs_removed;
1759       if (nr_bbs_removed == 0)
1760 	break;
1761 
1762       free_dominance_info (CDI_DOMINATORS);
1763 
1764       if (iteration_nr == max_iterations)
1765 	break;
1766 
1767       calculate_dominance_info (CDI_DOMINATORS);
1768       update_worklist ();
1769     }
1770 
1771   if (dump_file && (dump_flags & TDF_DETAILS))
1772     fprintf (dump_file, "htab collision / search: %f\n",
1773 	     same_succ_htab->collisions ());
1774 
1775   if (nr_bbs_removed_total > 0)
1776     {
1777       if (MAY_HAVE_DEBUG_BIND_STMTS)
1778 	{
1779 	  calculate_dominance_info (CDI_DOMINATORS);
1780 	  update_debug_stmts ();
1781 	}
1782 
1783       if (dump_file && (dump_flags & TDF_DETAILS))
1784 	{
1785 	  fprintf (dump_file, "Before TODOs.\n");
1786 	  dump_function_to_file (current_function_decl, dump_file, dump_flags);
1787 	}
1788 
1789       mark_virtual_operands_for_renaming (cfun);
1790     }
1791 
1792   delete_worklist ();
1793   if (loop_entered)
1794     {
1795       delete_cluster_vectors ();
1796       BITMAP_FREE (update_bbs);
1797     }
1798 
1799   timevar_pop (TV_TREE_TAIL_MERGE);
1800 
1801   return todo;
1802 }
1803