discriminator support. Ported from google/gcc-4_9 branch
[platform/upstream/gcc49.git] / gcc / cfghooks.c
1 /* Hooks for cfg representation specific functions.
2    Copyright (C) 2003-2014 Free Software Foundation, Inc.
3    Contributed by Sebastian Pop <s.pop@laposte.net>
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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "dumpfile.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "basic-block.h"
29 #include "tree-ssa.h"
30 #include "timevar.h"
31 #include "diagnostic-core.h"
32 #include "cfgloop.h"
33 #include "pretty-print.h"
34
35 /* A pointer to one of the hooks containers.  */
36 static struct cfg_hooks *cfg_hooks;
37
38 /* Initialization of functions specific to the rtl IR.  */
39 void
40 rtl_register_cfg_hooks (void)
41 {
42   cfg_hooks = &rtl_cfg_hooks;
43 }
44
45 /* Initialization of functions specific to the rtl IR.  */
46 void
47 cfg_layout_rtl_register_cfg_hooks (void)
48 {
49   cfg_hooks = &cfg_layout_rtl_cfg_hooks;
50 }
51
52 /* Initialization of functions specific to the tree IR.  */
53
54 void
55 gimple_register_cfg_hooks (void)
56 {
57   cfg_hooks = &gimple_cfg_hooks;
58 }
59
60 struct cfg_hooks
61 get_cfg_hooks (void)
62 {
63   return *cfg_hooks;
64 }
65
66 void
67 set_cfg_hooks (struct cfg_hooks new_cfg_hooks)
68 {
69   *cfg_hooks = new_cfg_hooks;
70 }
71
72 /* Returns current ir type.  */
73
74 enum ir_type
75 current_ir_type (void)
76 {
77   if (cfg_hooks == &gimple_cfg_hooks)
78     return IR_GIMPLE;
79   else if (cfg_hooks == &rtl_cfg_hooks)
80     return IR_RTL_CFGRTL;
81   else if (cfg_hooks == &cfg_layout_rtl_cfg_hooks)
82     return IR_RTL_CFGLAYOUT;
83   else
84     gcc_unreachable ();
85 }
86
87 /* Verify the CFG consistency.
88
89    Currently it does following: checks edge and basic block list correctness
90    and calls into IL dependent checking then.  */
91
92 DEBUG_FUNCTION void
93 verify_flow_info (void)
94 {
95   size_t *edge_checksum;
96   int err = 0;
97   basic_block bb, last_bb_seen;
98   basic_block *last_visited;
99
100   timevar_push (TV_CFG_VERIFY);
101   last_visited = XCNEWVEC (basic_block, last_basic_block_for_fn (cfun));
102   edge_checksum = XCNEWVEC (size_t, last_basic_block_for_fn (cfun));
103
104   /* Check bb chain & numbers.  */
105   last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun);
106   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
107     {
108       if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
109           && bb != BASIC_BLOCK_FOR_FN (cfun, bb->index))
110         {
111           error ("bb %d on wrong place", bb->index);
112           err = 1;
113         }
114
115       if (bb->prev_bb != last_bb_seen)
116         {
117           error ("prev_bb of %d should be %d, not %d",
118                  bb->index, last_bb_seen->index, bb->prev_bb->index);
119           err = 1;
120         }
121
122       last_bb_seen = bb;
123     }
124
125   /* Now check the basic blocks (boundaries etc.) */
126   FOR_EACH_BB_REVERSE_FN (bb, cfun)
127     {
128       int n_fallthru = 0;
129       edge e;
130       edge_iterator ei;
131
132       if (bb->loop_father != NULL && current_loops == NULL)
133         {
134           error ("verify_flow_info: Block %i has loop_father, but there are no loops",
135                  bb->index);
136           err = 1;
137         }
138       if (bb->loop_father == NULL && current_loops != NULL)
139         {
140           error ("verify_flow_info: Block %i lacks loop_father", bb->index);
141           err = 1;
142         }
143
144       if (bb->count < 0)
145         {
146           error ("verify_flow_info: Wrong count of block %i %i",
147                  bb->index, (int)bb->count);
148           err = 1;
149         }
150       if (bb->frequency < 0)
151         {
152           error ("verify_flow_info: Wrong frequency of block %i %i",
153                  bb->index, bb->frequency);
154           err = 1;
155         }
156       FOR_EACH_EDGE (e, ei, bb->succs)
157         {
158           if (last_visited [e->dest->index] == bb)
159             {
160               error ("verify_flow_info: Duplicate edge %i->%i",
161                      e->src->index, e->dest->index);
162               err = 1;
163             }
164           if (e->probability < 0 || e->probability > REG_BR_PROB_BASE)
165             {
166               error ("verify_flow_info: Wrong probability of edge %i->%i %i",
167                      e->src->index, e->dest->index, e->probability);
168               err = 1;
169             }
170           if (e->count < 0)
171             {
172               error ("verify_flow_info: Wrong count of edge %i->%i %i",
173                      e->src->index, e->dest->index, (int)e->count);
174               err = 1;
175             }
176
177           last_visited [e->dest->index] = bb;
178
179           if (e->flags & EDGE_FALLTHRU)
180             n_fallthru++;
181
182           if (e->src != bb)
183             {
184               error ("verify_flow_info: Basic block %d succ edge is corrupted",
185                      bb->index);
186               fprintf (stderr, "Predecessor: ");
187               dump_edge_info (stderr, e, TDF_DETAILS, 0);
188               fprintf (stderr, "\nSuccessor: ");
189               dump_edge_info (stderr, e, TDF_DETAILS, 1);
190               fprintf (stderr, "\n");
191               err = 1;
192             }
193
194           edge_checksum[e->dest->index] += (size_t) e;
195         }
196       if (n_fallthru > 1)
197         {
198           error ("wrong amount of branch edges after unconditional jump %i", bb->index);
199           err = 1;
200         }
201
202       FOR_EACH_EDGE (e, ei, bb->preds)
203         {
204           if (e->dest != bb)
205             {
206               error ("basic block %d pred edge is corrupted", bb->index);
207               fputs ("Predecessor: ", stderr);
208               dump_edge_info (stderr, e, TDF_DETAILS, 0);
209               fputs ("\nSuccessor: ", stderr);
210               dump_edge_info (stderr, e, TDF_DETAILS, 1);
211               fputc ('\n', stderr);
212               err = 1;
213             }
214
215           if (ei.index != e->dest_idx)
216             {
217               error ("basic block %d pred edge is corrupted", bb->index);
218               error ("its dest_idx should be %d, not %d",
219                      ei.index, e->dest_idx);
220               fputs ("Predecessor: ", stderr);
221               dump_edge_info (stderr, e, TDF_DETAILS, 0);
222               fputs ("\nSuccessor: ", stderr);
223               dump_edge_info (stderr, e, TDF_DETAILS, 1);
224               fputc ('\n', stderr);
225               err = 1;
226             }
227
228           edge_checksum[e->dest->index] -= (size_t) e;
229         }
230     }
231
232   /* Complete edge checksumming for ENTRY and EXIT.  */
233   {
234     edge e;
235     edge_iterator ei;
236
237     FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
238       edge_checksum[e->dest->index] += (size_t) e;
239
240     FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
241       edge_checksum[e->dest->index] -= (size_t) e;
242   }
243
244   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
245     if (edge_checksum[bb->index])
246       {
247         error ("basic block %i edge lists are corrupted", bb->index);
248         err = 1;
249       }
250
251   last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun);
252
253   /* Clean up.  */
254   free (last_visited);
255   free (edge_checksum);
256
257   if (cfg_hooks->verify_flow_info)
258     err |= cfg_hooks->verify_flow_info ();
259   if (err)
260     internal_error ("verify_flow_info failed");
261   timevar_pop (TV_CFG_VERIFY);
262 }
263
264 /* Print out one basic block BB to file OUTF.  INDENT is printed at the
265    start of each new line.  FLAGS are the TDF_* flags in dumpfile.h.
266
267    This function takes care of the purely graph related information.
268    The cfg hook for the active representation should dump
269    representation-specific information.  */
270
271 void
272 dump_bb (FILE *outf, basic_block bb, int indent, int flags)
273 {
274   if (flags & TDF_BLOCKS)
275     dump_bb_info (outf, bb, indent, flags, true, false);
276   if (cfg_hooks->dump_bb)
277     cfg_hooks->dump_bb (outf, bb, indent, flags);
278   if (flags & TDF_BLOCKS)
279     dump_bb_info (outf, bb, indent, flags, false, true);
280   fputc ('\n', outf);
281 }
282
283 DEBUG_FUNCTION void
284 debug (basic_block_def &ref)
285 {
286   dump_bb (stderr, &ref, 0, 0);
287 }
288
289 DEBUG_FUNCTION void
290 debug (basic_block_def *ptr)
291 {
292   if (ptr)
293     debug (*ptr);
294   else
295     fprintf (stderr, "<nil>\n");
296 }
297
298
299 /* Dumps basic block BB to pretty-printer PP, for use as a label of
300    a DOT graph record-node.  The implementation of this hook is
301    expected to write the label to the stream that is attached to PP.
302    Field separators between instructions are pipe characters printed
303    verbatim.  Instructions should be written with some characters
304    escaped, using pp_write_text_as_dot_label_to_stream().  */
305
306 void
307 dump_bb_for_graph (pretty_printer *pp, basic_block bb)
308 {
309   if (!cfg_hooks->dump_bb_for_graph)
310     internal_error ("%s does not support dump_bb_for_graph",
311                     cfg_hooks->name);
312   if (bb->count)
313     pp_printf (pp, "COUNT:" HOST_WIDEST_INT_PRINT_DEC, bb->count);
314   pp_printf (pp, " FREQ:%i |", bb->frequency);
315   pp_write_text_to_stream (pp);
316   if (!(dump_flags & TDF_SLIM))
317     cfg_hooks->dump_bb_for_graph (pp, bb);
318 }
319
320 /* Dump the complete CFG to FILE.  FLAGS are the TDF_* flags in dumpfile.h.  */
321 void
322 dump_flow_info (FILE *file, int flags)
323 {
324   basic_block bb;
325
326   fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks_for_fn (cfun),
327            n_edges_for_fn (cfun));
328   FOR_ALL_BB_FN (bb, cfun)
329     dump_bb (file, bb, 0, flags);
330
331   putc ('\n', file);
332 }
333
334 /* Like above, but dump to stderr.  To be called from debuggers.  */
335 void debug_flow_info (void);
336 DEBUG_FUNCTION void
337 debug_flow_info (void)
338 {
339   dump_flow_info (stderr, TDF_DETAILS);
340 }
341
342 /* Redirect edge E to the given basic block DEST and update underlying program
343    representation.  Returns edge representing redirected branch (that may not
344    be equivalent to E in the case of duplicate edges being removed) or NULL
345    if edge is not easily redirectable for whatever reason.  */
346
347 edge
348 redirect_edge_and_branch (edge e, basic_block dest)
349 {
350   edge ret;
351
352   if (!cfg_hooks->redirect_edge_and_branch)
353     internal_error ("%s does not support redirect_edge_and_branch",
354                     cfg_hooks->name);
355
356   ret = cfg_hooks->redirect_edge_and_branch (e, dest);
357
358   /* If RET != E, then either the redirection failed, or the edge E
359      was removed since RET already lead to the same destination.  */
360   if (current_loops != NULL && ret == e)
361     rescan_loop_exit (e, false, false);
362
363   return ret;
364 }
365
366 /* Returns true if it is possible to remove the edge E by redirecting it
367    to the destination of the other edge going from its source.  */
368
369 bool
370 can_remove_branch_p (const_edge e)
371 {
372   if (!cfg_hooks->can_remove_branch_p)
373     internal_error ("%s does not support can_remove_branch_p",
374                     cfg_hooks->name);
375
376   if (EDGE_COUNT (e->src->succs) != 2)
377     return false;
378
379   return cfg_hooks->can_remove_branch_p (e);
380 }
381
382 /* Removes E, by redirecting it to the destination of the other edge going
383    from its source.  Can_remove_branch_p must be true for E, hence this
384    operation cannot fail.  */
385
386 void
387 remove_branch (edge e)
388 {
389   edge other;
390   basic_block src = e->src;
391   int irr;
392
393   gcc_assert (EDGE_COUNT (e->src->succs) == 2);
394
395   other = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
396   irr = other->flags & EDGE_IRREDUCIBLE_LOOP;
397
398   e = redirect_edge_and_branch (e, other->dest);
399   gcc_assert (e != NULL);
400
401   e->flags &= ~EDGE_IRREDUCIBLE_LOOP;
402   e->flags |= irr;
403 }
404
405 /* Removes edge E from cfg.  Unlike remove_branch, it does not update IL.  */
406
407 void
408 remove_edge (edge e)
409 {
410   if (current_loops != NULL)
411     rescan_loop_exit (e, false, true);
412
413   /* This is probably not needed, but it doesn't hurt.  */
414   /* FIXME: This should be called via a remove_edge hook.  */
415   if (current_ir_type () == IR_GIMPLE)
416     redirect_edge_var_map_clear (e);
417
418   remove_edge_raw (e);
419 }
420
421 /* Like redirect_edge_succ but avoid possible duplicate edge.  */
422
423 edge
424 redirect_edge_succ_nodup (edge e, basic_block new_succ)
425 {
426   edge s;
427
428   s = find_edge (e->src, new_succ);
429   if (s && s != e)
430     {
431       s->flags |= e->flags;
432       s->probability += e->probability;
433       if (s->probability > REG_BR_PROB_BASE)
434         s->probability = REG_BR_PROB_BASE;
435       s->count += e->count;
436       /* FIXME: This should be called via a hook and only for IR_GIMPLE.  */
437       redirect_edge_var_map_dup (s, e);
438       remove_edge (e);
439       e = s;
440     }
441   else
442     redirect_edge_succ (e, new_succ);
443
444   return e;
445 }
446
447 /* Redirect the edge E to basic block DEST even if it requires creating
448    of a new basic block; then it returns the newly created basic block.
449    Aborts when redirection is impossible.  */
450
451 basic_block
452 redirect_edge_and_branch_force (edge e, basic_block dest)
453 {
454   basic_block ret, src = e->src;
455
456   if (!cfg_hooks->redirect_edge_and_branch_force)
457     internal_error ("%s does not support redirect_edge_and_branch_force",
458                     cfg_hooks->name);
459
460   if (current_loops != NULL)
461     rescan_loop_exit (e, false, true);
462
463   ret = cfg_hooks->redirect_edge_and_branch_force (e, dest);
464
465   if (ret != NULL && dom_info_available_p (CDI_DOMINATORS))
466     set_immediate_dominator (CDI_DOMINATORS, ret, src);
467
468   if (current_loops != NULL)
469     {
470       if (ret != NULL)
471         {
472           struct loop *loop
473             = find_common_loop (single_pred (ret)->loop_father,
474                                 single_succ (ret)->loop_father);
475           add_bb_to_loop (ret, loop);
476         }
477       else if (find_edge (src, dest) == e)
478         rescan_loop_exit (e, true, false);
479     }
480
481   return ret;
482 }
483
484 /* Splits basic block BB after the specified instruction I (but at least after
485    the labels).  If I is NULL, splits just after labels.  The newly created edge
486    is returned.  The new basic block is created just after the old one.  */
487
488 edge
489 split_block (basic_block bb, void *i)
490 {
491   basic_block new_bb;
492   edge res;
493
494   if (!cfg_hooks->split_block)
495     internal_error ("%s does not support split_block", cfg_hooks->name);
496
497   new_bb = cfg_hooks->split_block (bb, i);
498   if (!new_bb)
499     return NULL;
500
501   new_bb->count = bb->count;
502   new_bb->frequency = bb->frequency;
503
504   if (dom_info_available_p (CDI_DOMINATORS))
505     {
506       redirect_immediate_dominators (CDI_DOMINATORS, bb, new_bb);
507       set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
508     }
509
510   if (current_loops != NULL)
511     {
512       edge_iterator ei;
513       edge e;
514       add_bb_to_loop (new_bb, bb->loop_father);
515       /* Identify all loops bb may have been the latch of and adjust them.  */
516       FOR_EACH_EDGE (e, ei, new_bb->succs)
517         if (e->dest->loop_father->latch == bb)
518           e->dest->loop_father->latch = new_bb;
519     }
520
521   res = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
522
523   if (bb->flags & BB_IRREDUCIBLE_LOOP)
524     {
525       new_bb->flags |= BB_IRREDUCIBLE_LOOP;
526       res->flags |= EDGE_IRREDUCIBLE_LOOP;
527     }
528
529   return res;
530 }
531
532 /* Splits block BB just after labels.  The newly created edge is returned.  */
533
534 edge
535 split_block_after_labels (basic_block bb)
536 {
537   return split_block (bb, NULL);
538 }
539
540 /* Moves block BB immediately after block AFTER.  Returns false if the
541    movement was impossible.  */
542
543 bool
544 move_block_after (basic_block bb, basic_block after)
545 {
546   bool ret;
547
548   if (!cfg_hooks->move_block_after)
549     internal_error ("%s does not support move_block_after", cfg_hooks->name);
550
551   ret = cfg_hooks->move_block_after (bb, after);
552
553   return ret;
554 }
555
556 /* Deletes the basic block BB.  */
557
558 void
559 delete_basic_block (basic_block bb)
560 {
561   if (!cfg_hooks->delete_basic_block)
562     internal_error ("%s does not support delete_basic_block", cfg_hooks->name);
563
564   cfg_hooks->delete_basic_block (bb);
565
566   if (current_loops != NULL)
567     {
568       struct loop *loop = bb->loop_father;
569
570       /* If we remove the header or the latch of a loop, mark the loop for
571          removal by setting its header and latch to NULL.  */
572       if (loop->latch == bb
573           || loop->header == bb)
574         {
575           loop->header = NULL;
576           loop->latch = NULL;
577           loops_state_set (LOOPS_NEED_FIXUP);
578         }
579
580       remove_bb_from_loops (bb);
581     }
582
583   /* Remove the edges into and out of this block.  Note that there may
584      indeed be edges in, if we are removing an unreachable loop.  */
585   while (EDGE_COUNT (bb->preds) != 0)
586     remove_edge (EDGE_PRED (bb, 0));
587   while (EDGE_COUNT (bb->succs) != 0)
588     remove_edge (EDGE_SUCC (bb, 0));
589
590   if (dom_info_available_p (CDI_DOMINATORS))
591     delete_from_dominance_info (CDI_DOMINATORS, bb);
592   if (dom_info_available_p (CDI_POST_DOMINATORS))
593     delete_from_dominance_info (CDI_POST_DOMINATORS, bb);
594
595   /* Remove the basic block from the array.  */
596   expunge_block (bb);
597 }
598
599 /* Splits edge E and returns the newly created basic block.  */
600
601 basic_block
602 split_edge (edge e)
603 {
604   basic_block ret;
605   gcov_type count = e->count;
606   int freq = EDGE_FREQUENCY (e);
607   edge f;
608   bool irr = (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
609   struct loop *loop;
610   basic_block src = e->src, dest = e->dest;
611
612   if (!cfg_hooks->split_edge)
613     internal_error ("%s does not support split_edge", cfg_hooks->name);
614
615   if (current_loops != NULL)
616     rescan_loop_exit (e, false, true);
617
618   ret = cfg_hooks->split_edge (e);
619   ret->count = count;
620   ret->frequency = freq;
621   single_succ_edge (ret)->probability = REG_BR_PROB_BASE;
622   single_succ_edge (ret)->count = count;
623
624   if (irr)
625     {
626       ret->flags |= BB_IRREDUCIBLE_LOOP;
627       single_pred_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP;
628       single_succ_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP;
629     }
630
631   if (dom_info_available_p (CDI_DOMINATORS))
632     set_immediate_dominator (CDI_DOMINATORS, ret, single_pred (ret));
633
634   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
635     {
636       /* There are two cases:
637
638          If the immediate dominator of e->dest is not e->src, it
639          remains unchanged.
640
641          If immediate dominator of e->dest is e->src, it may become
642          ret, provided that all other predecessors of e->dest are
643          dominated by e->dest.  */
644
645       if (get_immediate_dominator (CDI_DOMINATORS, single_succ (ret))
646           == single_pred (ret))
647         {
648           edge_iterator ei;
649           FOR_EACH_EDGE (f, ei, single_succ (ret)->preds)
650             {
651               if (f == single_succ_edge (ret))
652                 continue;
653
654               if (!dominated_by_p (CDI_DOMINATORS, f->src,
655                                    single_succ (ret)))
656                 break;
657             }
658
659           if (!f)
660             set_immediate_dominator (CDI_DOMINATORS, single_succ (ret), ret);
661         }
662     }
663
664   if (current_loops != NULL)
665     {
666       loop = find_common_loop (src->loop_father, dest->loop_father);
667       add_bb_to_loop (ret, loop);
668
669       /* If we split the latch edge of loop adjust the latch block.  */
670       if (loop->latch == src
671           && loop->header == dest)
672         loop->latch = ret;
673     }
674
675   return ret;
676 }
677
678 /* Creates a new basic block just after the basic block AFTER.
679    HEAD and END are the first and the last statement belonging
680    to the block.  If both are NULL, an empty block is created.  */
681
682 basic_block
683 create_basic_block (void *head, void *end, basic_block after)
684 {
685   basic_block ret;
686
687   if (!cfg_hooks->create_basic_block)
688     internal_error ("%s does not support create_basic_block", cfg_hooks->name);
689
690   ret = cfg_hooks->create_basic_block (head, end, after);
691
692   if (dom_info_available_p (CDI_DOMINATORS))
693     add_to_dominance_info (CDI_DOMINATORS, ret);
694   if (dom_info_available_p (CDI_POST_DOMINATORS))
695     add_to_dominance_info (CDI_POST_DOMINATORS, ret);
696
697   return ret;
698 }
699
700 /* Creates an empty basic block just after basic block AFTER.  */
701
702 basic_block
703 create_empty_bb (basic_block after)
704 {
705   return create_basic_block (NULL, NULL, after);
706 }
707
708 /* Checks whether we may merge blocks BB1 and BB2.  */
709
710 bool
711 can_merge_blocks_p (basic_block bb1, basic_block bb2)
712 {
713   bool ret;
714
715   if (!cfg_hooks->can_merge_blocks_p)
716     internal_error ("%s does not support can_merge_blocks_p", cfg_hooks->name);
717
718   ret = cfg_hooks->can_merge_blocks_p (bb1, bb2);
719
720   return ret;
721 }
722
723 void
724 predict_edge (edge e, enum br_predictor predictor, int probability)
725 {
726   if (!cfg_hooks->predict_edge)
727     internal_error ("%s does not support predict_edge", cfg_hooks->name);
728
729   cfg_hooks->predict_edge (e, predictor, probability);
730 }
731
732 bool
733 predicted_by_p (const_basic_block bb, enum br_predictor predictor)
734 {
735   if (!cfg_hooks->predict_edge)
736     internal_error ("%s does not support predicted_by_p", cfg_hooks->name);
737
738   return cfg_hooks->predicted_by_p (bb, predictor);
739 }
740
741 /* Merges basic block B into basic block A.  */
742
743 void
744 merge_blocks (basic_block a, basic_block b)
745 {
746   edge e;
747   edge_iterator ei;
748
749   if (!cfg_hooks->merge_blocks)
750     internal_error ("%s does not support merge_blocks", cfg_hooks->name);
751
752   cfg_hooks->merge_blocks (a, b);
753
754   if (current_loops != NULL)
755     {
756       /* If the block we merge into is a loop header do nothing unless ... */
757       if (a->loop_father->header == a)
758         {
759           /* ... we merge two loop headers, in which case we kill
760              the inner loop.  */
761           if (b->loop_father->header == b)
762             {
763               b->loop_father->header = NULL;
764               b->loop_father->latch = NULL;
765               loops_state_set (LOOPS_NEED_FIXUP);
766             }
767         }
768       /* If we merge a loop header into its predecessor, update the loop
769          structure.  */
770       else if (b->loop_father->header == b)
771         {
772           remove_bb_from_loops (a);
773           add_bb_to_loop  (a, b->loop_father);
774           a->loop_father->header = a;
775         }
776       remove_bb_from_loops (b);
777     }
778
779   /* Normally there should only be one successor of A and that is B, but
780      partway though the merge of blocks for conditional_execution we'll
781      be merging a TEST block with THEN and ELSE successors.  Free the
782      whole lot of them and hope the caller knows what they're doing.  */
783
784   while (EDGE_COUNT (a->succs) != 0)
785     remove_edge (EDGE_SUCC (a, 0));
786
787   /* Adjust the edges out of B for the new owner.  */
788   FOR_EACH_EDGE (e, ei, b->succs)
789     {
790       e->src = a;
791       if (current_loops != NULL)
792         {
793           /* If b was a latch, a now is.  */
794           if (e->dest->loop_father->latch == b)
795             e->dest->loop_father->latch = a;
796           rescan_loop_exit (e, true, false);
797         }
798     }
799   a->succs = b->succs;
800   a->flags |= b->flags;
801
802   /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
803   b->preds = b->succs = NULL;
804
805   if (dom_info_available_p (CDI_DOMINATORS))
806     redirect_immediate_dominators (CDI_DOMINATORS, b, a);
807
808   if (dom_info_available_p (CDI_DOMINATORS))
809     delete_from_dominance_info (CDI_DOMINATORS, b);
810   if (dom_info_available_p (CDI_POST_DOMINATORS))
811     delete_from_dominance_info (CDI_POST_DOMINATORS, b);
812
813   expunge_block (b);
814 }
815
816 /* Split BB into entry part and the rest (the rest is the newly created block).
817    Redirect those edges for that REDIRECT_EDGE_P returns true to the entry
818    part.  Returns the edge connecting the entry part to the rest.  */
819
820 edge
821 make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge),
822                       void (*new_bb_cbk) (basic_block))
823 {
824   edge e, fallthru;
825   edge_iterator ei;
826   basic_block dummy, jump;
827   struct loop *loop, *ploop, *cloop;
828
829   if (!cfg_hooks->make_forwarder_block)
830     internal_error ("%s does not support make_forwarder_block",
831                     cfg_hooks->name);
832
833   fallthru = split_block_after_labels (bb);
834   dummy = fallthru->src;
835   bb = fallthru->dest;
836
837   /* Redirect back edges we want to keep.  */
838   for (ei = ei_start (dummy->preds); (e = ei_safe_edge (ei)); )
839     {
840       basic_block e_src;
841
842       if (redirect_edge_p (e))
843         {
844           ei_next (&ei);
845           continue;
846         }
847
848       dummy->frequency -= EDGE_FREQUENCY (e);
849       dummy->count -= e->count;
850       if (dummy->frequency < 0)
851         dummy->frequency = 0;
852       if (dummy->count < 0)
853         dummy->count = 0;
854       fallthru->count -= e->count;
855       if (fallthru->count < 0)
856         fallthru->count = 0;
857
858       e_src = e->src;
859       jump = redirect_edge_and_branch_force (e, bb);
860       if (jump != NULL)
861         {
862           /* If we redirected the loop latch edge, the JUMP block now acts like
863              the new latch of the loop.  */
864           if (current_loops != NULL
865               && dummy->loop_father != NULL
866               && dummy->loop_father->header == dummy
867               && dummy->loop_father->latch == e_src)
868             dummy->loop_father->latch = jump;
869
870           if (new_bb_cbk != NULL)
871             new_bb_cbk (jump);
872         }
873     }
874
875   if (dom_info_available_p (CDI_DOMINATORS))
876     {
877       vec<basic_block> doms_to_fix;
878       doms_to_fix.create (2);
879       doms_to_fix.quick_push (dummy);
880       doms_to_fix.quick_push (bb);
881       iterate_fix_dominators (CDI_DOMINATORS, doms_to_fix, false);
882       doms_to_fix.release ();
883     }
884
885   if (current_loops != NULL)
886     {
887       /* If we do not split a loop header, then both blocks belong to the
888          same loop.  In case we split loop header and do not redirect the
889          latch edge to DUMMY, then DUMMY belongs to the outer loop, and
890          BB becomes the new header.  If latch is not recorded for the loop,
891          we leave this updating on the caller (this may only happen during
892          loop analysis).  */
893       loop = dummy->loop_father;
894       if (loop->header == dummy
895           && loop->latch != NULL
896           && find_edge (loop->latch, dummy) == NULL)
897         {
898           remove_bb_from_loops (dummy);
899           loop->header = bb;
900
901           cloop = loop;
902           FOR_EACH_EDGE (e, ei, dummy->preds)
903             {
904               cloop = find_common_loop (cloop, e->src->loop_father);
905             }
906           add_bb_to_loop (dummy, cloop);
907         }
908
909       /* In case we split loop latch, update it.  */
910       for (ploop = loop; ploop; ploop = loop_outer (ploop))
911         if (ploop->latch == dummy)
912           ploop->latch = bb;
913     }
914
915   cfg_hooks->make_forwarder_block (fallthru);
916
917   return fallthru;
918 }
919
920 /* Try to make the edge fallthru.  */
921
922 void
923 tidy_fallthru_edge (edge e)
924 {
925   if (cfg_hooks->tidy_fallthru_edge)
926     cfg_hooks->tidy_fallthru_edge (e);
927 }
928
929 /* Fix up edges that now fall through, or rather should now fall through
930    but previously required a jump around now deleted blocks.  Simplify
931    the search by only examining blocks numerically adjacent, since this
932    is how they were created.
933
934    ??? This routine is currently RTL specific.  */
935
936 void
937 tidy_fallthru_edges (void)
938 {
939   basic_block b, c;
940
941   if (!cfg_hooks->tidy_fallthru_edge)
942     return;
943
944   if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
945     return;
946
947   FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb,
948                   EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, next_bb)
949     {
950       edge s;
951
952       c = b->next_bb;
953
954       /* We care about simple conditional or unconditional jumps with
955          a single successor.
956
957          If we had a conditional branch to the next instruction when
958          CFG was built, then there will only be one out edge for the
959          block which ended with the conditional branch (since we do
960          not create duplicate edges).
961
962          Furthermore, the edge will be marked as a fallthru because we
963          merge the flags for the duplicate edges.  So we do not want to
964          check that the edge is not a FALLTHRU edge.  */
965
966       if (single_succ_p (b))
967         {
968           s = single_succ_edge (b);
969           if (! (s->flags & EDGE_COMPLEX)
970               && s->dest == c
971               && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
972             tidy_fallthru_edge (s);
973         }
974     }
975 }
976
977 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
978    (and possibly create new basic block) to make edge non-fallthru.
979    Return newly created BB or NULL if none.  */
980
981 basic_block
982 force_nonfallthru (edge e)
983 {
984   basic_block ret, src = e->src;
985
986   if (!cfg_hooks->force_nonfallthru)
987     internal_error ("%s does not support force_nonfallthru",
988                     cfg_hooks->name);
989
990   ret = cfg_hooks->force_nonfallthru (e);
991   if (ret != NULL)
992     {
993       if (dom_info_available_p (CDI_DOMINATORS))
994         set_immediate_dominator (CDI_DOMINATORS, ret, src);
995
996       if (current_loops != NULL)
997         {
998           struct loop *loop
999             = find_common_loop (single_pred (ret)->loop_father,
1000                                 single_succ (ret)->loop_father);
1001           rescan_loop_exit (e, false, true);
1002           add_bb_to_loop (ret, loop);
1003         }
1004     }
1005
1006   return ret;
1007 }
1008
1009 /* Returns true if we can duplicate basic block BB.  */
1010
1011 bool
1012 can_duplicate_block_p (const_basic_block bb)
1013 {
1014   if (!cfg_hooks->can_duplicate_block_p)
1015     internal_error ("%s does not support can_duplicate_block_p",
1016                     cfg_hooks->name);
1017
1018   if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1019     return false;
1020
1021   return cfg_hooks->can_duplicate_block_p (bb);
1022 }
1023
1024 /* Duplicates basic block BB and redirects edge E to it.  Returns the
1025    new basic block.  The new basic block is placed after the basic block
1026    AFTER.  */
1027
1028 basic_block
1029 duplicate_block (basic_block bb, edge e, basic_block after)
1030 {
1031   edge s, n;
1032   basic_block new_bb;
1033   gcov_type new_count = e ? e->count : 0;
1034   edge_iterator ei;
1035
1036   if (!cfg_hooks->duplicate_block)
1037     internal_error ("%s does not support duplicate_block",
1038                     cfg_hooks->name);
1039
1040   if (bb->count < new_count)
1041     new_count = bb->count;
1042
1043   gcc_checking_assert (can_duplicate_block_p (bb));
1044
1045   new_bb = cfg_hooks->duplicate_block (bb);
1046   if (after)
1047     move_block_after (new_bb, after);
1048
1049   new_bb->flags = bb->flags;
1050   FOR_EACH_EDGE (s, ei, bb->succs)
1051     {
1052       /* Since we are creating edges from a new block to successors
1053          of another block (which therefore are known to be disjoint), there
1054          is no need to actually check for duplicated edges.  */
1055       n = unchecked_make_edge (new_bb, s->dest, s->flags);
1056       n->probability = s->probability;
1057       if (e && bb->count)
1058         {
1059           /* Take care for overflows!  */
1060           n->count = s->count * (new_count * 10000 / bb->count) / 10000;
1061           s->count -= n->count;
1062         }
1063       else
1064         n->count = s->count;
1065       n->aux = s->aux;
1066     }
1067
1068   if (e)
1069     {
1070       new_bb->count = new_count;
1071       bb->count -= new_count;
1072
1073       new_bb->frequency = EDGE_FREQUENCY (e);
1074       bb->frequency -= EDGE_FREQUENCY (e);
1075
1076       redirect_edge_and_branch_force (e, new_bb);
1077
1078       if (bb->count < 0)
1079         bb->count = 0;
1080       if (bb->frequency < 0)
1081         bb->frequency = 0;
1082     }
1083   else
1084     {
1085       new_bb->count = bb->count;
1086       new_bb->frequency = bb->frequency;
1087     }
1088
1089   set_bb_original (new_bb, bb);
1090   set_bb_copy (bb, new_bb);
1091
1092   /* Add the new block to the copy of the loop of BB, or directly to the loop
1093      of BB if the loop is not being copied.  */
1094   if (current_loops != NULL)
1095     {
1096       struct loop *cloop = bb->loop_father;
1097       struct loop *copy = get_loop_copy (cloop);
1098       /* If we copied the loop header block but not the loop
1099          we have created a loop with multiple entries.  Ditch the loop,
1100          add the new block to the outer loop and arrange for a fixup.  */
1101       if (!copy
1102           && cloop->header == bb)
1103         {
1104           add_bb_to_loop (new_bb, loop_outer (cloop));
1105           cloop->header = NULL;
1106           cloop->latch = NULL;
1107           loops_state_set (LOOPS_NEED_FIXUP);
1108         }
1109       else
1110         {
1111           add_bb_to_loop (new_bb, copy ? copy : cloop);
1112           /* If we copied the loop latch block but not the loop, adjust
1113              loop state.  */
1114           if (!copy
1115               && cloop->latch == bb)
1116             {
1117               cloop->latch = NULL;
1118               loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
1119             }
1120         }
1121     }
1122
1123   return new_bb;
1124 }
1125
1126 /* Return 1 if BB ends with a call, possibly followed by some
1127    instructions that must stay with the call, 0 otherwise.  */
1128
1129 bool
1130 block_ends_with_call_p (basic_block bb)
1131 {
1132   if (!cfg_hooks->block_ends_with_call_p)
1133     internal_error ("%s does not support block_ends_with_call_p", cfg_hooks->name);
1134
1135   return (cfg_hooks->block_ends_with_call_p) (bb);
1136 }
1137
1138 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
1139
1140 bool
1141 block_ends_with_condjump_p (const_basic_block bb)
1142 {
1143   if (!cfg_hooks->block_ends_with_condjump_p)
1144     internal_error ("%s does not support block_ends_with_condjump_p",
1145                     cfg_hooks->name);
1146
1147   return (cfg_hooks->block_ends_with_condjump_p) (bb);
1148 }
1149
1150 /* Add fake edges to the function exit for any non constant and non noreturn
1151    calls, volatile inline assembly in the bitmap of blocks specified by
1152    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
1153    that were split.
1154
1155    The goal is to expose cases in which entering a basic block does not imply
1156    that all subsequent instructions must be executed.  */
1157
1158 int
1159 flow_call_edges_add (sbitmap blocks)
1160 {
1161   if (!cfg_hooks->flow_call_edges_add)
1162     internal_error ("%s does not support flow_call_edges_add",
1163                     cfg_hooks->name);
1164
1165   return (cfg_hooks->flow_call_edges_add) (blocks);
1166 }
1167
1168 /* This function is called immediately after edge E is added to the
1169    edge vector E->dest->preds.  */
1170
1171 void
1172 execute_on_growing_pred (edge e)
1173 {
1174   if (cfg_hooks->execute_on_growing_pred)
1175     cfg_hooks->execute_on_growing_pred (e);
1176 }
1177
1178 /* This function is called immediately before edge E is removed from
1179    the edge vector E->dest->preds.  */
1180
1181 void
1182 execute_on_shrinking_pred (edge e)
1183 {
1184   if (cfg_hooks->execute_on_shrinking_pred)
1185     cfg_hooks->execute_on_shrinking_pred (e);
1186 }
1187
1188 /* This is used inside loop versioning when we want to insert
1189    stmts/insns on the edges, which have a different behavior
1190    in tree's and in RTL, so we made a CFG hook.  */
1191 void
1192 lv_flush_pending_stmts (edge e)
1193 {
1194   if (cfg_hooks->flush_pending_stmts)
1195     cfg_hooks->flush_pending_stmts (e);
1196 }
1197
1198 /* Loop versioning uses the duplicate_loop_to_header_edge to create
1199    a new version of the loop basic-blocks, the parameters here are
1200    exactly the same as in duplicate_loop_to_header_edge or
1201    tree_duplicate_loop_to_header_edge; while in tree-ssa there is
1202    additional work to maintain ssa information that's why there is
1203    a need to call the tree_duplicate_loop_to_header_edge rather
1204    than duplicate_loop_to_header_edge when we are in tree mode.  */
1205 bool
1206 cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge e,
1207                                         unsigned int ndupl,
1208                                         sbitmap wont_exit, edge orig,
1209                                         vec<edge> *to_remove,
1210                                         int flags)
1211 {
1212   gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_to_header_edge);
1213   return cfg_hooks->cfg_hook_duplicate_loop_to_header_edge (loop, e,
1214                                                             ndupl, wont_exit,
1215                                                             orig, to_remove,
1216                                                             flags);
1217 }
1218
1219 /* Conditional jumps are represented differently in trees and RTL,
1220    this hook takes a basic block that is known to have a cond jump
1221    at its end and extracts the taken and not taken edges out of it
1222    and store it in E1 and E2 respectively.  */
1223 void
1224 extract_cond_bb_edges (basic_block b, edge *e1, edge *e2)
1225 {
1226   gcc_assert (cfg_hooks->extract_cond_bb_edges);
1227   cfg_hooks->extract_cond_bb_edges (b, e1, e2);
1228 }
1229
1230 /* Responsible for updating the ssa info (PHI nodes) on the
1231    new condition basic block that guards the versioned loop.  */
1232 void
1233 lv_adjust_loop_header_phi (basic_block first, basic_block second,
1234                            basic_block new_block, edge e)
1235 {
1236   if (cfg_hooks->lv_adjust_loop_header_phi)
1237     cfg_hooks->lv_adjust_loop_header_phi (first, second, new_block, e);
1238 }
1239
1240 /* Conditions in trees and RTL are different so we need
1241    a different handling when we add the condition to the
1242    versioning code.  */
1243 void
1244 lv_add_condition_to_bb (basic_block first, basic_block second,
1245                         basic_block new_block, void *cond)
1246 {
1247   gcc_assert (cfg_hooks->lv_add_condition_to_bb);
1248   cfg_hooks->lv_add_condition_to_bb (first, second, new_block, cond);
1249 }
1250
1251 /* Checks whether all N blocks in BBS array can be copied.  */
1252 bool
1253 can_copy_bbs_p (basic_block *bbs, unsigned n)
1254 {
1255   unsigned i;
1256   edge e;
1257   int ret = true;
1258
1259   for (i = 0; i < n; i++)
1260     bbs[i]->flags |= BB_DUPLICATED;
1261
1262   for (i = 0; i < n; i++)
1263     {
1264       /* In case we should redirect abnormal edge during duplication, fail.  */
1265       edge_iterator ei;
1266       FOR_EACH_EDGE (e, ei, bbs[i]->succs)
1267         if ((e->flags & EDGE_ABNORMAL)
1268             && (e->dest->flags & BB_DUPLICATED))
1269           {
1270             ret = false;
1271             goto end;
1272           }
1273
1274       if (!can_duplicate_block_p (bbs[i]))
1275         {
1276           ret = false;
1277           break;
1278         }
1279     }
1280
1281 end:
1282   for (i = 0; i < n; i++)
1283     bbs[i]->flags &= ~BB_DUPLICATED;
1284
1285   return ret;
1286 }
1287
1288 /* Duplicates N basic blocks stored in array BBS.  Newly created basic blocks
1289    are placed into array NEW_BBS in the same order.  Edges from basic blocks
1290    in BBS are also duplicated and copies of those that lead into BBS are
1291    redirected to appropriate newly created block.  The function assigns bbs
1292    into loops (copy of basic block bb is assigned to bb->loop_father->copy
1293    loop, so this must be set up correctly in advance)
1294
1295    If UPDATE_DOMINANCE is true then this function updates dominators locally
1296    (LOOPS structure that contains the information about dominators is passed
1297    to enable this), otherwise it does not update the dominator information
1298    and it assumed that the caller will do this, perhaps by destroying and
1299    recreating it instead of trying to do an incremental update like this
1300    function does when update_dominance is true.
1301
1302    BASE is the superloop to that basic block belongs; if its header or latch
1303    is copied, we do not set the new blocks as header or latch.
1304
1305    Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES,
1306    also in the same order.
1307
1308    Newly created basic blocks are put after the basic block AFTER in the
1309    instruction stream, and the order of the blocks in BBS array is preserved.  */
1310
1311 void
1312 copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
1313           edge *edges, unsigned num_edges, edge *new_edges,
1314           struct loop *base, basic_block after, bool update_dominance)
1315 {
1316   unsigned i, j;
1317   basic_block bb, new_bb, dom_bb;
1318   edge e;
1319
1320   /* Duplicate bbs, update dominators, assign bbs to loops.  */
1321   for (i = 0; i < n; i++)
1322     {
1323       /* Duplicate.  */
1324       bb = bbs[i];
1325       new_bb = new_bbs[i] = duplicate_block (bb, NULL, after);
1326       after = new_bb;
1327       bb->flags |= BB_DUPLICATED;
1328       if (bb->loop_father)
1329         {
1330           /* Possibly set loop header.  */
1331           if (bb->loop_father->header == bb && bb->loop_father != base)
1332             new_bb->loop_father->header = new_bb;
1333           /* Or latch.  */
1334           if (bb->loop_father->latch == bb && bb->loop_father != base)
1335             new_bb->loop_father->latch = new_bb;
1336         }
1337     }
1338
1339   /* Set dominators.  */
1340   if (update_dominance)
1341     {
1342       for (i = 0; i < n; i++)
1343         {
1344           bb = bbs[i];
1345           new_bb = new_bbs[i];
1346
1347           dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
1348           if (dom_bb->flags & BB_DUPLICATED)
1349             {
1350               dom_bb = get_bb_copy (dom_bb);
1351               set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
1352             }
1353         }
1354     }
1355
1356   /* Redirect edges.  */
1357   for (j = 0; j < num_edges; j++)
1358     new_edges[j] = NULL;
1359   for (i = 0; i < n; i++)
1360     {
1361       edge_iterator ei;
1362       new_bb = new_bbs[i];
1363       bb = bbs[i];
1364
1365       FOR_EACH_EDGE (e, ei, new_bb->succs)
1366         {
1367           for (j = 0; j < num_edges; j++)
1368             if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest)
1369               new_edges[j] = e;
1370
1371           if (!(e->dest->flags & BB_DUPLICATED))
1372             continue;
1373           redirect_edge_and_branch_force (e, get_bb_copy (e->dest));
1374         }
1375     }
1376
1377   /* Clear information about duplicates.  */
1378   for (i = 0; i < n; i++)
1379     bbs[i]->flags &= ~BB_DUPLICATED;
1380 }
1381
1382 /* Return true if BB contains only labels or non-executable
1383    instructions */
1384 bool
1385 empty_block_p (basic_block bb)
1386 {
1387   gcc_assert (cfg_hooks->empty_block_p);
1388   return cfg_hooks->empty_block_p (bb);
1389 }
1390
1391 /* Split a basic block if it ends with a conditional branch and if
1392    the other part of the block is not empty.  */
1393 basic_block
1394 split_block_before_cond_jump (basic_block bb)
1395 {
1396   gcc_assert (cfg_hooks->split_block_before_cond_jump);
1397   return cfg_hooks->split_block_before_cond_jump (bb);
1398 }
1399
1400 /* Work-horse for passes.c:check_profile_consistency.
1401    Do book-keeping of the CFG for the profile consistency checker.
1402    If AFTER_PASS is 0, do pre-pass accounting, or if AFTER_PASS is 1
1403    then do post-pass accounting.  Store the counting in RECORD.  */
1404
1405 void
1406 account_profile_record (struct profile_record *record, int after_pass)
1407 {
1408   basic_block bb;
1409   edge_iterator ei;
1410   edge e;
1411   int sum;
1412   gcov_type lsum;
1413
1414   FOR_ALL_BB_FN (bb, cfun)
1415    {
1416       if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
1417           && profile_status_for_fn (cfun) != PROFILE_ABSENT)
1418         {
1419           sum = 0;
1420           FOR_EACH_EDGE (e, ei, bb->succs)
1421             sum += e->probability;
1422           if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
1423             record->num_mismatched_freq_out[after_pass]++;
1424           lsum = 0;
1425           FOR_EACH_EDGE (e, ei, bb->succs)
1426             lsum += e->count;
1427           if (EDGE_COUNT (bb->succs)
1428               && (lsum - bb->count > 100 || lsum - bb->count < -100))
1429             record->num_mismatched_count_out[after_pass]++;
1430         }
1431       if (bb != ENTRY_BLOCK_PTR_FOR_FN (cfun)
1432           && profile_status_for_fn (cfun) != PROFILE_ABSENT)
1433         {
1434           sum = 0;
1435           FOR_EACH_EDGE (e, ei, bb->preds)
1436             sum += EDGE_FREQUENCY (e);
1437           if (abs (sum - bb->frequency) > 100
1438               || (MAX (sum, bb->frequency) > 10
1439                   && abs ((sum - bb->frequency) * 100 / (MAX (sum, bb->frequency) + 1)) > 10))
1440             record->num_mismatched_freq_in[after_pass]++;
1441           lsum = 0;
1442           FOR_EACH_EDGE (e, ei, bb->preds)
1443             lsum += e->count;
1444           if (lsum - bb->count > 100 || lsum - bb->count < -100)
1445             record->num_mismatched_count_in[after_pass]++;
1446         }
1447       if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
1448           || bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
1449         continue;
1450       gcc_assert (cfg_hooks->account_profile_record);
1451       cfg_hooks->account_profile_record (bb, after_pass, record);
1452    }
1453 }