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