OSDN Git Service

More improvements to sparc VIS vec_init code generation.
[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 BB from its corresponding same_succ.  */
757
758 static void
759 same_succ_flush_bb (basic_block bb)
760 {
761   same_succ same = BB_SAME_SUCC (bb);
762   BB_SAME_SUCC (bb) = NULL;
763   if (bitmap_single_bit_set_p (same->bbs))
764     htab_remove_elt_with_hash (same_succ_htab, same, same->hashval);
765   else
766     bitmap_clear_bit (same->bbs, bb->index);
767 }
768
769 /* Removes all bbs in BBS from their corresponding same_succ.  */
770
771 static void
772 same_succ_flush_bbs (bitmap bbs)
773 {
774   unsigned int i;
775   bitmap_iterator bi;
776
777   EXECUTE_IF_SET_IN_BITMAP (bbs, 0, i, bi)
778     same_succ_flush_bb (BASIC_BLOCK (i));
779 }
780
781 /* Release the last vdef in BB, either normal or phi result.  */
782
783 static void
784 release_last_vdef (basic_block bb)
785 {
786   gimple_stmt_iterator i;
787
788   for (i = gsi_last_bb (bb); !gsi_end_p (i); gsi_prev_nondebug (&i))
789     {
790       gimple stmt = gsi_stmt (i);
791       if (gimple_vdef (stmt) == NULL_TREE)
792         continue;
793
794       mark_virtual_operand_for_renaming (gimple_vdef (stmt));
795       return;
796     }
797
798   for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
799     {
800       gimple phi = gsi_stmt (i);
801       tree res = gimple_phi_result (phi);
802
803       if (is_gimple_reg (res))
804         continue;
805
806       mark_virtual_phi_result_for_renaming (phi);
807       return;
808     }
809   
810 }
811
812 /* Delete all deleted_bbs.  */
813
814 static void
815 purge_bbs (void)
816 {
817   bitmap_and_compl_into (deleted_bb_preds, deleted_bbs);
818   bitmap_clear (deleted_bbs);
819 }
820
821 /* For deleted_bb_preds, find bbs with same successors.  */
822
823 static void
824 update_worklist (void)
825 {
826   unsigned int i;
827   bitmap_iterator bi;
828   basic_block bb;
829   same_succ same;
830
831   bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK);
832   same_succ_flush_bbs (deleted_bb_preds);
833
834   same = same_succ_alloc ();
835   EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi)
836     {
837       bb = BASIC_BLOCK (i);
838       gcc_assert (bb != NULL);
839       find_same_succ_bb (bb, &same);
840       if (same == NULL)
841         same = same_succ_alloc ();
842     }
843   same_succ_delete (same);
844   bitmap_clear (deleted_bb_preds);
845 }
846
847 /* Prints cluster C to FILE.  */
848
849 static void
850 print_cluster (FILE *file, bb_cluster c)
851 {
852   if (c == NULL)
853     return;
854   bitmap_print (file, c->bbs, "bbs:", "\n");
855   bitmap_print (file, c->preds, "preds:", "\n");
856 }
857
858 /* Prints cluster C to stderr.  */
859
860 extern void debug_cluster (bb_cluster);
861 DEBUG_FUNCTION void
862 debug_cluster (bb_cluster c)
863 {
864   print_cluster (stderr, c);
865 }
866
867 /* Update C->rep_bb, given that BB is added to the cluster.  */
868
869 static void
870 update_rep_bb (bb_cluster c, basic_block bb)
871 {
872   /* Initial.  */
873   if (c->rep_bb == NULL)
874     {
875       c->rep_bb = bb;
876       return;
877     }
878
879   /* Current needs no deps, keep it.  */
880   if (BB_DEP_BB (c->rep_bb) == NULL)
881     return;
882
883   /* Bb needs no deps, change rep_bb.  */
884   if (BB_DEP_BB (bb) == NULL)
885     {
886       c->rep_bb = bb;
887       return;
888     }
889
890   /* Bb needs last deps earlier than current, change rep_bb.  A potential
891      problem with this, is that the first deps might also be earlier, which
892      would mean we prefer longer lifetimes for the deps.  To be able to check
893      for this, we would have to trace BB_FIRST_DEP_BB as well, besides
894      BB_DEP_BB, which is really BB_LAST_DEP_BB.
895      The benefit of choosing the bb with last deps earlier, is that it can
896      potentially be used as replacement for more bbs.  */
897   if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb)))
898     c->rep_bb = bb;
899 }
900
901 /* Add BB to cluster C.  Sets BB in C->bbs, and preds of BB in C->preds.  */
902
903 static void
904 add_bb_to_cluster (bb_cluster c, basic_block bb)
905 {
906   edge e;
907   edge_iterator ei;
908
909   bitmap_set_bit (c->bbs, bb->index);
910
911   FOR_EACH_EDGE (e, ei, bb->preds)
912     bitmap_set_bit (c->preds, e->src->index);
913
914   update_rep_bb (c, bb);
915 }
916
917 /* Allocate and init new cluster.  */
918
919 static bb_cluster
920 new_cluster (void)
921 {
922   bb_cluster c;
923   c = XCNEW (struct bb_cluster_def);
924   c->bbs = BITMAP_ALLOC (NULL);
925   c->preds = BITMAP_ALLOC (NULL);
926   c->rep_bb = NULL;
927   return c;
928 }
929
930 /* Delete clusters.  */
931
932 static void
933 delete_cluster (bb_cluster c)
934 {
935   if (c == NULL)
936     return;
937   BITMAP_FREE (c->bbs);
938   BITMAP_FREE (c->preds);
939   XDELETE (c);
940 }
941
942 DEF_VEC_P (bb_cluster);
943 DEF_VEC_ALLOC_P (bb_cluster, heap);
944
945 /* Array that contains all clusters.  */
946
947 static VEC (bb_cluster, heap) *all_clusters;
948
949 /* Allocate all cluster vectors.  */
950
951 static void
952 alloc_cluster_vectors (void)
953 {
954   all_clusters = VEC_alloc (bb_cluster, heap, n_basic_blocks);
955 }
956
957 /* Reset all cluster vectors.  */
958
959 static void
960 reset_cluster_vectors (void)
961 {
962   unsigned int i;
963   basic_block bb;
964   for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
965     delete_cluster (VEC_index (bb_cluster, all_clusters, i));
966   VEC_truncate (bb_cluster, all_clusters, 0);
967   FOR_EACH_BB (bb)
968     BB_CLUSTER (bb) = NULL;
969 }
970
971 /* Delete all cluster vectors.  */
972
973 static void
974 delete_cluster_vectors (void)
975 {
976   unsigned int i;
977   for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
978     delete_cluster (VEC_index (bb_cluster, all_clusters, i));
979   VEC_free (bb_cluster, heap, all_clusters);
980 }
981
982 /* Merge cluster C2 into C1.  */
983
984 static void
985 merge_clusters (bb_cluster c1, bb_cluster c2)
986 {
987   bitmap_ior_into (c1->bbs, c2->bbs);
988   bitmap_ior_into (c1->preds, c2->preds);
989 }
990
991 /* Register equivalence of BB1 and BB2 (members of cluster C).  Store c in
992    all_clusters, or merge c with existing cluster.  */
993
994 static void
995 set_cluster (basic_block bb1, basic_block bb2)
996 {
997   basic_block merge_bb, other_bb;
998   bb_cluster merge, old, c;
999
1000   if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL)
1001     {
1002       c = new_cluster ();
1003       add_bb_to_cluster (c, bb1);
1004       add_bb_to_cluster (c, bb2);
1005       BB_CLUSTER (bb1) = c;
1006       BB_CLUSTER (bb2) = c;
1007       c->index = VEC_length (bb_cluster, all_clusters);
1008       VEC_safe_push (bb_cluster, heap, all_clusters, c);
1009     }
1010   else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL)
1011     {
1012       merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1;
1013       other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2;
1014       merge = BB_CLUSTER (merge_bb);
1015       add_bb_to_cluster (merge, other_bb);
1016       BB_CLUSTER (other_bb) = merge;
1017     }
1018   else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2))
1019     {
1020       unsigned int i;
1021       bitmap_iterator bi;
1022
1023       old = BB_CLUSTER (bb2);
1024       merge = BB_CLUSTER (bb1);
1025       merge_clusters (merge, old);
1026       EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi)
1027         BB_CLUSTER (BASIC_BLOCK (i)) = merge;
1028       VEC_replace (bb_cluster, all_clusters, old->index, NULL);
1029       update_rep_bb (merge, old->rep_bb);
1030       delete_cluster (old);
1031     }
1032   else
1033     gcc_unreachable ();
1034 }
1035
1036 /* Return true if gimple statements S1 and S2 are equal.  Gimple_bb (s1) and
1037    gimple_bb (s2) are members of SAME_SUCC.  */
1038
1039 static bool
1040 gimple_equal_p (same_succ same_succ, gimple s1, gimple s2)
1041 {
1042   unsigned int i;
1043   tree lhs1, lhs2;
1044   basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
1045   tree t1, t2;
1046   bool equal, inv_cond;
1047   enum tree_code code1, code2;
1048
1049   if (gimple_code (s1) != gimple_code (s2))
1050     return false;
1051
1052   switch (gimple_code (s1))
1053     {
1054     case GIMPLE_CALL:
1055       if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
1056         return false;
1057       if (!gimple_call_same_target_p (s1, s2))
1058         return false;
1059
1060       equal = true;
1061       for (i = 0; i < gimple_call_num_args (s1); ++i)
1062         {
1063           t1 = gimple_call_arg (s1, i);
1064           t2 = gimple_call_arg (s2, i);
1065           if (operand_equal_p (t1, t2, 0))
1066             continue;
1067           if (gvn_uses_equal (t1, t2))
1068             continue;
1069           equal = false;
1070           break;
1071         }
1072       if (equal)
1073         return true;
1074
1075       lhs1 = gimple_get_lhs (s1);
1076       lhs2 = gimple_get_lhs (s2);
1077       return (lhs1 != NULL_TREE && lhs2 != NULL_TREE
1078               && TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME
1079               && vn_valueize (lhs1) == vn_valueize (lhs2));
1080
1081     case GIMPLE_ASSIGN:
1082       lhs1 = gimple_get_lhs (s1);
1083       lhs2 = gimple_get_lhs (s2);
1084       return (TREE_CODE (lhs1) == SSA_NAME
1085               && TREE_CODE (lhs2) == SSA_NAME
1086               && vn_valueize (lhs1) == vn_valueize (lhs2));
1087
1088     case GIMPLE_COND:
1089       t1 = gimple_cond_lhs (s1);
1090       t2 = gimple_cond_lhs (s2);
1091       if (!operand_equal_p (t1, t2, 0)
1092           && !gvn_uses_equal (t1, t2))
1093         return false;
1094
1095       t1 = gimple_cond_rhs (s1);
1096       t2 = gimple_cond_rhs (s2);
1097       if (!operand_equal_p (t1, t2, 0)
1098           && !gvn_uses_equal (t1, t2))
1099         return false;
1100
1101       code1 = gimple_expr_code (s1);
1102       code2 = gimple_expr_code (s2);
1103       inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index)
1104                   != bitmap_bit_p (same_succ->inverse, bb2->index));
1105       if (inv_cond)
1106         {
1107           bool honor_nans
1108             = HONOR_NANS (TYPE_MODE (TREE_TYPE (gimple_cond_lhs (s1))));
1109           code2 = invert_tree_comparison (code2, honor_nans);
1110         }
1111       return code1 == code2;
1112
1113     default:
1114       return false;
1115     }
1116 }
1117
1118 /* Let GSI skip backwards over local defs.  */
1119
1120 static void
1121 gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
1122 {
1123   gimple stmt;
1124
1125   while (true)
1126     {
1127       if (gsi_end_p (*gsi))
1128         return;
1129       stmt = gsi_stmt (*gsi);
1130       if (!(is_gimple_assign (stmt) && local_def (gimple_get_lhs (stmt))
1131             && !gimple_has_side_effects (stmt)))
1132         return;
1133       gsi_prev_nondebug (gsi);
1134     }
1135 }
1136
1137 /* Determines whether BB1 and BB2 (members of same_succ) are duplicates.  If so,
1138    clusters them.  */
1139
1140 static void
1141 find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2)
1142 {
1143   gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
1144   gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
1145
1146   gsi_advance_bw_nondebug_nonlocal (&gsi1);
1147   gsi_advance_bw_nondebug_nonlocal (&gsi2);
1148
1149   while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
1150     {
1151       if (!gimple_equal_p (same_succ, gsi_stmt (gsi1), gsi_stmt (gsi2)))
1152         return;
1153
1154       gsi_prev_nondebug (&gsi1);
1155       gsi_prev_nondebug (&gsi2);
1156       gsi_advance_bw_nondebug_nonlocal (&gsi1);
1157       gsi_advance_bw_nondebug_nonlocal (&gsi2);
1158     }
1159
1160   if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
1161     return;
1162
1163   if (dump_file)
1164     fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
1165              bb1->index, bb2->index);
1166
1167   set_cluster (bb1, bb2);
1168 }
1169
1170 /* Returns whether for all phis in DEST the phi alternatives for E1 and
1171    E2 are equal.  */
1172
1173 static bool
1174 same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
1175 {
1176   int n1 = e1->dest_idx, n2 = e2->dest_idx;
1177   gimple_stmt_iterator gsi;
1178
1179   for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
1180     {
1181       gimple phi = gsi_stmt (gsi);
1182       tree lhs = gimple_phi_result (phi);
1183       tree val1 = gimple_phi_arg_def (phi, n1);
1184       tree val2 = gimple_phi_arg_def (phi, n2);
1185
1186       if (!is_gimple_reg (lhs))
1187         continue;
1188
1189       if (operand_equal_for_phi_arg_p (val1, val2))
1190         continue;
1191       if (gvn_uses_equal (val1, val2))
1192         continue;
1193
1194       return false;
1195     }
1196
1197   return true;
1198 }
1199
1200 /* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the
1201    phi alternatives for BB1 and BB2 are equal.  */
1202
1203 static bool
1204 same_phi_alternatives (same_succ same_succ, basic_block bb1, basic_block bb2)
1205 {
1206   unsigned int s;
1207   bitmap_iterator bs;
1208   edge e1, e2;
1209   basic_block succ;
1210
1211   EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs)
1212     {
1213       succ = BASIC_BLOCK (s);
1214       e1 = find_edge (bb1, succ);
1215       e2 = find_edge (bb2, succ);
1216       if (e1->flags & EDGE_COMPLEX
1217           || e2->flags & EDGE_COMPLEX)
1218         return false;
1219
1220       /* For all phis in bb, the phi alternatives for e1 and e2 need to have
1221          the same value.  */
1222       if (!same_phi_alternatives_1 (succ, e1, e2))
1223         return false;
1224     }
1225
1226   return true;
1227 }
1228
1229 /* Return true if BB has non-vop phis.  */
1230
1231 static bool
1232 bb_has_non_vop_phi (basic_block bb)
1233 {
1234   gimple_seq phis = phi_nodes (bb);
1235   gimple phi;
1236
1237   if (phis == NULL)
1238     return false;
1239
1240   if (!gimple_seq_singleton_p (phis))
1241     return true;
1242
1243   phi = gimple_seq_first_stmt (phis);
1244   return is_gimple_reg (gimple_phi_result (phi));
1245 }
1246
1247 /* Returns true if redirecting the incoming edges of FROM to TO maintains the
1248    invariant that uses in FROM are dominates by their defs.  */
1249
1250 static bool
1251 deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to)
1252 {
1253   basic_block cd, dep_bb = BB_DEP_BB (to);
1254   edge_iterator ei;
1255   edge e;
1256   bitmap from_preds = BITMAP_ALLOC (NULL);
1257
1258   if (dep_bb == NULL)
1259     return true;
1260
1261   FOR_EACH_EDGE (e, ei, from->preds)
1262     bitmap_set_bit (from_preds, e->src->index);
1263   cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
1264   BITMAP_FREE (from_preds);
1265
1266   return dominated_by_p (CDI_DOMINATORS, dep_bb, cd);
1267 }
1268
1269 /* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its
1270    replacement bb) and vice versa maintains the invariant that uses in the
1271    replacement are dominates by their defs.  */
1272
1273 static bool
1274 deps_ok_for_redirect (basic_block bb1, basic_block bb2)
1275 {
1276   if (BB_CLUSTER (bb1) != NULL)
1277     bb1 = BB_CLUSTER (bb1)->rep_bb;
1278
1279   if (BB_CLUSTER (bb2) != NULL)
1280     bb2 = BB_CLUSTER (bb2)->rep_bb;
1281
1282   return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2)
1283           && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1));
1284 }
1285
1286 /* Within SAME_SUCC->bbs, find clusters of bbs which can be merged.  */
1287
1288 static void
1289 find_clusters_1 (same_succ same_succ)
1290 {
1291   basic_block bb1, bb2;
1292   unsigned int i, j;
1293   bitmap_iterator bi, bj;
1294   int nr_comparisons;
1295   int max_comparisons = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_COMPARISONS);
1296
1297   EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
1298     {
1299       bb1 = BASIC_BLOCK (i);
1300
1301       /* TODO: handle blocks with phi-nodes.  We'll have to find corresponding
1302          phi-nodes in bb1 and bb2, with the same alternatives for the same
1303          preds.  */
1304       if (bb_has_non_vop_phi (bb1))
1305         continue;
1306
1307       nr_comparisons = 0;
1308       EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj)
1309         {
1310           bb2 = BASIC_BLOCK (j);
1311
1312           if (bb_has_non_vop_phi (bb2))
1313             continue;
1314
1315           if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2))
1316             continue;
1317
1318           /* Limit quadratic behaviour.  */
1319           nr_comparisons++;
1320           if (nr_comparisons > max_comparisons)
1321             break;
1322
1323           /* This is a conservative dependency check.  We could test more
1324              precise for allowed replacement direction.  */
1325           if (!deps_ok_for_redirect (bb1, bb2))
1326             continue;
1327
1328           if (!(same_phi_alternatives (same_succ, bb1, bb2)))
1329             continue;
1330
1331           find_duplicate (same_succ, bb1, bb2);
1332         }
1333     }
1334 }
1335
1336 /* Find clusters of bbs which can be merged.  */
1337
1338 static void
1339 find_clusters (void)
1340 {
1341   same_succ same;
1342
1343   while (!VEC_empty (same_succ, worklist))
1344     {
1345       same = VEC_pop (same_succ, worklist);
1346       same->in_worklist = false;
1347       if (dump_file && (dump_flags & TDF_DETAILS))
1348         {
1349           fprintf (dump_file, "processing worklist entry\n");
1350           same_succ_print (dump_file, same);
1351         }
1352       find_clusters_1 (same);
1353     }
1354 }
1355
1356 /* Replace uses of the result of PHI with NAME.  */
1357
1358 static void
1359 unlink_virtual_phi (gimple phi, tree name)
1360 {
1361   use_operand_p use_p;
1362   imm_use_iterator iter;
1363   gimple use_stmt;
1364   tree vdef = gimple_phi_result (phi);
1365
1366   if (!vdef
1367       || TREE_CODE (vdef) != SSA_NAME)
1368     return;
1369
1370   FOR_EACH_IMM_USE_STMT (use_stmt, iter, vdef)
1371     {
1372       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1373         SET_USE (use_p, name);
1374     }
1375
1376   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vdef))
1377     SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name) = 1;
1378 }
1379
1380 /* Create or update a vop phi in BB2.  Use VUSE1 arguments for all the
1381    REDIRECTED_EDGES, or if VUSE1 is NULL_TREE, use BB_VOP_AT_EXIT.  If a new
1382    phis is created, use the phi instead of VUSE2 in BB2.  */
1383
1384 static void
1385 update_vuses (bool vuse1_phi_args, tree vuse1, tree vuse2, basic_block bb2,
1386               VEC (edge,heap) *redirected_edges)
1387 {
1388   gimple stmt, phi = NULL;
1389   tree lhs = NULL_TREE, arg, var;
1390   unsigned int i;
1391   gimple def_stmt2 = NULL;
1392   imm_use_iterator iter;
1393   use_operand_p use_p;
1394   edge_iterator ei;
1395   edge e;
1396
1397   if (vuse2 != NULL_TREE)
1398     {
1399       var = SSA_NAME_VAR (vuse2);
1400       def_stmt2 =  SSA_NAME_DEF_STMT (vuse2);
1401     }
1402   else
1403     var = SSA_NAME_VAR (vuse1);
1404
1405   if (def_stmt2 && gimple_bb (def_stmt2) == bb2)
1406     /* Update existing phi.  */
1407     phi = def_stmt2;
1408   else
1409     {
1410       /* No need to create a phi with 2 equal arguments.  */
1411       if (vuse1 == vuse2)
1412         return;
1413
1414       /* Create a phi.  */
1415       lhs = make_ssa_name (var, NULL);
1416       VN_INFO_GET (lhs);
1417       phi = create_phi_node (lhs, bb2);
1418       SSA_NAME_DEF_STMT (lhs) = phi;
1419
1420       /* Set default argument vuse2 for all preds.  */
1421       arg = vuse2 == NULL_TREE ? gimple_phi_result (phi): vuse2;
1422       FOR_EACH_EDGE (e, ei, bb2->preds)
1423         add_phi_arg (phi, arg, e, UNKNOWN_LOCATION);
1424     }
1425
1426   /* Update phi.  */
1427   for (i = 0; i < EDGE_COUNT (redirected_edges); ++i)
1428     {
1429       e = VEC_index (edge, redirected_edges, i);
1430       if (vuse1_phi_args)
1431         arg = BB_VOP_AT_EXIT (e->src);
1432       else
1433         arg = vuse1 == NULL_TREE ? gimple_phi_result (phi): vuse1;
1434
1435       add_phi_arg (phi, arg, e, UNKNOWN_LOCATION);
1436     }
1437
1438   /* Return if we updated an existing phi.  */
1439   if (def_stmt2 && gimple_bb (def_stmt2) == bb2)
1440     return;
1441
1442   /* Replace relevant uses with the newly created phi.  */
1443   FOR_EACH_IMM_USE_STMT (stmt, iter, vuse2 == NULL_TREE ? vuse1 : vuse2)
1444     {
1445       if (stmt == phi)
1446         continue;
1447
1448       if (gimple_code (stmt) != GIMPLE_PHI
1449           && !dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt), bb2))
1450           continue;
1451
1452       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1453         {
1454           if (gimple_code (stmt) == GIMPLE_PHI)
1455             {
1456               unsigned int pred_index = PHI_ARG_INDEX_FROM_USE (use_p);
1457               basic_block pred = EDGE_PRED (gimple_bb (stmt), pred_index)->src;
1458               if (!dominated_by_p (CDI_DOMINATORS, pred, bb2))
1459                 continue;
1460
1461               if (pred == bb2 && EDGE_COUNT (gimple_bb (stmt)->preds) == 1)
1462                 {
1463                   gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1464                   unlink_virtual_phi (stmt, lhs);
1465                   remove_phi_node (&gsi, true);
1466                   break;
1467                 }
1468             }
1469           SET_USE (use_p, lhs);
1470           update_stmt (stmt);
1471         }
1472     }
1473 }
1474
1475 /* Returns the vop phi of BB, if any.  */
1476
1477 static gimple
1478 vop_phi (basic_block bb)
1479 {
1480   gimple stmt;
1481   gimple_stmt_iterator gsi;
1482   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1483     {
1484       stmt = gsi_stmt (gsi);
1485       if (is_gimple_reg (gimple_phi_result (stmt)))
1486         continue;
1487       return stmt;
1488     }
1489   return NULL;
1490 }
1491
1492 /* Returns the vop state at the entry of BB, if found in BB or a successor
1493    bb.  */
1494
1495 static tree
1496 vop_at_entry (basic_block bb)
1497 {
1498   gimple bb_phi, succ_phi;
1499   gimple_stmt_iterator gsi;
1500   gimple stmt;
1501   tree vuse, vdef;
1502   basic_block succ;
1503
1504   bb_phi = vop_phi (bb);
1505   if (bb_phi != NULL)
1506     return gimple_phi_result (bb_phi);
1507
1508   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1509     {
1510       stmt = gsi_stmt (gsi);
1511       vuse = gimple_vuse (stmt);
1512       vdef = gimple_vdef (stmt);
1513       if (vuse != NULL_TREE)
1514         return vuse;
1515       if (vdef != NULL_TREE)
1516         return NULL_TREE;
1517     }
1518
1519   if (EDGE_COUNT (bb->succs) == 0)
1520     return NULL_TREE;
1521
1522   succ = EDGE_SUCC (bb, 0)->dest;
1523   succ_phi = vop_phi (succ);
1524   return (succ_phi != NULL
1525           ? PHI_ARG_DEF_FROM_EDGE (succ_phi, find_edge (bb, succ))
1526           : NULL_TREE);
1527 }
1528
1529 /* Given that all incoming edges of BB1 have been redirected to BB2, delete BB1
1530    and recompute dominator info.  */
1531
1532 static void
1533 delete_block_update_dominator_info (basic_block bb1, basic_block bb2)
1534 {
1535   VEC (basic_block,heap) *fix_dom_bb;
1536   unsigned int i;
1537   basic_block bb, dom;
1538   edge e;
1539   edge_iterator ei;
1540
1541   /* Consider the following cfg, where A is the direct dominator of I:
1542
1543                 A
1544                / \
1545               B   \
1546              / \   \
1547                 C   D
1548                /|   |\
1549                 E   F
1550                 |\ /|
1551                 | x |
1552                 |/ \|
1553                 G   H
1554                  \ /
1555                   I
1556
1557      Say E and F are duplicates, and F is removed.  The cfg then looks like
1558      this:
1559
1560                 A
1561                / \
1562               B   \
1563              / \   \
1564                 C   D
1565                / \ / \
1566                   E
1567                  / \
1568                 G   H
1569                  \ /
1570                   I
1571
1572      E is now the new direct dominator of I.
1573
1574      In order to calculate the new dominator info, we take the nearest common
1575      dominator (A) of bb1 (F) and bb2 (E), and get the set of bbs immediately
1576      dominated by it.  Some of this set may now be directly dominated by bb2.
1577
1578      Ideally we would have a means to determine which bbs in the set are now
1579      dominated by bb2, and call set_immediate_dominator for those bbs, but we
1580      don't, so instead we let iterate_fix_dominators figure it out.  */
1581
1582   /* Add bbs immediately dominated by the most common dominator.  */
1583   dom = nearest_common_dominator (CDI_DOMINATORS, bb1, bb2);
1584   fix_dom_bb = get_dominated_by (CDI_DOMINATORS, dom);
1585
1586   if (get_immediate_dominator (CDI_DOMINATORS, bb1) == dom)
1587     for (i = 0; VEC_iterate (basic_block, fix_dom_bb, i, bb); ++i)
1588       {
1589         if (bb != bb1)
1590           continue;
1591         VEC_unordered_remove (basic_block, fix_dom_bb, i);
1592         break;
1593       }
1594
1595   /* Add bb2, but not twice.  */
1596   if (get_immediate_dominator (CDI_DOMINATORS, bb2) != dom)
1597     VEC_safe_push (basic_block, heap, fix_dom_bb, bb2);
1598   /* Add succs of bb2, but not twice.  */
1599   FOR_EACH_EDGE (e, ei, bb2->succs)
1600     if (get_immediate_dominator (CDI_DOMINATORS, e->dest) != dom)
1601       VEC_safe_push (basic_block, heap, fix_dom_bb, e->dest);
1602
1603   delete_basic_block (bb1);
1604   iterate_fix_dominators (CDI_DOMINATORS, fix_dom_bb, false);
1605 #if defined (ENABLE_CHECKING)
1606   verify_dominators (CDI_DOMINATORS);
1607 #endif
1608   VEC_free (basic_block, heap, fix_dom_bb);
1609 }
1610
1611 /* Redirect all edges from BB1 to BB2, marks BB1 for removal, and if
1612    UPDATE_VOPS, inserts vop phis.  */
1613
1614 static void
1615 replace_block_by (basic_block bb1, basic_block bb2, bool update_vops)
1616 {
1617   edge pred_edge;
1618   unsigned int i;
1619   tree phi_vuse1 = NULL_TREE, phi_vuse2 = NULL_TREE, arg;
1620   VEC (edge,heap) *redirected_edges = NULL;
1621   edge e;
1622   edge_iterator ei;
1623   bool vuse1_phi_args = false;
1624
1625   phi_vuse2 = vop_at_entry (bb2);
1626   if (phi_vuse2 != NULL_TREE && TREE_CODE (phi_vuse2) != SSA_NAME)
1627     phi_vuse2 = NULL_TREE;
1628
1629   if (update_vops)
1630     {
1631       /* Find the vops at entry of bb1 and bb2.  */
1632       phi_vuse1 = vop_at_entry (bb1);
1633
1634       /* If both are not found, it means there's no need to update.  Uses old
1635          dominator info.  */
1636       if (phi_vuse1 == NULL_TREE && phi_vuse2 == NULL_TREE)
1637         update_vops = false;
1638       else if (phi_vuse1 == NULL_TREE)
1639         update_vops = dominated_by_p (CDI_DOMINATORS, bb1, bb2);
1640       else if (phi_vuse2 == NULL_TREE)
1641         update_vops = dominated_by_p (CDI_DOMINATORS, bb2, bb1);
1642     }
1643
1644   if (phi_vuse1 && gimple_bb (SSA_NAME_DEF_STMT (phi_vuse1)) == bb1)
1645     {
1646       /* If the vop at entry of bb1 is a phi, save the phi alternatives in
1647          BB_VOP_AT_EXIT, before we lose that information by redirecting the
1648          edges.  */
1649       FOR_EACH_EDGE (e, ei, bb1->preds)
1650         {
1651           arg = PHI_ARG_DEF_FROM_EDGE (SSA_NAME_DEF_STMT (phi_vuse1), e);
1652           BB_VOP_AT_EXIT (e->src) = arg;
1653         }
1654       vuse1_phi_args = true;
1655     }
1656
1657   /* Mark the basic block for later deletion.  */
1658   delete_basic_block_same_succ (bb1);
1659
1660   if (update_vops)
1661     redirected_edges = VEC_alloc (edge, heap, 10);
1662
1663   /* Redirect the incoming edges of bb1 to bb2.  */
1664   for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
1665     {
1666       pred_edge = EDGE_PRED (bb1, i - 1);
1667       pred_edge = redirect_edge_and_branch (pred_edge, bb2);
1668       gcc_assert (pred_edge != NULL);
1669       if (update_vops)
1670         VEC_safe_push (edge, heap, redirected_edges, pred_edge);
1671       else if (phi_vuse2 && gimple_bb (SSA_NAME_DEF_STMT (phi_vuse2)) == bb2)
1672         add_phi_arg (SSA_NAME_DEF_STMT (phi_vuse2), SSA_NAME_VAR (phi_vuse2),
1673                      pred_edge, UNKNOWN_LOCATION);
1674     }
1675
1676   /* Do updates that use bb1, before deleting bb1.  */
1677   if (!update_vops)
1678     release_last_vdef (bb1);
1679   same_succ_flush_bb (bb1);
1680
1681   delete_block_update_dominator_info (bb1, bb2);
1682
1683   /* Update the vops.  Uses new dominator info.  */
1684   if (update_vops)
1685     {
1686       update_vuses (vuse1_phi_args, phi_vuse1, phi_vuse2, bb2,
1687                     redirected_edges);
1688       VEC_free (edge, heap, redirected_edges);
1689     }
1690 }
1691
1692 /* Bbs for which update_debug_stmt need to be called.  */
1693
1694 static bitmap update_bbs;
1695
1696 /* For each cluster in all_clusters, merge all cluster->bbs.  Returns
1697    number of bbs removed.  Insert vop phis if UPDATE_VOPS.  */
1698
1699 static int
1700 apply_clusters (bool update_vops)
1701 {
1702   basic_block bb1, bb2;
1703   bb_cluster c;
1704   unsigned int i, j;
1705   bitmap_iterator bj;
1706   int nr_bbs_removed = 0;
1707
1708   for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
1709     {
1710       c = VEC_index (bb_cluster, all_clusters, i);
1711       if (c == NULL)
1712         continue;
1713
1714       bb2 = c->rep_bb;
1715       bitmap_set_bit (update_bbs, bb2->index);
1716
1717       bitmap_clear_bit (c->bbs, bb2->index);
1718       EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
1719         {
1720           bb1 = BASIC_BLOCK (j);
1721           bitmap_clear_bit (update_bbs, bb1->index);
1722
1723           replace_block_by (bb1, bb2, update_vops);
1724           nr_bbs_removed++;
1725         }
1726     }
1727
1728   return nr_bbs_removed;
1729 }
1730
1731 /* Resets debug statement STMT if it has uses that are not dominated by their
1732    defs.  */
1733
1734 static void
1735 update_debug_stmt (gimple stmt)
1736 {
1737   use_operand_p use_p;
1738   ssa_op_iter oi;
1739   basic_block bbdef, bbuse;
1740   gimple def_stmt;
1741   tree name;
1742
1743   if (!gimple_debug_bind_p (stmt))
1744     return;
1745
1746   bbuse = gimple_bb (stmt);
1747   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
1748     {
1749       name = USE_FROM_PTR (use_p);
1750       gcc_assert (TREE_CODE (name) == SSA_NAME);
1751
1752       def_stmt = SSA_NAME_DEF_STMT (name);
1753       gcc_assert (def_stmt != NULL);
1754
1755       bbdef = gimple_bb (def_stmt);
1756       if (bbdef == NULL || bbuse == bbdef
1757           || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
1758         continue;
1759
1760       gimple_debug_bind_reset_value (stmt);
1761       update_stmt (stmt);
1762     }
1763 }
1764
1765 /* Resets all debug statements that have uses that are not
1766    dominated by their defs.  */
1767
1768 static void
1769 update_debug_stmts (void)
1770 {
1771   basic_block bb;
1772   bitmap_iterator bi;
1773   unsigned int i;
1774
1775   if (!MAY_HAVE_DEBUG_STMTS)
1776     return;
1777
1778   EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
1779     {
1780       gimple stmt;
1781       gimple_stmt_iterator gsi;
1782
1783       bb = BASIC_BLOCK (i);
1784       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1785         {
1786           stmt = gsi_stmt (gsi);
1787           if (!is_gimple_debug (stmt))
1788             continue;
1789           update_debug_stmt (stmt);
1790         }
1791     }
1792 }
1793
1794 /* Runs tail merge optimization.  */
1795
1796 unsigned int
1797 tail_merge_optimize (unsigned int todo)
1798 {
1799   int nr_bbs_removed_total = 0;
1800   int nr_bbs_removed;
1801   bool loop_entered = false;
1802   int iteration_nr = 0;
1803   bool update_vops = !symbol_marked_for_renaming (gimple_vop (cfun));
1804   int max_iterations = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_ITERATIONS);
1805
1806   if (!flag_tree_tail_merge || max_iterations == 0)
1807     return 0;
1808
1809   timevar_push (TV_TREE_TAIL_MERGE);
1810
1811   calculate_dominance_info (CDI_DOMINATORS);
1812   init_worklist ();
1813
1814   while (!VEC_empty (same_succ, worklist))
1815     {
1816       if (!loop_entered)
1817         {
1818           loop_entered = true;
1819           alloc_cluster_vectors ();
1820           update_bbs = BITMAP_ALLOC (NULL);
1821         }
1822       else
1823         reset_cluster_vectors ();
1824
1825       iteration_nr++;
1826       if (dump_file && (dump_flags & TDF_DETAILS))
1827         fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
1828
1829       find_clusters ();
1830       gcc_assert (VEC_empty (same_succ, worklist));
1831       if (VEC_empty (bb_cluster, all_clusters))
1832         break;
1833
1834       nr_bbs_removed = apply_clusters (update_vops);
1835       nr_bbs_removed_total += nr_bbs_removed;
1836       if (nr_bbs_removed == 0)
1837         break;
1838
1839       purge_bbs ();
1840
1841       if (iteration_nr == max_iterations)
1842         break;
1843
1844       update_worklist ();
1845     }
1846
1847   if (dump_file && (dump_flags & TDF_DETAILS))
1848     fprintf (dump_file, "htab collision / search: %f\n",
1849              htab_collisions (same_succ_htab));
1850
1851   if (nr_bbs_removed_total > 0)
1852     {
1853       update_debug_stmts ();
1854
1855       if (dump_file && (dump_flags & TDF_DETAILS))
1856         {
1857           fprintf (dump_file, "Before TODOs.\n");
1858           dump_function_to_file (current_function_decl, dump_file, dump_flags);
1859         }
1860
1861       todo |= (TODO_verify_ssa | TODO_verify_stmts | TODO_verify_flow
1862                | TODO_dump_func);
1863     }
1864
1865   delete_worklist ();
1866   if (loop_entered)
1867     {
1868       delete_cluster_vectors ();
1869       BITMAP_FREE (update_bbs);
1870     }
1871
1872   timevar_pop (TV_TREE_TAIL_MERGE);
1873
1874   return todo;
1875 }