aarch64 - Set the mode for the unspec in speculation_tracker insn.
[platform/upstream/linaro-gcc.git] / gcc / tree-ssa-tail-merge.c
1 /* Tail merging for gimple.
2    Copyright (C) 2011-2016 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
209 /* Describes a group of bbs with the same successors.  The successor bbs are
210    cached in succs, and the successor edge flags are cached in succ_flags.
211    If a bb has the EDGE_TRUE/FALSE_VALUE flags swapped compared to succ_flags,
212    it's marked in inverse.
213    Additionally, the hash value for the struct is cached in hashval, and
214    in_worklist indicates whether it's currently part of worklist.  */
215
216 struct same_succ : pointer_hash <same_succ>
217 {
218   /* The bbs that have the same successor bbs.  */
219   bitmap bbs;
220   /* The successor bbs.  */
221   bitmap succs;
222   /* Indicates whether the EDGE_TRUE/FALSE_VALUEs of succ_flags are swapped for
223      bb.  */
224   bitmap inverse;
225   /* The edge flags for each of the successor bbs.  */
226   vec<int> succ_flags;
227   /* Indicates whether the struct is currently in the worklist.  */
228   bool in_worklist;
229   /* The hash value of the struct.  */
230   hashval_t hashval;
231
232   /* hash_table support.  */
233   static inline hashval_t hash (const same_succ *);
234   static int equal (const same_succ *, const same_succ *);
235   static void remove (same_succ *);
236 };
237
238 /* hash routine for hash_table support, returns hashval of E.  */
239
240 inline hashval_t
241 same_succ::hash (const same_succ *e)
242 {
243   return e->hashval;
244 }
245
246 /* A group of bbs where 1 bb from bbs can replace the other bbs.  */
247
248 struct bb_cluster
249 {
250   /* The bbs in the cluster.  */
251   bitmap bbs;
252   /* The preds of the bbs in the cluster.  */
253   bitmap preds;
254   /* Index in all_clusters vector.  */
255   int index;
256   /* The bb to replace the cluster with.  */
257   basic_block rep_bb;
258 };
259
260 /* Per bb-info.  */
261
262 struct aux_bb_info
263 {
264   /* The number of non-debug statements in the bb.  */
265   int size;
266   /* The same_succ that this bb is a member of.  */
267   same_succ *bb_same_succ;
268   /* The cluster that this bb is a member of.  */
269   bb_cluster *cluster;
270   /* The vop state at the exit of a bb.  This is shortlived data, used to
271      communicate data between update_block_by and update_vuses.  */
272   tree vop_at_exit;
273   /* The bb that either contains or is dominated by the dependencies of the
274      bb.  */
275   basic_block dep_bb;
276 };
277
278 /* Macros to access the fields of struct aux_bb_info.  */
279
280 #define BB_SIZE(bb) (((struct aux_bb_info *)bb->aux)->size)
281 #define BB_SAME_SUCC(bb) (((struct aux_bb_info *)bb->aux)->bb_same_succ)
282 #define BB_CLUSTER(bb) (((struct aux_bb_info *)bb->aux)->cluster)
283 #define BB_VOP_AT_EXIT(bb) (((struct aux_bb_info *)bb->aux)->vop_at_exit)
284 #define BB_DEP_BB(bb) (((struct aux_bb_info *)bb->aux)->dep_bb)
285
286 /* Returns true if the only effect a statement STMT has, is to define locally
287    used SSA_NAMEs.  */
288
289 static bool
290 stmt_local_def (gimple *stmt)
291 {
292   basic_block bb, def_bb;
293   imm_use_iterator iter;
294   use_operand_p use_p;
295   tree val;
296   def_operand_p def_p;
297
298   if (gimple_vdef (stmt) != NULL_TREE
299       || gimple_has_side_effects (stmt)
300       || gimple_could_trap_p_1 (stmt, false, false)
301       || gimple_vuse (stmt) != NULL_TREE)
302     return false;
303
304   def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
305   if (def_p == NULL)
306     return false;
307
308   val = DEF_FROM_PTR (def_p);
309   if (val == NULL_TREE || TREE_CODE (val) != SSA_NAME)
310     return false;
311
312   def_bb = gimple_bb (stmt);
313
314   FOR_EACH_IMM_USE_FAST (use_p, iter, val)
315     {
316       if (is_gimple_debug (USE_STMT (use_p)))
317         continue;
318       bb = gimple_bb (USE_STMT (use_p));
319       if (bb == def_bb)
320         continue;
321
322       if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
323           && EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src == def_bb)
324         continue;
325
326       return false;
327     }
328
329   return true;
330 }
331
332 /* Let GSI skip forwards over local defs.  */
333
334 static void
335 gsi_advance_fw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
336 {
337   gimple *stmt;
338
339   while (true)
340     {
341       if (gsi_end_p (*gsi))
342         return;
343       stmt = gsi_stmt (*gsi);
344       if (!stmt_local_def (stmt))
345         return;
346       gsi_next_nondebug (gsi);
347     }
348 }
349
350 /* VAL1 and VAL2 are either:
351    - uses in BB1 and BB2, or
352    - phi alternatives for BB1 and BB2.
353    Return true if the uses have the same gvn value.  */
354
355 static bool
356 gvn_uses_equal (tree val1, tree val2)
357 {
358   gcc_checking_assert (val1 != NULL_TREE && val2 != NULL_TREE);
359
360   if (val1 == val2)
361     return true;
362
363   if (vn_valueize (val1) != vn_valueize (val2))
364     return false;
365
366   return ((TREE_CODE (val1) == SSA_NAME || CONSTANT_CLASS_P (val1))
367           && (TREE_CODE (val2) == SSA_NAME || CONSTANT_CLASS_P (val2)));
368 }
369
370 /* Prints E to FILE.  */
371
372 static void
373 same_succ_print (FILE *file, const same_succ *e)
374 {
375   unsigned int i;
376   bitmap_print (file, e->bbs, "bbs:", "\n");
377   bitmap_print (file, e->succs, "succs:", "\n");
378   bitmap_print (file, e->inverse, "inverse:", "\n");
379   fprintf (file, "flags:");
380   for (i = 0; i < e->succ_flags.length (); ++i)
381     fprintf (file, " %x", e->succ_flags[i]);
382   fprintf (file, "\n");
383 }
384
385 /* Prints same_succ VE to VFILE.  */
386
387 inline int
388 ssa_same_succ_print_traverse (same_succ **pe, FILE *file)
389 {
390   const same_succ *e = *pe;
391   same_succ_print (file, e);
392   return 1;
393 }
394
395 /* Update BB_DEP_BB (USE_BB), given a use of VAL in USE_BB.  */
396
397 static void
398 update_dep_bb (basic_block use_bb, tree val)
399 {
400   basic_block dep_bb;
401
402   /* Not a dep.  */
403   if (TREE_CODE (val) != SSA_NAME)
404     return;
405
406   /* Skip use of global def.  */
407   if (SSA_NAME_IS_DEFAULT_DEF (val))
408     return;
409
410   /* Skip use of local def.  */
411   dep_bb = gimple_bb (SSA_NAME_DEF_STMT (val));
412   if (dep_bb == use_bb)
413     return;
414
415   if (BB_DEP_BB (use_bb) == NULL
416       || dominated_by_p (CDI_DOMINATORS, dep_bb, BB_DEP_BB (use_bb)))
417     BB_DEP_BB (use_bb) = dep_bb;
418 }
419
420 /* Update BB_DEP_BB, given the dependencies in STMT.  */
421
422 static void
423 stmt_update_dep_bb (gimple *stmt)
424 {
425   ssa_op_iter iter;
426   use_operand_p use;
427
428   FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE)
429     update_dep_bb (gimple_bb (stmt), USE_FROM_PTR (use));
430 }
431
432 /* Calculates hash value for same_succ VE.  */
433
434 static hashval_t
435 same_succ_hash (const same_succ *e)
436 {
437   inchash::hash hstate (bitmap_hash (e->succs));
438   int flags;
439   unsigned int i;
440   unsigned int first = bitmap_first_set_bit (e->bbs);
441   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, first);
442   int size = 0;
443   gimple *stmt;
444   tree arg;
445   unsigned int s;
446   bitmap_iterator bs;
447
448   for (gimple_stmt_iterator gsi = gsi_start_nondebug_bb (bb);
449        !gsi_end_p (gsi); gsi_next_nondebug (&gsi))
450     {
451       stmt = gsi_stmt (gsi);
452       stmt_update_dep_bb (stmt);
453       if (stmt_local_def (stmt))
454         continue;
455       size++;
456
457       hstate.add_int (gimple_code (stmt));
458       if (is_gimple_assign (stmt))
459         hstate.add_int (gimple_assign_rhs_code (stmt));
460       if (!is_gimple_call (stmt))
461         continue;
462       if (gimple_call_internal_p (stmt))
463         hstate.add_int (gimple_call_internal_fn (stmt));
464       else
465         {
466           inchash::add_expr (gimple_call_fn (stmt), hstate);
467           if (gimple_call_chain (stmt))
468             inchash::add_expr (gimple_call_chain (stmt), hstate);
469         }
470       for (i = 0; i < gimple_call_num_args (stmt); i++)
471         {
472           arg = gimple_call_arg (stmt, i);
473           arg = vn_valueize (arg);
474           inchash::add_expr (arg, hstate);
475         }
476     }
477
478   hstate.add_int (size);
479   BB_SIZE (bb) = size;
480
481   for (i = 0; i < e->succ_flags.length (); ++i)
482     {
483       flags = e->succ_flags[i];
484       flags = flags & ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
485       hstate.add_int (flags);
486     }
487
488   EXECUTE_IF_SET_IN_BITMAP (e->succs, 0, s, bs)
489     {
490       int n = find_edge (bb, BASIC_BLOCK_FOR_FN (cfun, s))->dest_idx;
491       for (gphi_iterator gsi = gsi_start_phis (BASIC_BLOCK_FOR_FN (cfun, s));
492            !gsi_end_p (gsi);
493            gsi_next (&gsi))
494         {
495           gphi *phi = gsi.phi ();
496           tree lhs = gimple_phi_result (phi);
497           tree val = gimple_phi_arg_def (phi, n);
498
499           if (virtual_operand_p (lhs))
500             continue;
501           update_dep_bb (bb, val);
502         }
503     }
504
505   return hstate.end ();
506 }
507
508 /* Returns true if E1 and E2 have 2 successors, and if the successor flags
509    are inverse for the EDGE_TRUE_VALUE and EDGE_FALSE_VALUE flags, and equal for
510    the other edge flags.  */
511
512 static bool
513 inverse_flags (const same_succ *e1, const same_succ *e2)
514 {
515   int f1a, f1b, f2a, f2b;
516   int mask = ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
517
518   if (e1->succ_flags.length () != 2)
519     return false;
520
521   f1a = e1->succ_flags[0];
522   f1b = e1->succ_flags[1];
523   f2a = e2->succ_flags[0];
524   f2b = e2->succ_flags[1];
525
526   if (f1a == f2a && f1b == f2b)
527     return false;
528
529   return (f1a & mask) == (f2a & mask) && (f1b & mask) == (f2b & mask);
530 }
531
532 /* Compares SAME_SUCCs E1 and E2.  */
533
534 int
535 same_succ::equal (const same_succ *e1, const same_succ *e2)
536 {
537   unsigned int i, first1, first2;
538   gimple_stmt_iterator gsi1, gsi2;
539   gimple *s1, *s2;
540   basic_block bb1, bb2;
541
542   if (e1 == e2)
543     return 1;
544
545   if (e1->hashval != e2->hashval)
546     return 0;
547
548   if (e1->succ_flags.length () != e2->succ_flags.length ())
549     return 0;
550
551   if (!bitmap_equal_p (e1->succs, e2->succs))
552     return 0;
553
554   if (!inverse_flags (e1, e2))
555     {
556       for (i = 0; i < e1->succ_flags.length (); ++i)
557         if (e1->succ_flags[i] != e2->succ_flags[i])
558           return 0;
559     }
560
561   first1 = bitmap_first_set_bit (e1->bbs);
562   first2 = bitmap_first_set_bit (e2->bbs);
563
564   bb1 = BASIC_BLOCK_FOR_FN (cfun, first1);
565   bb2 = BASIC_BLOCK_FOR_FN (cfun, first2);
566
567   if (BB_SIZE (bb1) != BB_SIZE (bb2))
568     return 0;
569
570   gsi1 = gsi_start_nondebug_bb (bb1);
571   gsi2 = gsi_start_nondebug_bb (bb2);
572   gsi_advance_fw_nondebug_nonlocal (&gsi1);
573   gsi_advance_fw_nondebug_nonlocal (&gsi2);
574   while (!(gsi_end_p (gsi1) || gsi_end_p (gsi2)))
575     {
576       s1 = gsi_stmt (gsi1);
577       s2 = gsi_stmt (gsi2);
578       if (gimple_code (s1) != gimple_code (s2))
579         return 0;
580       if (is_gimple_call (s1) && !gimple_call_same_target_p (s1, s2))
581         return 0;
582       gsi_next_nondebug (&gsi1);
583       gsi_next_nondebug (&gsi2);
584       gsi_advance_fw_nondebug_nonlocal (&gsi1);
585       gsi_advance_fw_nondebug_nonlocal (&gsi2);
586     }
587
588   return 1;
589 }
590
591 /* Alloc and init a new SAME_SUCC.  */
592
593 static same_succ *
594 same_succ_alloc (void)
595 {
596   same_succ *same = XNEW (struct same_succ);
597
598   same->bbs = BITMAP_ALLOC (NULL);
599   same->succs = BITMAP_ALLOC (NULL);
600   same->inverse = BITMAP_ALLOC (NULL);
601   same->succ_flags.create (10);
602   same->in_worklist = false;
603
604   return same;
605 }
606
607 /* Delete same_succ E.  */
608
609 void
610 same_succ::remove (same_succ *e)
611 {
612   BITMAP_FREE (e->bbs);
613   BITMAP_FREE (e->succs);
614   BITMAP_FREE (e->inverse);
615   e->succ_flags.release ();
616
617   XDELETE (e);
618 }
619
620 /* Reset same_succ SAME.  */
621
622 static void
623 same_succ_reset (same_succ *same)
624 {
625   bitmap_clear (same->bbs);
626   bitmap_clear (same->succs);
627   bitmap_clear (same->inverse);
628   same->succ_flags.truncate (0);
629 }
630
631 static hash_table<same_succ> *same_succ_htab;
632
633 /* Array that is used to store the edge flags for a successor.  */
634
635 static int *same_succ_edge_flags;
636
637 /* Bitmap that is used to mark bbs that are recently deleted.  */
638
639 static bitmap deleted_bbs;
640
641 /* Bitmap that is used to mark predecessors of bbs that are
642    deleted.  */
643
644 static bitmap deleted_bb_preds;
645
646 /* Prints same_succ_htab to stderr.  */
647
648 extern void debug_same_succ (void);
649 DEBUG_FUNCTION void
650 debug_same_succ ( void)
651 {
652   same_succ_htab->traverse <FILE *, ssa_same_succ_print_traverse> (stderr);
653 }
654
655
656 /* Vector of bbs to process.  */
657
658 static vec<same_succ *> worklist;
659
660 /* Prints worklist to FILE.  */
661
662 static void
663 print_worklist (FILE *file)
664 {
665   unsigned int i;
666   for (i = 0; i < worklist.length (); ++i)
667     same_succ_print (file, worklist[i]);
668 }
669
670 /* Adds SAME to worklist.  */
671
672 static void
673 add_to_worklist (same_succ *same)
674 {
675   if (same->in_worklist)
676     return;
677
678   if (bitmap_count_bits (same->bbs) < 2)
679     return;
680
681   same->in_worklist = true;
682   worklist.safe_push (same);
683 }
684
685 /* Add BB to same_succ_htab.  */
686
687 static void
688 find_same_succ_bb (basic_block bb, same_succ **same_p)
689 {
690   unsigned int j;
691   bitmap_iterator bj;
692   same_succ *same = *same_p;
693   same_succ **slot;
694   edge_iterator ei;
695   edge e;
696
697   if (bb == NULL
698       /* Be conservative with loop structure.  It's not evident that this test
699          is sufficient.  Before tail-merge, we've just called
700          loop_optimizer_finalize, and LOOPS_MAY_HAVE_MULTIPLE_LATCHES is now
701          set, so there's no guarantee that the loop->latch value is still valid.
702          But we assume that, since we've forced LOOPS_HAVE_SIMPLE_LATCHES at the
703          start of pre, we've kept that property intact throughout pre, and are
704          keeping it throughout tail-merge using this test.  */
705       || bb->loop_father->latch == bb)
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;
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   BB_SAME_SUCC (bb) = NULL;
812   if (bitmap_single_bit_set_p (same->bbs))
813     same_succ_htab->remove_elt_with_hash (same, same->hashval);
814   else
815     bitmap_clear_bit (same->bbs, bb->index);
816 }
817
818 /* Removes all bbs in BBS from their corresponding same_succ.  */
819
820 static void
821 same_succ_flush_bbs (bitmap bbs)
822 {
823   unsigned int i;
824   bitmap_iterator bi;
825
826   EXECUTE_IF_SET_IN_BITMAP (bbs, 0, i, bi)
827     same_succ_flush_bb (BASIC_BLOCK_FOR_FN (cfun, i));
828 }
829
830 /* Release the last vdef in BB, either normal or phi result.  */
831
832 static void
833 release_last_vdef (basic_block bb)
834 {
835   for (gimple_stmt_iterator i = gsi_last_bb (bb); !gsi_end_p (i);
836        gsi_prev_nondebug (&i))
837     {
838       gimple *stmt = gsi_stmt (i);
839       if (gimple_vdef (stmt) == NULL_TREE)
840         continue;
841
842       mark_virtual_operand_for_renaming (gimple_vdef (stmt));
843       return;
844     }
845
846   for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i);
847        gsi_next (&i))
848     {
849       gphi *phi = i.phi ();
850       tree res = gimple_phi_result (phi);
851
852       if (!virtual_operand_p (res))
853         continue;
854
855       mark_virtual_phi_result_for_renaming (phi);
856       return;
857     }
858 }
859
860 /* For deleted_bb_preds, find bbs with same successors.  */
861
862 static void
863 update_worklist (void)
864 {
865   unsigned int i;
866   bitmap_iterator bi;
867   basic_block bb;
868   same_succ *same;
869
870   bitmap_and_compl_into (deleted_bb_preds, deleted_bbs);
871   bitmap_clear (deleted_bbs);
872
873   bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK);
874   same_succ_flush_bbs (deleted_bb_preds);
875
876   same = same_succ_alloc ();
877   EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi)
878     {
879       bb = BASIC_BLOCK_FOR_FN (cfun, i);
880       gcc_assert (bb != NULL);
881       find_same_succ_bb (bb, &same);
882       if (same == NULL)
883         same = same_succ_alloc ();
884     }
885   same_succ::remove (same);
886   bitmap_clear (deleted_bb_preds);
887 }
888
889 /* Prints cluster C to FILE.  */
890
891 static void
892 print_cluster (FILE *file, bb_cluster *c)
893 {
894   if (c == NULL)
895     return;
896   bitmap_print (file, c->bbs, "bbs:", "\n");
897   bitmap_print (file, c->preds, "preds:", "\n");
898 }
899
900 /* Prints cluster C to stderr.  */
901
902 extern void debug_cluster (bb_cluster *);
903 DEBUG_FUNCTION void
904 debug_cluster (bb_cluster *c)
905 {
906   print_cluster (stderr, c);
907 }
908
909 /* Update C->rep_bb, given that BB is added to the cluster.  */
910
911 static void
912 update_rep_bb (bb_cluster *c, basic_block bb)
913 {
914   /* Initial.  */
915   if (c->rep_bb == NULL)
916     {
917       c->rep_bb = bb;
918       return;
919     }
920
921   /* Current needs no deps, keep it.  */
922   if (BB_DEP_BB (c->rep_bb) == NULL)
923     return;
924
925   /* Bb needs no deps, change rep_bb.  */
926   if (BB_DEP_BB (bb) == NULL)
927     {
928       c->rep_bb = bb;
929       return;
930     }
931
932   /* Bb needs last deps earlier than current, change rep_bb.  A potential
933      problem with this, is that the first deps might also be earlier, which
934      would mean we prefer longer lifetimes for the deps.  To be able to check
935      for this, we would have to trace BB_FIRST_DEP_BB as well, besides
936      BB_DEP_BB, which is really BB_LAST_DEP_BB.
937      The benefit of choosing the bb with last deps earlier, is that it can
938      potentially be used as replacement for more bbs.  */
939   if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb)))
940     c->rep_bb = bb;
941 }
942
943 /* Add BB to cluster C.  Sets BB in C->bbs, and preds of BB in C->preds.  */
944
945 static void
946 add_bb_to_cluster (bb_cluster *c, basic_block bb)
947 {
948   edge e;
949   edge_iterator ei;
950
951   bitmap_set_bit (c->bbs, bb->index);
952
953   FOR_EACH_EDGE (e, ei, bb->preds)
954     bitmap_set_bit (c->preds, e->src->index);
955
956   update_rep_bb (c, bb);
957 }
958
959 /* Allocate and init new cluster.  */
960
961 static bb_cluster *
962 new_cluster (void)
963 {
964   bb_cluster *c;
965   c = XCNEW (bb_cluster);
966   c->bbs = BITMAP_ALLOC (NULL);
967   c->preds = BITMAP_ALLOC (NULL);
968   c->rep_bb = NULL;
969   return c;
970 }
971
972 /* Delete clusters.  */
973
974 static void
975 delete_cluster (bb_cluster *c)
976 {
977   if (c == NULL)
978     return;
979   BITMAP_FREE (c->bbs);
980   BITMAP_FREE (c->preds);
981   XDELETE (c);
982 }
983
984
985 /* Array that contains all clusters.  */
986
987 static vec<bb_cluster *> all_clusters;
988
989 /* Allocate all cluster vectors.  */
990
991 static void
992 alloc_cluster_vectors (void)
993 {
994   all_clusters.create (n_basic_blocks_for_fn (cfun));
995 }
996
997 /* Reset all cluster vectors.  */
998
999 static void
1000 reset_cluster_vectors (void)
1001 {
1002   unsigned int i;
1003   basic_block bb;
1004   for (i = 0; i < all_clusters.length (); ++i)
1005     delete_cluster (all_clusters[i]);
1006   all_clusters.truncate (0);
1007   FOR_EACH_BB_FN (bb, cfun)
1008     BB_CLUSTER (bb) = NULL;
1009 }
1010
1011 /* Delete all cluster vectors.  */
1012
1013 static void
1014 delete_cluster_vectors (void)
1015 {
1016   unsigned int i;
1017   for (i = 0; i < all_clusters.length (); ++i)
1018     delete_cluster (all_clusters[i]);
1019   all_clusters.release ();
1020 }
1021
1022 /* Merge cluster C2 into C1.  */
1023
1024 static void
1025 merge_clusters (bb_cluster *c1, bb_cluster *c2)
1026 {
1027   bitmap_ior_into (c1->bbs, c2->bbs);
1028   bitmap_ior_into (c1->preds, c2->preds);
1029 }
1030
1031 /* Register equivalence of BB1 and BB2 (members of cluster C).  Store c in
1032    all_clusters, or merge c with existing cluster.  */
1033
1034 static void
1035 set_cluster (basic_block bb1, basic_block bb2)
1036 {
1037   basic_block merge_bb, other_bb;
1038   bb_cluster *merge, *old, *c;
1039
1040   if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL)
1041     {
1042       c = new_cluster ();
1043       add_bb_to_cluster (c, bb1);
1044       add_bb_to_cluster (c, bb2);
1045       BB_CLUSTER (bb1) = c;
1046       BB_CLUSTER (bb2) = c;
1047       c->index = all_clusters.length ();
1048       all_clusters.safe_push (c);
1049     }
1050   else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL)
1051     {
1052       merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1;
1053       other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2;
1054       merge = BB_CLUSTER (merge_bb);
1055       add_bb_to_cluster (merge, other_bb);
1056       BB_CLUSTER (other_bb) = merge;
1057     }
1058   else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2))
1059     {
1060       unsigned int i;
1061       bitmap_iterator bi;
1062
1063       old = BB_CLUSTER (bb2);
1064       merge = BB_CLUSTER (bb1);
1065       merge_clusters (merge, old);
1066       EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi)
1067         BB_CLUSTER (BASIC_BLOCK_FOR_FN (cfun, i)) = merge;
1068       all_clusters[old->index] = NULL;
1069       update_rep_bb (merge, old->rep_bb);
1070       delete_cluster (old);
1071     }
1072   else
1073     gcc_unreachable ();
1074 }
1075
1076 /* Return true if gimple operands T1 and T2 have the same value.  */
1077
1078 static bool
1079 gimple_operand_equal_value_p (tree t1, tree t2)
1080 {
1081   if (t1 == t2)
1082     return true;
1083
1084   if (t1 == NULL_TREE
1085       || t2 == NULL_TREE)
1086     return false;
1087
1088   if (operand_equal_p (t1, t2, OEP_MATCH_SIDE_EFFECTS))
1089     return true;
1090
1091   return gvn_uses_equal (t1, t2);
1092 }
1093
1094 /* Return true if gimple statements S1 and S2 are equal.  Gimple_bb (s1) and
1095    gimple_bb (s2) are members of SAME_SUCC.  */
1096
1097 static bool
1098 gimple_equal_p (same_succ *same_succ, gimple *s1, gimple *s2)
1099 {
1100   unsigned int i;
1101   tree lhs1, lhs2;
1102   basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
1103   tree t1, t2;
1104   bool inv_cond;
1105   enum tree_code code1, code2;
1106
1107   if (gimple_code (s1) != gimple_code (s2))
1108     return false;
1109
1110   switch (gimple_code (s1))
1111     {
1112     case GIMPLE_CALL:
1113       if (!gimple_call_same_target_p (s1, s2))
1114         return false;
1115
1116       t1 = gimple_call_chain (s1);
1117       t2 = gimple_call_chain (s2);
1118       if (!gimple_operand_equal_value_p (t1, t2))
1119         return false;
1120
1121       if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
1122         return false;
1123
1124       for (i = 0; i < gimple_call_num_args (s1); ++i)
1125         {
1126           t1 = gimple_call_arg (s1, i);
1127           t2 = gimple_call_arg (s2, i);
1128           if (!gimple_operand_equal_value_p (t1, t2))
1129             return false;
1130         }
1131
1132       lhs1 = gimple_get_lhs (s1);
1133       lhs2 = gimple_get_lhs (s2);
1134       if (lhs1 == NULL_TREE && lhs2 == NULL_TREE)
1135         return true;
1136       if (lhs1 == NULL_TREE || lhs2 == NULL_TREE)
1137         return false;
1138       if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME)
1139         return vn_valueize (lhs1) == vn_valueize (lhs2);
1140       return operand_equal_p (lhs1, lhs2, 0);
1141
1142     case GIMPLE_ASSIGN:
1143       lhs1 = gimple_get_lhs (s1);
1144       lhs2 = gimple_get_lhs (s2);
1145       if (TREE_CODE (lhs1) != SSA_NAME
1146           && TREE_CODE (lhs2) != SSA_NAME)
1147         return (operand_equal_p (lhs1, lhs2, 0)
1148                 && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
1149                                                  gimple_assign_rhs1 (s2)));
1150       else if (TREE_CODE (lhs1) == SSA_NAME
1151                && TREE_CODE (lhs2) == SSA_NAME)
1152         return operand_equal_p (gimple_assign_rhs1 (s1),
1153                                 gimple_assign_rhs1 (s2), 0);
1154       return false;
1155
1156     case GIMPLE_COND:
1157       t1 = gimple_cond_lhs (s1);
1158       t2 = gimple_cond_lhs (s2);
1159       if (!gimple_operand_equal_value_p (t1, t2))
1160         return false;
1161
1162       t1 = gimple_cond_rhs (s1);
1163       t2 = gimple_cond_rhs (s2);
1164       if (!gimple_operand_equal_value_p (t1, t2))
1165         return false;
1166
1167       code1 = gimple_expr_code (s1);
1168       code2 = gimple_expr_code (s2);
1169       inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index)
1170                   != bitmap_bit_p (same_succ->inverse, bb2->index));
1171       if (inv_cond)
1172         {
1173           bool honor_nans = HONOR_NANS (t1);
1174           code2 = invert_tree_comparison (code2, honor_nans);
1175         }
1176       return code1 == code2;
1177
1178     default:
1179       return false;
1180     }
1181 }
1182
1183 /* Let GSI skip backwards over local defs.  Return the earliest vuse in VUSE.
1184    Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the
1185    processed statements.  */
1186
1187 static void
1188 gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
1189                                   bool *vuse_escaped)
1190 {
1191   gimple *stmt;
1192   tree lvuse;
1193
1194   while (true)
1195     {
1196       if (gsi_end_p (*gsi))
1197         return;
1198       stmt = gsi_stmt (*gsi);
1199
1200       lvuse = gimple_vuse (stmt);
1201       if (lvuse != NULL_TREE)
1202         {
1203           *vuse = lvuse;
1204           if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF))
1205             *vuse_escaped = true;
1206         }
1207
1208       if (!stmt_local_def (stmt))
1209         return;
1210       gsi_prev_nondebug (gsi);
1211     }
1212 }
1213
1214 /* Return true if equal (in the sense of gimple_equal_p) statements STMT1 and
1215    STMT2 are allowed to be merged.  */
1216
1217 static bool
1218 merge_stmts_p (gimple *stmt1, gimple *stmt2)
1219 {
1220   /* What could be better than this here is to blacklist the bb
1221      containing the stmt, when encountering the stmt f.i. in
1222      same_succ_hash.  */
1223   if (is_tm_ending (stmt1))
1224     return false;
1225
1226   /* Verify EH landing pads.  */
1227   if (lookup_stmt_eh_lp_fn (cfun, stmt1) != lookup_stmt_eh_lp_fn (cfun, stmt2))
1228     return false;
1229
1230   if (is_gimple_call (stmt1)
1231       && gimple_call_internal_p (stmt1))
1232     switch (gimple_call_internal_fn (stmt1))
1233       {
1234       case IFN_UBSAN_NULL:
1235       case IFN_UBSAN_BOUNDS:
1236       case IFN_UBSAN_VPTR:
1237       case IFN_UBSAN_CHECK_ADD:
1238       case IFN_UBSAN_CHECK_SUB:
1239       case IFN_UBSAN_CHECK_MUL:
1240       case IFN_UBSAN_OBJECT_SIZE:
1241       case IFN_ASAN_CHECK:
1242         /* For these internal functions, gimple_location is an implicit
1243            parameter, which will be used explicitly after expansion.
1244            Merging these statements may cause confusing line numbers in
1245            sanitizer messages.  */
1246         return gimple_location (stmt1) == gimple_location (stmt2);
1247       default:
1248         break;
1249       }
1250
1251   return true;
1252 }
1253
1254 /* Determines whether BB1 and BB2 (members of same_succ) are duplicates.  If so,
1255    clusters them.  */
1256
1257 static void
1258 find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2)
1259 {
1260   gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
1261   gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
1262   tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
1263   bool vuse_escaped = false;
1264
1265   gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
1266   gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
1267
1268   while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
1269     {
1270       gimple *stmt1 = gsi_stmt (gsi1);
1271       gimple *stmt2 = gsi_stmt (gsi2);
1272
1273       if (!gimple_equal_p (same_succ, stmt1, stmt2))
1274         return;
1275
1276       if (!merge_stmts_p (stmt1, stmt2))
1277         return;
1278
1279       gsi_prev_nondebug (&gsi1);
1280       gsi_prev_nondebug (&gsi2);
1281       gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
1282       gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
1283     }
1284
1285   if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
1286     return;
1287
1288   /* If the incoming vuses are not the same, and the vuse escaped into an
1289      SSA_OP_DEF, then merging the 2 blocks will change the value of the def,
1290      which potentially means the semantics of one of the blocks will be changed.
1291      TODO: make this check more precise.  */
1292   if (vuse_escaped && vuse1 != vuse2)
1293     return;
1294
1295   if (dump_file)
1296     fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
1297              bb1->index, bb2->index);
1298
1299   set_cluster (bb1, bb2);
1300 }
1301
1302 /* Returns whether for all phis in DEST the phi alternatives for E1 and
1303    E2 are equal.  */
1304
1305 static bool
1306 same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
1307 {
1308   int n1 = e1->dest_idx, n2 = e2->dest_idx;
1309   gphi_iterator gsi;
1310
1311   for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
1312     {
1313       gphi *phi = gsi.phi ();
1314       tree lhs = gimple_phi_result (phi);
1315       tree val1 = gimple_phi_arg_def (phi, n1);
1316       tree val2 = gimple_phi_arg_def (phi, n2);
1317
1318       if (virtual_operand_p (lhs))
1319         continue;
1320
1321       if (operand_equal_for_phi_arg_p (val1, val2))
1322         continue;
1323       if (gvn_uses_equal (val1, val2))
1324         continue;
1325
1326       return false;
1327     }
1328
1329   return true;
1330 }
1331
1332 /* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the
1333    phi alternatives for BB1 and BB2 are equal.  */
1334
1335 static bool
1336 same_phi_alternatives (same_succ *same_succ, basic_block bb1, basic_block bb2)
1337 {
1338   unsigned int s;
1339   bitmap_iterator bs;
1340   edge e1, e2;
1341   basic_block succ;
1342
1343   EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs)
1344     {
1345       succ = BASIC_BLOCK_FOR_FN (cfun, s);
1346       e1 = find_edge (bb1, succ);
1347       e2 = find_edge (bb2, succ);
1348       if (e1->flags & EDGE_COMPLEX
1349           || e2->flags & EDGE_COMPLEX)
1350         return false;
1351
1352       /* For all phis in bb, the phi alternatives for e1 and e2 need to have
1353          the same value.  */
1354       if (!same_phi_alternatives_1 (succ, e1, e2))
1355         return false;
1356     }
1357
1358   return true;
1359 }
1360
1361 /* Return true if BB has non-vop phis.  */
1362
1363 static bool
1364 bb_has_non_vop_phi (basic_block bb)
1365 {
1366   gimple_seq phis = phi_nodes (bb);
1367   gimple *phi;
1368
1369   if (phis == NULL)
1370     return false;
1371
1372   if (!gimple_seq_singleton_p (phis))
1373     return true;
1374
1375   phi = gimple_seq_first_stmt (phis);
1376   return !virtual_operand_p (gimple_phi_result (phi));
1377 }
1378
1379 /* Returns true if redirecting the incoming edges of FROM to TO maintains the
1380    invariant that uses in FROM are dominates by their defs.  */
1381
1382 static bool
1383 deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to)
1384 {
1385   basic_block cd, dep_bb = BB_DEP_BB (to);
1386   edge_iterator ei;
1387   edge e;
1388   bitmap from_preds = BITMAP_ALLOC (NULL);
1389
1390   if (dep_bb == NULL)
1391     return true;
1392
1393   FOR_EACH_EDGE (e, ei, from->preds)
1394     bitmap_set_bit (from_preds, e->src->index);
1395   cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
1396   BITMAP_FREE (from_preds);
1397
1398   return dominated_by_p (CDI_DOMINATORS, dep_bb, cd);
1399 }
1400
1401 /* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its
1402    replacement bb) and vice versa maintains the invariant that uses in the
1403    replacement are dominates by their defs.  */
1404
1405 static bool
1406 deps_ok_for_redirect (basic_block bb1, basic_block bb2)
1407 {
1408   if (BB_CLUSTER (bb1) != NULL)
1409     bb1 = BB_CLUSTER (bb1)->rep_bb;
1410
1411   if (BB_CLUSTER (bb2) != NULL)
1412     bb2 = BB_CLUSTER (bb2)->rep_bb;
1413
1414   return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2)
1415           && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1));
1416 }
1417
1418 /* Within SAME_SUCC->bbs, find clusters of bbs which can be merged.  */
1419
1420 static void
1421 find_clusters_1 (same_succ *same_succ)
1422 {
1423   basic_block bb1, bb2;
1424   unsigned int i, j;
1425   bitmap_iterator bi, bj;
1426   int nr_comparisons;
1427   int max_comparisons = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_COMPARISONS);
1428
1429   EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
1430     {
1431       bb1 = BASIC_BLOCK_FOR_FN (cfun, i);
1432
1433       /* TODO: handle blocks with phi-nodes.  We'll have to find corresponding
1434          phi-nodes in bb1 and bb2, with the same alternatives for the same
1435          preds.  */
1436       if (bb_has_non_vop_phi (bb1))
1437         continue;
1438
1439       nr_comparisons = 0;
1440       EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj)
1441         {
1442           bb2 = BASIC_BLOCK_FOR_FN (cfun, j);
1443
1444           if (bb_has_non_vop_phi (bb2))
1445             continue;
1446
1447           if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2))
1448             continue;
1449
1450           /* Limit quadratic behavior.  */
1451           nr_comparisons++;
1452           if (nr_comparisons > max_comparisons)
1453             break;
1454
1455           /* This is a conservative dependency check.  We could test more
1456              precise for allowed replacement direction.  */
1457           if (!deps_ok_for_redirect (bb1, bb2))
1458             continue;
1459
1460           if (!(same_phi_alternatives (same_succ, bb1, bb2)))
1461             continue;
1462
1463           find_duplicate (same_succ, bb1, bb2);
1464         }
1465     }
1466 }
1467
1468 /* Find clusters of bbs which can be merged.  */
1469
1470 static void
1471 find_clusters (void)
1472 {
1473   same_succ *same;
1474
1475   while (!worklist.is_empty ())
1476     {
1477       same = worklist.pop ();
1478       same->in_worklist = false;
1479       if (dump_file && (dump_flags & TDF_DETAILS))
1480         {
1481           fprintf (dump_file, "processing worklist entry\n");
1482           same_succ_print (dump_file, same);
1483         }
1484       find_clusters_1 (same);
1485     }
1486 }
1487
1488 /* Returns the vop phi of BB, if any.  */
1489
1490 static gphi *
1491 vop_phi (basic_block bb)
1492 {
1493   gphi *stmt;
1494   gphi_iterator gsi;
1495   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1496     {
1497       stmt = gsi.phi ();
1498       if (! virtual_operand_p (gimple_phi_result (stmt)))
1499         continue;
1500       return stmt;
1501     }
1502   return NULL;
1503 }
1504
1505 /* Redirect all edges from BB1 to BB2, removes BB1 and marks it as removed.  */
1506
1507 static void
1508 replace_block_by (basic_block bb1, basic_block bb2)
1509 {
1510   edge pred_edge;
1511   edge e1, e2;
1512   edge_iterator ei;
1513   unsigned int i;
1514   gphi *bb2_phi;
1515
1516   bb2_phi = vop_phi (bb2);
1517
1518   /* Mark the basic block as deleted.  */
1519   mark_basic_block_deleted (bb1);
1520
1521   /* Redirect the incoming edges of bb1 to bb2.  */
1522   for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
1523     {
1524       pred_edge = EDGE_PRED (bb1, i - 1);
1525       pred_edge = redirect_edge_and_branch (pred_edge, bb2);
1526       gcc_assert (pred_edge != NULL);
1527
1528       if (bb2_phi == NULL)
1529         continue;
1530
1531       /* The phi might have run out of capacity when the redirect added an
1532          argument, which means it could have been replaced.  Refresh it.  */
1533       bb2_phi = vop_phi (bb2);
1534
1535       add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
1536                    pred_edge, UNKNOWN_LOCATION);
1537     }
1538
1539   bb2->frequency += bb1->frequency;
1540   if (bb2->frequency > BB_FREQ_MAX)
1541     bb2->frequency = BB_FREQ_MAX;
1542
1543   bb2->count += bb1->count;
1544
1545   /* Merge the outgoing edge counts from bb1 onto bb2.  */
1546   gcov_type out_sum = 0;
1547   FOR_EACH_EDGE (e1, ei, bb1->succs)
1548     {
1549       e2 = find_edge (bb2, e1->dest);
1550       gcc_assert (e2);
1551       e2->count += e1->count;
1552       out_sum += e2->count;
1553     }
1554   /* Recompute the edge probabilities from the new merged edge count.
1555      Use the sum of the new merged edge counts computed above instead
1556      of bb2's merged count, in case there are profile count insanities
1557      making the bb count inconsistent with the edge weights.  */
1558   FOR_EACH_EDGE (e2, ei, bb2->succs)
1559     {
1560       e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum);
1561     }
1562
1563   /* Clear range info from all stmts in BB2 -- this transformation
1564      could make them out of date.  */
1565   reset_flow_sensitive_info_in_bb (bb2);
1566
1567   /* Do updates that use bb1, before deleting bb1.  */
1568   release_last_vdef (bb1);
1569   same_succ_flush_bb (bb1);
1570
1571   delete_basic_block (bb1);
1572 }
1573
1574 /* Bbs for which update_debug_stmt need to be called.  */
1575
1576 static bitmap update_bbs;
1577
1578 /* For each cluster in all_clusters, merge all cluster->bbs.  Returns
1579    number of bbs removed.  */
1580
1581 static int
1582 apply_clusters (void)
1583 {
1584   basic_block bb1, bb2;
1585   bb_cluster *c;
1586   unsigned int i, j;
1587   bitmap_iterator bj;
1588   int nr_bbs_removed = 0;
1589
1590   for (i = 0; i < all_clusters.length (); ++i)
1591     {
1592       c = all_clusters[i];
1593       if (c == NULL)
1594         continue;
1595
1596       bb2 = c->rep_bb;
1597       bitmap_set_bit (update_bbs, bb2->index);
1598
1599       bitmap_clear_bit (c->bbs, bb2->index);
1600       EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
1601         {
1602           bb1 = BASIC_BLOCK_FOR_FN (cfun, j);
1603           bitmap_clear_bit (update_bbs, bb1->index);
1604
1605           replace_block_by (bb1, bb2);
1606           nr_bbs_removed++;
1607         }
1608     }
1609
1610   return nr_bbs_removed;
1611 }
1612
1613 /* Resets debug statement STMT if it has uses that are not dominated by their
1614    defs.  */
1615
1616 static void
1617 update_debug_stmt (gimple *stmt)
1618 {
1619   use_operand_p use_p;
1620   ssa_op_iter oi;
1621   basic_block bbuse;
1622
1623   if (!gimple_debug_bind_p (stmt))
1624     return;
1625
1626   bbuse = gimple_bb (stmt);
1627   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
1628     {
1629       tree name = USE_FROM_PTR (use_p);
1630       gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1631       basic_block bbdef = gimple_bb (def_stmt);
1632       if (bbdef == NULL || bbuse == bbdef
1633           || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
1634         continue;
1635
1636       gimple_debug_bind_reset_value (stmt);
1637       update_stmt (stmt);
1638       break;
1639     }
1640 }
1641
1642 /* Resets all debug statements that have uses that are not
1643    dominated by their defs.  */
1644
1645 static void
1646 update_debug_stmts (void)
1647 {
1648   basic_block bb;
1649   bitmap_iterator bi;
1650   unsigned int i;
1651
1652   EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
1653     {
1654       gimple *stmt;
1655       gimple_stmt_iterator gsi;
1656
1657       bb = BASIC_BLOCK_FOR_FN (cfun, i);
1658       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1659         {
1660           stmt = gsi_stmt (gsi);
1661           if (!is_gimple_debug (stmt))
1662             continue;
1663           update_debug_stmt (stmt);
1664         }
1665     }
1666 }
1667
1668 /* Runs tail merge optimization.  */
1669
1670 unsigned int
1671 tail_merge_optimize (unsigned int todo)
1672 {
1673   int nr_bbs_removed_total = 0;
1674   int nr_bbs_removed;
1675   bool loop_entered = false;
1676   int iteration_nr = 0;
1677   int max_iterations = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_ITERATIONS);
1678
1679   if (!flag_tree_tail_merge
1680       || max_iterations == 0)
1681     return 0;
1682
1683   timevar_push (TV_TREE_TAIL_MERGE);
1684
1685   if (!dom_info_available_p (CDI_DOMINATORS))
1686     {
1687       /* PRE can leave us with unreachable blocks, remove them now.  */
1688       delete_unreachable_blocks ();
1689       calculate_dominance_info (CDI_DOMINATORS);
1690     }
1691   init_worklist ();
1692
1693   while (!worklist.is_empty ())
1694     {
1695       if (!loop_entered)
1696         {
1697           loop_entered = true;
1698           alloc_cluster_vectors ();
1699           update_bbs = BITMAP_ALLOC (NULL);
1700         }
1701       else
1702         reset_cluster_vectors ();
1703
1704       iteration_nr++;
1705       if (dump_file && (dump_flags & TDF_DETAILS))
1706         fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
1707
1708       find_clusters ();
1709       gcc_assert (worklist.is_empty ());
1710       if (all_clusters.is_empty ())
1711         break;
1712
1713       nr_bbs_removed = apply_clusters ();
1714       nr_bbs_removed_total += nr_bbs_removed;
1715       if (nr_bbs_removed == 0)
1716         break;
1717
1718       free_dominance_info (CDI_DOMINATORS);
1719
1720       if (iteration_nr == max_iterations)
1721         break;
1722
1723       calculate_dominance_info (CDI_DOMINATORS);
1724       update_worklist ();
1725     }
1726
1727   if (dump_file && (dump_flags & TDF_DETAILS))
1728     fprintf (dump_file, "htab collision / search: %f\n",
1729              same_succ_htab->collisions ());
1730
1731   if (nr_bbs_removed_total > 0)
1732     {
1733       if (MAY_HAVE_DEBUG_STMTS)
1734         {
1735           calculate_dominance_info (CDI_DOMINATORS);
1736           update_debug_stmts ();
1737         }
1738
1739       if (dump_file && (dump_flags & TDF_DETAILS))
1740         {
1741           fprintf (dump_file, "Before TODOs.\n");
1742           dump_function_to_file (current_function_decl, dump_file, dump_flags);
1743         }
1744
1745       mark_virtual_operands_for_renaming (cfun);
1746     }
1747
1748   delete_worklist ();
1749   if (loop_entered)
1750     {
1751       delete_cluster_vectors ();
1752       BITMAP_FREE (update_bbs);
1753     }
1754
1755   timevar_pop (TV_TREE_TAIL_MERGE);
1756
1757   return todo;
1758 }