re PR tree-optimization/50763 (ICE: verify_gimple failed: missing PHI def with -ftree...
[gcc.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) == 2)
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 /* Redirect all edges from BB1 to BB2, marks BB1 for removal, and if
1530 UPDATE_VOPS, inserts vop phis. */
1531
1532 static void
1533 replace_block_by (basic_block bb1, basic_block bb2, bool update_vops)
1534 {
1535 edge pred_edge;
1536 unsigned int i;
1537 tree phi_vuse1 = NULL_TREE, phi_vuse2 = NULL_TREE, arg;
1538 VEC (edge,heap) *redirected_edges = NULL;
1539 edge e;
1540 edge_iterator ei;
1541 bool vuse1_phi_args = false;
1542 VEC (basic_block,heap) *fix_dom_bb;
1543
1544 phi_vuse2 = vop_at_entry (bb2);
1545 if (phi_vuse2 != NULL_TREE && TREE_CODE (phi_vuse2) != SSA_NAME)
1546 phi_vuse2 = NULL_TREE;
1547
1548 if (update_vops)
1549 {
1550 /* Find the vops at entry of bb1 and bb2. */
1551 phi_vuse1 = vop_at_entry (bb1);
1552
1553 /* If both are not found, it means there's no need to update. */
1554 if (phi_vuse1 == NULL_TREE && phi_vuse2 == NULL_TREE)
1555 update_vops = false;
1556 else if (phi_vuse1 == NULL_TREE)
1557 update_vops = dominated_by_p (CDI_DOMINATORS, bb1, bb2);
1558 else if (phi_vuse2 == NULL_TREE)
1559 update_vops = dominated_by_p (CDI_DOMINATORS, bb2, bb1);
1560 }
1561
1562 if (phi_vuse1 && gimple_bb (SSA_NAME_DEF_STMT (phi_vuse1)) == bb1)
1563 {
1564 /* If the vop at entry of bb1 is a phi, save the phi alternatives in
1565 BB_VOP_AT_EXIT, before we lose that information by redirecting the
1566 edges. */
1567 FOR_EACH_EDGE (e, ei, bb1->preds)
1568 {
1569 arg = PHI_ARG_DEF_FROM_EDGE (SSA_NAME_DEF_STMT (phi_vuse1), e);
1570 BB_VOP_AT_EXIT (e->src) = arg;
1571 }
1572 vuse1_phi_args = true;
1573 }
1574
1575 /* Mark the basic block for later deletion. */
1576 delete_basic_block_same_succ (bb1);
1577
1578 if (update_vops)
1579 redirected_edges = VEC_alloc (edge, heap, 10);
1580
1581 /* Redirect the incoming edges of bb1 to bb2. */
1582 for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
1583 {
1584 pred_edge = EDGE_PRED (bb1, i - 1);
1585 pred_edge = redirect_edge_and_branch (pred_edge, bb2);
1586 gcc_assert (pred_edge != NULL);
1587 if (update_vops)
1588 VEC_safe_push (edge, heap, redirected_edges, pred_edge);
1589 else if (phi_vuse2 && gimple_bb (SSA_NAME_DEF_STMT (phi_vuse2)) == bb2)
1590 add_phi_arg (SSA_NAME_DEF_STMT (phi_vuse2), SSA_NAME_VAR (phi_vuse2),
1591 pred_edge, UNKNOWN_LOCATION);
1592 }
1593
1594 /* Update the vops. */
1595 if (update_vops)
1596 {
1597 update_vuses (vuse1_phi_args, phi_vuse1, phi_vuse2, bb2,
1598 redirected_edges);
1599 VEC_free (edge, heap, redirected_edges);
1600 }
1601 else
1602 release_last_vdef (bb1);
1603
1604 same_succ_flush_bb (bb1);
1605 delete_basic_block (bb1);
1606
1607 fix_dom_bb = VEC_alloc (basic_block, heap, 2);
1608 VEC_safe_push (basic_block, heap, fix_dom_bb, bb2);
1609 FOR_EACH_EDGE (e, ei, bb2->succs)
1610 VEC_safe_push (basic_block, heap, fix_dom_bb, e->dest);
1611 iterate_fix_dominators (CDI_DOMINATORS, fix_dom_bb, false);
1612 VEC_free (basic_block, heap, fix_dom_bb);
1613 }
1614
1615 /* Bbs for which update_debug_stmt need to be called. */
1616
1617 static bitmap update_bbs;
1618
1619 /* For each cluster in all_clusters, merge all cluster->bbs. Returns
1620 number of bbs removed. Insert vop phis if UPDATE_VOPS. */
1621
1622 static int
1623 apply_clusters (bool update_vops)
1624 {
1625 basic_block bb1, bb2;
1626 bb_cluster c;
1627 unsigned int i, j;
1628 bitmap_iterator bj;
1629 int nr_bbs_removed = 0;
1630
1631 for (i = 0; i < VEC_length (bb_cluster, all_clusters); ++i)
1632 {
1633 c = VEC_index (bb_cluster, all_clusters, i);
1634 if (c == NULL)
1635 continue;
1636
1637 bb2 = c->rep_bb;
1638 bitmap_set_bit (update_bbs, bb2->index);
1639
1640 bitmap_clear_bit (c->bbs, bb2->index);
1641 EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
1642 {
1643 bb1 = BASIC_BLOCK (j);
1644 bitmap_clear_bit (update_bbs, bb1->index);
1645
1646 replace_block_by (bb1, bb2, update_vops);
1647 nr_bbs_removed++;
1648 }
1649 }
1650
1651 return nr_bbs_removed;
1652 }
1653
1654 /* Resets debug statement STMT if it has uses that are not dominated by their
1655 defs. */
1656
1657 static void
1658 update_debug_stmt (gimple stmt)
1659 {
1660 use_operand_p use_p;
1661 ssa_op_iter oi;
1662 basic_block bbdef, bbuse;
1663 gimple def_stmt;
1664 tree name;
1665
1666 if (!gimple_debug_bind_p (stmt))
1667 return;
1668
1669 bbuse = gimple_bb (stmt);
1670 FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
1671 {
1672 name = USE_FROM_PTR (use_p);
1673 gcc_assert (TREE_CODE (name) == SSA_NAME);
1674
1675 def_stmt = SSA_NAME_DEF_STMT (name);
1676 gcc_assert (def_stmt != NULL);
1677
1678 bbdef = gimple_bb (def_stmt);
1679 if (bbdef == NULL || bbuse == bbdef
1680 || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
1681 continue;
1682
1683 gimple_debug_bind_reset_value (stmt);
1684 update_stmt (stmt);
1685 }
1686 }
1687
1688 /* Resets all debug statements that have uses that are not
1689 dominated by their defs. */
1690
1691 static void
1692 update_debug_stmts (void)
1693 {
1694 basic_block bb;
1695 bitmap_iterator bi;
1696 unsigned int i;
1697
1698 if (!MAY_HAVE_DEBUG_STMTS)
1699 return;
1700
1701 EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
1702 {
1703 gimple stmt;
1704 gimple_stmt_iterator gsi;
1705
1706 bb = BASIC_BLOCK (i);
1707 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1708 {
1709 stmt = gsi_stmt (gsi);
1710 if (!is_gimple_debug (stmt))
1711 continue;
1712 update_debug_stmt (stmt);
1713 }
1714 }
1715 }
1716
1717 /* Runs tail merge optimization. */
1718
1719 unsigned int
1720 tail_merge_optimize (unsigned int todo)
1721 {
1722 int nr_bbs_removed_total = 0;
1723 int nr_bbs_removed;
1724 bool loop_entered = false;
1725 int iteration_nr = 0;
1726 bool update_vops = !symbol_marked_for_renaming (gimple_vop (cfun));
1727 int max_iterations = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_ITERATIONS);
1728
1729 if (!flag_tree_tail_merge || max_iterations == 0)
1730 return 0;
1731
1732 timevar_push (TV_TREE_TAIL_MERGE);
1733
1734 calculate_dominance_info (CDI_DOMINATORS);
1735 init_worklist ();
1736
1737 while (!VEC_empty (same_succ, worklist))
1738 {
1739 if (!loop_entered)
1740 {
1741 loop_entered = true;
1742 alloc_cluster_vectors ();
1743 update_bbs = BITMAP_ALLOC (NULL);
1744 }
1745 else
1746 reset_cluster_vectors ();
1747
1748 iteration_nr++;
1749 if (dump_file && (dump_flags & TDF_DETAILS))
1750 fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
1751
1752 find_clusters ();
1753 gcc_assert (VEC_empty (same_succ, worklist));
1754 if (VEC_empty (bb_cluster, all_clusters))
1755 break;
1756
1757 nr_bbs_removed = apply_clusters (update_vops);
1758 nr_bbs_removed_total += nr_bbs_removed;
1759 if (nr_bbs_removed == 0)
1760 break;
1761
1762 purge_bbs ();
1763
1764 if (iteration_nr == max_iterations)
1765 break;
1766
1767 update_worklist ();
1768 }
1769
1770 if (dump_file && (dump_flags & TDF_DETAILS))
1771 fprintf (dump_file, "htab collision / search: %f\n",
1772 htab_collisions (same_succ_htab));
1773
1774 if (nr_bbs_removed_total > 0)
1775 {
1776 update_debug_stmts ();
1777
1778 if (dump_file && (dump_flags & TDF_DETAILS))
1779 {
1780 fprintf (dump_file, "Before TODOs.\n");
1781 dump_function_to_file (current_function_decl, dump_file, dump_flags);
1782 }
1783
1784 todo |= (TODO_verify_ssa | TODO_verify_stmts | TODO_verify_flow
1785 | TODO_dump_func);
1786 }
1787
1788 delete_worklist ();
1789 if (loop_entered)
1790 {
1791 delete_cluster_vectors ();
1792 BITMAP_FREE (update_bbs);
1793 }
1794
1795 timevar_pop (TV_TREE_TAIL_MERGE);
1796
1797 return todo;
1798 }