]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa-tail-merge.c
no-section-anchors-vect-69.c: Change {!vect_align_arrays} to vect_sizes_32B_16B.
[thirdparty/gcc.git] / gcc / tree-ssa-tail-merge.c
CommitLineData
c9e93168
TV
1/* Tail merging for gimple.
2 Copyright (C) 2011 Free Software Foundation, Inc.
3 Contributed by Tom de Vries (tom@codesourcery.com)
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along 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
211struct 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};
227typedef struct same_succ_def *same_succ;
228typedef 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
232struct 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};
243typedef struct bb_cluster_def *bb_cluster;
244typedef const struct bb_cluster_def *const_bb_cluster;
245
246/* Per bb-info. */
247
248struct 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
277static bool
278gvn_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
294static void
295same_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
309static int
310same_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
320static void
321update_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
345static void
346stmt_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
358static bool
359local_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
388static hashval_t
389same_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
466static bool
467inverse_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
488static int
489same_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
543static same_succ
544same_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
559static void
560same_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
574static void
575same_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
585static htab_t same_succ_htab;
586
587/* Array that is used to store the edge flags for a successor. */
588
589static int *same_succ_edge_flags;
590
591/* Bitmap that is used to mark bbs that are recently deleted. */
592
593static bitmap deleted_bbs;
594
595/* Bitmap that is used to mark predecessors of bbs that are
596 deleted. */
597
598static bitmap deleted_bb_preds;
599
600/* Prints same_succ_htab to stderr. */
601
602extern void debug_same_succ (void);
603DEBUG_FUNCTION void
604debug_same_succ ( void)
605{
606 htab_traverse (same_succ_htab, same_succ_print_traverse, stderr);
607}
608
609DEF_VEC_P (same_succ);
610DEF_VEC_ALLOC_P (same_succ, heap);
611
612/* Vector of bbs to process. */
613
614static VEC (same_succ, heap) *worklist;
615
616/* Prints worklist to FILE. */
617
618static void
619print_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
628static void
629add_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
643static void
644find_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
689static void
690find_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
707static void
708init_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
729static void
730delete_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
744static void
643400b8 745mark_basic_block_deleted (basic_block bb)
c9e93168
TV
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
4cbdcd40
TV
756/* Removes BB from its corresponding same_succ. */
757
758static void
759same_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
c9e93168
TV
769/* Removes all bbs in BBS from their corresponding same_succ. */
770
771static void
772same_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)
4cbdcd40 778 same_succ_flush_bb (BASIC_BLOCK (i));
c9e93168
TV
779}
780
266fbb79
TV
781/* Release the last vdef in BB, either normal or phi result. */
782
783static void
784release_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
c9e93168
TV
812/* For deleted_bb_preds, find bbs with same successors. */
813
814static void
815update_worklist (void)
816{
817 unsigned int i;
818 bitmap_iterator bi;
819 basic_block bb;
820 same_succ same;
821
643400b8
TV
822 bitmap_and_compl_into (deleted_bb_preds, deleted_bbs);
823 bitmap_clear (deleted_bbs);
824
c9e93168
TV
825 bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK);
826 same_succ_flush_bbs (deleted_bb_preds);
827
828 same = same_succ_alloc ();
829 EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi)
830 {
831 bb = BASIC_BLOCK (i);
832 gcc_assert (bb != NULL);
833 find_same_succ_bb (bb, &same);
834 if (same == NULL)
835 same = same_succ_alloc ();
836 }
837 same_succ_delete (same);
838 bitmap_clear (deleted_bb_preds);
839}
840
841/* Prints cluster C to FILE. */
842
843static void
844print_cluster (FILE *file, bb_cluster c)
845{
846 if (c == NULL)
847 return;
848 bitmap_print (file, c->bbs, "bbs:", "\n");
849 bitmap_print (file, c->preds, "preds:", "\n");
850}
851
852/* Prints cluster C to stderr. */
853
854extern void debug_cluster (bb_cluster);
855DEBUG_FUNCTION void
856debug_cluster (bb_cluster c)
857{
858 print_cluster (stderr, c);
859}
860
861/* Update C->rep_bb, given that BB is added to the cluster. */
862
863static void
864update_rep_bb (bb_cluster c, basic_block bb)
865{
866 /* Initial. */
867 if (c->rep_bb == NULL)
868 {
869 c->rep_bb = bb;
870 return;
871 }
872
873 /* Current needs no deps, keep it. */
874 if (BB_DEP_BB (c->rep_bb) == NULL)
875 return;
876
877 /* Bb needs no deps, change rep_bb. */
878 if (BB_DEP_BB (bb) == NULL)
879 {
880 c->rep_bb = bb;
881 return;
882 }
883
884 /* Bb needs last deps earlier than current, change rep_bb. A potential
885 problem with this, is that the first deps might also be earlier, which
886 would mean we prefer longer lifetimes for the deps. To be able to check
887 for this, we would have to trace BB_FIRST_DEP_BB as well, besides
888 BB_DEP_BB, which is really BB_LAST_DEP_BB.
889 The benefit of choosing the bb with last deps earlier, is that it can
890 potentially be used as replacement for more bbs. */
891 if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb)))
892 c->rep_bb = bb;
893}
894
895/* Add BB to cluster C. Sets BB in C->bbs, and preds of BB in C->preds. */
896
897static void
898add_bb_to_cluster (bb_cluster c, basic_block bb)
899{
900 edge e;
901 edge_iterator ei;
902
903 bitmap_set_bit (c->bbs, bb->index);
904
905 FOR_EACH_EDGE (e, ei, bb->preds)
906 bitmap_set_bit (c->preds, e->src->index);
907
908 update_rep_bb (c, bb);
909}
910
911/* Allocate and init new cluster. */
912
913static bb_cluster
914new_cluster (void)
915{
916 bb_cluster c;
917 c = XCNEW (struct bb_cluster_def);
918 c->bbs = BITMAP_ALLOC (NULL);
919 c->preds = BITMAP_ALLOC (NULL);
920 c->rep_bb = NULL;
921 return c;
922}
923
924/* Delete clusters. */
925
926static void
927delete_cluster (bb_cluster c)
928{
929 if (c == NULL)
930 return;
931 BITMAP_FREE (c->bbs);
932 BITMAP_FREE (c->preds);
933 XDELETE (c);
934}
935
936DEF_VEC_P (bb_cluster);
937DEF_VEC_ALLOC_P (bb_cluster, heap);
938
939/* Array that contains all clusters. */
940
941static VEC (bb_cluster, heap) *all_clusters;
942
943/* Allocate all cluster vectors. */
944
945static void
946alloc_cluster_vectors (void)
947{
948 all_clusters = VEC_alloc (bb_cluster, heap, n_basic_blocks);
949}
950
951/* Reset all cluster vectors. */
952
953static void
954reset_cluster_vectors (void)
955{
956 unsigned int i;
957 basic_block bb;
958 for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
959 delete_cluster (VEC_index (bb_cluster, all_clusters, i));
960 VEC_truncate (bb_cluster, all_clusters, 0);
961 FOR_EACH_BB (bb)
962 BB_CLUSTER (bb) = NULL;
963}
964
965/* Delete all cluster vectors. */
966
967static void
968delete_cluster_vectors (void)
969{
970 unsigned int i;
971 for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
972 delete_cluster (VEC_index (bb_cluster, all_clusters, i));
973 VEC_free (bb_cluster, heap, all_clusters);
974}
975
976/* Merge cluster C2 into C1. */
977
978static void
979merge_clusters (bb_cluster c1, bb_cluster c2)
980{
981 bitmap_ior_into (c1->bbs, c2->bbs);
982 bitmap_ior_into (c1->preds, c2->preds);
983}
984
985/* Register equivalence of BB1 and BB2 (members of cluster C). Store c in
986 all_clusters, or merge c with existing cluster. */
987
988static void
989set_cluster (basic_block bb1, basic_block bb2)
990{
991 basic_block merge_bb, other_bb;
992 bb_cluster merge, old, c;
993
994 if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL)
995 {
996 c = new_cluster ();
997 add_bb_to_cluster (c, bb1);
998 add_bb_to_cluster (c, bb2);
999 BB_CLUSTER (bb1) = c;
1000 BB_CLUSTER (bb2) = c;
1001 c->index = VEC_length (bb_cluster, all_clusters);
1002 VEC_safe_push (bb_cluster, heap, all_clusters, c);
1003 }
1004 else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL)
1005 {
1006 merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1;
1007 other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2;
1008 merge = BB_CLUSTER (merge_bb);
1009 add_bb_to_cluster (merge, other_bb);
1010 BB_CLUSTER (other_bb) = merge;
1011 }
1012 else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2))
1013 {
1014 unsigned int i;
1015 bitmap_iterator bi;
1016
1017 old = BB_CLUSTER (bb2);
1018 merge = BB_CLUSTER (bb1);
1019 merge_clusters (merge, old);
1020 EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi)
1021 BB_CLUSTER (BASIC_BLOCK (i)) = merge;
1022 VEC_replace (bb_cluster, all_clusters, old->index, NULL);
1023 update_rep_bb (merge, old->rep_bb);
1024 delete_cluster (old);
1025 }
1026 else
1027 gcc_unreachable ();
1028}
1029
1030/* Return true if gimple statements S1 and S2 are equal. Gimple_bb (s1) and
1031 gimple_bb (s2) are members of SAME_SUCC. */
1032
1033static bool
1034gimple_equal_p (same_succ same_succ, gimple s1, gimple s2)
1035{
1036 unsigned int i;
1037 tree lhs1, lhs2;
1038 basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
1039 tree t1, t2;
1040 bool equal, inv_cond;
1041 enum tree_code code1, code2;
1042
1043 if (gimple_code (s1) != gimple_code (s2))
1044 return false;
1045
1046 switch (gimple_code (s1))
1047 {
1048 case GIMPLE_CALL:
1049 if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
1050 return false;
1051 if (!gimple_call_same_target_p (s1, s2))
1052 return false;
1053
feca8f5a
TR
1054 /* Eventually, we'll significantly complicate the CFG by adding
1055 back edges to properly model the effects of transaction restart.
1056 For the bulk of optimization this does not matter, but what we
1057 cannot recover from is tail merging blocks between two separate
1058 transactions. Avoid that by making commit not match. */
1059 if (gimple_call_builtin_p (s1, BUILT_IN_TM_COMMIT))
1060 return false;
1061
c9e93168
TV
1062 equal = true;
1063 for (i = 0; i < gimple_call_num_args (s1); ++i)
1064 {
1065 t1 = gimple_call_arg (s1, i);
1066 t2 = gimple_call_arg (s2, i);
1067 if (operand_equal_p (t1, t2, 0))
1068 continue;
1069 if (gvn_uses_equal (t1, t2))
1070 continue;
1071 equal = false;
1072 break;
1073 }
1074 if (equal)
1075 return true;
1076
1077 lhs1 = gimple_get_lhs (s1);
1078 lhs2 = gimple_get_lhs (s2);
1079 return (lhs1 != NULL_TREE && lhs2 != NULL_TREE
1080 && TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME
1081 && vn_valueize (lhs1) == vn_valueize (lhs2));
1082
1083 case GIMPLE_ASSIGN:
1084 lhs1 = gimple_get_lhs (s1);
1085 lhs2 = gimple_get_lhs (s2);
1086 return (TREE_CODE (lhs1) == SSA_NAME
1087 && TREE_CODE (lhs2) == SSA_NAME
1088 && vn_valueize (lhs1) == vn_valueize (lhs2));
1089
1090 case GIMPLE_COND:
1091 t1 = gimple_cond_lhs (s1);
1092 t2 = gimple_cond_lhs (s2);
1093 if (!operand_equal_p (t1, t2, 0)
1094 && !gvn_uses_equal (t1, t2))
1095 return false;
1096
1097 t1 = gimple_cond_rhs (s1);
1098 t2 = gimple_cond_rhs (s2);
1099 if (!operand_equal_p (t1, t2, 0)
1100 && !gvn_uses_equal (t1, t2))
1101 return false;
1102
1103 code1 = gimple_expr_code (s1);
1104 code2 = gimple_expr_code (s2);
1105 inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index)
1106 != bitmap_bit_p (same_succ->inverse, bb2->index));
1107 if (inv_cond)
1108 {
1109 bool honor_nans
1110 = HONOR_NANS (TYPE_MODE (TREE_TYPE (gimple_cond_lhs (s1))));
1111 code2 = invert_tree_comparison (code2, honor_nans);
1112 }
1113 return code1 == code2;
1114
1115 default:
1116 return false;
1117 }
1118}
1119
1120/* Let GSI skip backwards over local defs. */
1121
1122static void
1123gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
1124{
1125 gimple stmt;
1126
1127 while (true)
1128 {
1129 if (gsi_end_p (*gsi))
1130 return;
1131 stmt = gsi_stmt (*gsi);
1132 if (!(is_gimple_assign (stmt) && local_def (gimple_get_lhs (stmt))
1133 && !gimple_has_side_effects (stmt)))
1134 return;
1135 gsi_prev_nondebug (gsi);
1136 }
1137}
1138
1139/* Determines whether BB1 and BB2 (members of same_succ) are duplicates. If so,
1140 clusters them. */
1141
1142static void
1143find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2)
1144{
1145 gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
1146 gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
1147
1148 gsi_advance_bw_nondebug_nonlocal (&gsi1);
1149 gsi_advance_bw_nondebug_nonlocal (&gsi2);
1150
1151 while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
1152 {
1153 if (!gimple_equal_p (same_succ, gsi_stmt (gsi1), gsi_stmt (gsi2)))
1154 return;
1155
1156 gsi_prev_nondebug (&gsi1);
1157 gsi_prev_nondebug (&gsi2);
1158 gsi_advance_bw_nondebug_nonlocal (&gsi1);
1159 gsi_advance_bw_nondebug_nonlocal (&gsi2);
1160 }
1161
1162 if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
1163 return;
1164
1165 if (dump_file)
1166 fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
1167 bb1->index, bb2->index);
1168
1169 set_cluster (bb1, bb2);
1170}
1171
1172/* Returns whether for all phis in DEST the phi alternatives for E1 and
1173 E2 are equal. */
1174
1175static bool
1176same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
1177{
1178 int n1 = e1->dest_idx, n2 = e2->dest_idx;
1179 gimple_stmt_iterator gsi;
1180
1181 for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
1182 {
1183 gimple phi = gsi_stmt (gsi);
1184 tree lhs = gimple_phi_result (phi);
1185 tree val1 = gimple_phi_arg_def (phi, n1);
1186 tree val2 = gimple_phi_arg_def (phi, n2);
1187
1188 if (!is_gimple_reg (lhs))
1189 continue;
1190
1191 if (operand_equal_for_phi_arg_p (val1, val2))
1192 continue;
1193 if (gvn_uses_equal (val1, val2))
1194 continue;
1195
1196 return false;
1197 }
1198
1199 return true;
1200}
1201
1202/* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the
1203 phi alternatives for BB1 and BB2 are equal. */
1204
1205static bool
1206same_phi_alternatives (same_succ same_succ, basic_block bb1, basic_block bb2)
1207{
1208 unsigned int s;
1209 bitmap_iterator bs;
1210 edge e1, e2;
1211 basic_block succ;
1212
1213 EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs)
1214 {
1215 succ = BASIC_BLOCK (s);
1216 e1 = find_edge (bb1, succ);
1217 e2 = find_edge (bb2, succ);
1218 if (e1->flags & EDGE_COMPLEX
1219 || e2->flags & EDGE_COMPLEX)
1220 return false;
1221
1222 /* For all phis in bb, the phi alternatives for e1 and e2 need to have
1223 the same value. */
1224 if (!same_phi_alternatives_1 (succ, e1, e2))
1225 return false;
1226 }
1227
1228 return true;
1229}
1230
1231/* Return true if BB has non-vop phis. */
1232
1233static bool
1234bb_has_non_vop_phi (basic_block bb)
1235{
1236 gimple_seq phis = phi_nodes (bb);
1237 gimple phi;
1238
1239 if (phis == NULL)
1240 return false;
1241
1242 if (!gimple_seq_singleton_p (phis))
1243 return true;
1244
1245 phi = gimple_seq_first_stmt (phis);
1246 return is_gimple_reg (gimple_phi_result (phi));
1247}
1248
1249/* Returns true if redirecting the incoming edges of FROM to TO maintains the
1250 invariant that uses in FROM are dominates by their defs. */
1251
1252static bool
1253deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to)
1254{
1255 basic_block cd, dep_bb = BB_DEP_BB (to);
1256 edge_iterator ei;
1257 edge e;
1258 bitmap from_preds = BITMAP_ALLOC (NULL);
1259
1260 if (dep_bb == NULL)
1261 return true;
1262
1263 FOR_EACH_EDGE (e, ei, from->preds)
1264 bitmap_set_bit (from_preds, e->src->index);
1265 cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
1266 BITMAP_FREE (from_preds);
1267
1268 return dominated_by_p (CDI_DOMINATORS, dep_bb, cd);
1269}
1270
1271/* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its
1272 replacement bb) and vice versa maintains the invariant that uses in the
1273 replacement are dominates by their defs. */
1274
1275static bool
1276deps_ok_for_redirect (basic_block bb1, basic_block bb2)
1277{
1278 if (BB_CLUSTER (bb1) != NULL)
1279 bb1 = BB_CLUSTER (bb1)->rep_bb;
1280
1281 if (BB_CLUSTER (bb2) != NULL)
1282 bb2 = BB_CLUSTER (bb2)->rep_bb;
1283
1284 return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2)
1285 && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1));
1286}
1287
1288/* Within SAME_SUCC->bbs, find clusters of bbs which can be merged. */
1289
1290static void
1291find_clusters_1 (same_succ same_succ)
1292{
1293 basic_block bb1, bb2;
1294 unsigned int i, j;
1295 bitmap_iterator bi, bj;
1296 int nr_comparisons;
1297 int max_comparisons = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_COMPARISONS);
1298
1299 EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
1300 {
1301 bb1 = BASIC_BLOCK (i);
1302
1303 /* TODO: handle blocks with phi-nodes. We'll have to find corresponding
1304 phi-nodes in bb1 and bb2, with the same alternatives for the same
1305 preds. */
1306 if (bb_has_non_vop_phi (bb1))
1307 continue;
1308
1309 nr_comparisons = 0;
1310 EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj)
1311 {
1312 bb2 = BASIC_BLOCK (j);
1313
1314 if (bb_has_non_vop_phi (bb2))
1315 continue;
1316
1317 if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2))
1318 continue;
1319
1320 /* Limit quadratic behaviour. */
1321 nr_comparisons++;
1322 if (nr_comparisons > max_comparisons)
1323 break;
1324
1325 /* This is a conservative dependency check. We could test more
1326 precise for allowed replacement direction. */
1327 if (!deps_ok_for_redirect (bb1, bb2))
1328 continue;
1329
1330 if (!(same_phi_alternatives (same_succ, bb1, bb2)))
1331 continue;
1332
1333 find_duplicate (same_succ, bb1, bb2);
1334 }
1335 }
1336}
1337
1338/* Find clusters of bbs which can be merged. */
1339
1340static void
1341find_clusters (void)
1342{
1343 same_succ same;
1344
1345 while (!VEC_empty (same_succ, worklist))
1346 {
1347 same = VEC_pop (same_succ, worklist);
1348 same->in_worklist = false;
1349 if (dump_file && (dump_flags & TDF_DETAILS))
1350 {
1351 fprintf (dump_file, "processing worklist entry\n");
1352 same_succ_print (dump_file, same);
1353 }
1354 find_clusters_1 (same);
1355 }
1356}
1357
c9e93168
TV
1358/* Returns the vop phi of BB, if any. */
1359
1360static gimple
1361vop_phi (basic_block bb)
1362{
1363 gimple stmt;
1364 gimple_stmt_iterator gsi;
1365 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1366 {
1367 stmt = gsi_stmt (gsi);
1368 if (is_gimple_reg (gimple_phi_result (stmt)))
1369 continue;
1370 return stmt;
1371 }
1372 return NULL;
1373}
1374
643400b8 1375/* Redirect all edges from BB1 to BB2, removes BB1 and marks it as removed. */
c9e93168
TV
1376
1377static void
643400b8 1378replace_block_by (basic_block bb1, basic_block bb2)
c9e93168
TV
1379{
1380 edge pred_edge;
1381 unsigned int i;
643400b8 1382 gimple bb2_phi;
40f73edd 1383
643400b8 1384 bb2_phi = vop_phi (bb2);
c9e93168 1385
643400b8
TV
1386 /* Mark the basic block as deleted. */
1387 mark_basic_block_deleted (bb1);
c9e93168
TV
1388
1389 /* Redirect the incoming edges of bb1 to bb2. */
1390 for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
1391 {
1392 pred_edge = EDGE_PRED (bb1, i - 1);
1393 pred_edge = redirect_edge_and_branch (pred_edge, bb2);
1394 gcc_assert (pred_edge != NULL);
643400b8
TV
1395
1396 if (bb2_phi == NULL)
1397 continue;
1398
1399 /* The phi might have run out of capacity when the redirect added an
1400 argument, which means it could have been replaced. Refresh it. */
1401 bb2_phi = vop_phi (bb2);
1402
1403 add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
1404 pred_edge, UNKNOWN_LOCATION);
c9e93168
TV
1405 }
1406
fa405d7b
TV
1407 bb2->frequency += bb1->frequency;
1408 if (bb2->frequency > BB_FREQ_MAX)
1409 bb2->frequency = BB_FREQ_MAX;
1410 bb1->frequency = 0;
1411
a31895d7 1412 /* Do updates that use bb1, before deleting bb1. */
643400b8 1413 release_last_vdef (bb1);
a31895d7
TV
1414 same_succ_flush_bb (bb1);
1415
643400b8 1416 delete_basic_block (bb1);
c9e93168
TV
1417}
1418
1419/* Bbs for which update_debug_stmt need to be called. */
1420
1421static bitmap update_bbs;
1422
1423/* For each cluster in all_clusters, merge all cluster->bbs. Returns
643400b8 1424 number of bbs removed. */
c9e93168
TV
1425
1426static int
643400b8 1427apply_clusters (void)
c9e93168
TV
1428{
1429 basic_block bb1, bb2;
1430 bb_cluster c;
1431 unsigned int i, j;
1432 bitmap_iterator bj;
1433 int nr_bbs_removed = 0;
1434
1435 for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
1436 {
1437 c = VEC_index (bb_cluster, all_clusters, i);
1438 if (c == NULL)
1439 continue;
1440
1441 bb2 = c->rep_bb;
1442 bitmap_set_bit (update_bbs, bb2->index);
1443
1444 bitmap_clear_bit (c->bbs, bb2->index);
1445 EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
1446 {
1447 bb1 = BASIC_BLOCK (j);
1448 bitmap_clear_bit (update_bbs, bb1->index);
1449
643400b8 1450 replace_block_by (bb1, bb2);
c9e93168
TV
1451 nr_bbs_removed++;
1452 }
1453 }
1454
1455 return nr_bbs_removed;
1456}
1457
1458/* Resets debug statement STMT if it has uses that are not dominated by their
1459 defs. */
1460
1461static void
1462update_debug_stmt (gimple stmt)
1463{
1464 use_operand_p use_p;
1465 ssa_op_iter oi;
1466 basic_block bbdef, bbuse;
1467 gimple def_stmt;
1468 tree name;
1469
1470 if (!gimple_debug_bind_p (stmt))
1471 return;
1472
1473 bbuse = gimple_bb (stmt);
1474 FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
1475 {
1476 name = USE_FROM_PTR (use_p);
1477 gcc_assert (TREE_CODE (name) == SSA_NAME);
1478
1479 def_stmt = SSA_NAME_DEF_STMT (name);
1480 gcc_assert (def_stmt != NULL);
1481
1482 bbdef = gimple_bb (def_stmt);
1483 if (bbdef == NULL || bbuse == bbdef
1484 || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
1485 continue;
1486
1487 gimple_debug_bind_reset_value (stmt);
1488 update_stmt (stmt);
1489 }
1490}
1491
1492/* Resets all debug statements that have uses that are not
1493 dominated by their defs. */
1494
1495static void
1496update_debug_stmts (void)
1497{
1498 basic_block bb;
1499 bitmap_iterator bi;
1500 unsigned int i;
1501
c9e93168
TV
1502 EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
1503 {
1504 gimple stmt;
1505 gimple_stmt_iterator gsi;
1506
1507 bb = BASIC_BLOCK (i);
1508 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1509 {
1510 stmt = gsi_stmt (gsi);
1511 if (!is_gimple_debug (stmt))
1512 continue;
1513 update_debug_stmt (stmt);
1514 }
1515 }
1516}
1517
1518/* Runs tail merge optimization. */
1519
1520unsigned int
1521tail_merge_optimize (unsigned int todo)
1522{
1523 int nr_bbs_removed_total = 0;
1524 int nr_bbs_removed;
1525 bool loop_entered = false;
1526 int iteration_nr = 0;
c9e93168
TV
1527 int max_iterations = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_ITERATIONS);
1528
1529 if (!flag_tree_tail_merge || max_iterations == 0)
1530 return 0;
1531
1532 timevar_push (TV_TREE_TAIL_MERGE);
1533
1534 calculate_dominance_info (CDI_DOMINATORS);
1535 init_worklist ();
1536
1537 while (!VEC_empty (same_succ, worklist))
1538 {
1539 if (!loop_entered)
1540 {
1541 loop_entered = true;
1542 alloc_cluster_vectors ();
1543 update_bbs = BITMAP_ALLOC (NULL);
1544 }
1545 else
1546 reset_cluster_vectors ();
1547
1548 iteration_nr++;
1549 if (dump_file && (dump_flags & TDF_DETAILS))
1550 fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
1551
1552 find_clusters ();
1553 gcc_assert (VEC_empty (same_succ, worklist));
1554 if (VEC_empty (bb_cluster, all_clusters))
1555 break;
1556
643400b8 1557 nr_bbs_removed = apply_clusters ();
c9e93168
TV
1558 nr_bbs_removed_total += nr_bbs_removed;
1559 if (nr_bbs_removed == 0)
1560 break;
1561
643400b8 1562 free_dominance_info (CDI_DOMINATORS);
c9e93168
TV
1563
1564 if (iteration_nr == max_iterations)
1565 break;
1566
643400b8 1567 calculate_dominance_info (CDI_DOMINATORS);
c9e93168
TV
1568 update_worklist ();
1569 }
1570
1571 if (dump_file && (dump_flags & TDF_DETAILS))
1572 fprintf (dump_file, "htab collision / search: %f\n",
1573 htab_collisions (same_succ_htab));
1574
1575 if (nr_bbs_removed_total > 0)
1576 {
643400b8
TV
1577 if (MAY_HAVE_DEBUG_STMTS)
1578 {
1579 calculate_dominance_info (CDI_DOMINATORS);
1580 update_debug_stmts ();
1581 }
c9e93168
TV
1582
1583 if (dump_file && (dump_flags & TDF_DETAILS))
1584 {
1585 fprintf (dump_file, "Before TODOs.\n");
1586 dump_function_to_file (current_function_decl, dump_file, dump_flags);
1587 }
1588
1589 todo |= (TODO_verify_ssa | TODO_verify_stmts | TODO_verify_flow
1590 | TODO_dump_func);
643400b8 1591 mark_sym_for_renaming (gimple_vop (cfun));
c9e93168
TV
1592 }
1593
1594 delete_worklist ();
1595 if (loop_entered)
1596 {
1597 delete_cluster_vectors ();
1598 BITMAP_FREE (update_bbs);
1599 }
1600
1601 timevar_pop (TV_TREE_TAIL_MERGE);
1602
1603 return todo;
1604}