OSDN Git Service

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