OSDN Git Service

* tree-ssa-threadupdate.c (THREAD_TARGET): define.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-threadupdate.c
1 /* Thread edges through blocks and update the control flow and SSA graphs.
2    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation,
3    Inc.
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 "tm.h"
25 #include "tree.h"
26 #include "flags.h"
27 #include "tm_p.h"
28 #include "basic-block.h"
29 #include "output.h"
30 #include "function.h"
31 #include "tree-flow.h"
32 #include "tree-dump.h"
33 #include "tree-pass.h"
34 #include "cfgloop.h"
35
36 /* Given a block B, update the CFG and SSA graph to reflect redirecting
37    one or more in-edges to B to instead reach the destination of an
38    out-edge from B while preserving any side effects in B.
39
40    i.e., given A->B and B->C, change A->B to be A->C yet still preserve the
41    side effects of executing B.
42
43      1. Make a copy of B (including its outgoing edges and statements).  Call
44         the copy B'.  Note B' has no incoming edges or PHIs at this time.
45
46      2. Remove the control statement at the end of B' and all outgoing edges
47         except B'->C.
48
49      3. Add a new argument to each PHI in C with the same value as the existing
50         argument associated with edge B->C.  Associate the new PHI arguments
51         with the edge B'->C.
52
53      4. For each PHI in B, find or create a PHI in B' with an identical
54         PHI_RESULT.  Add an argument to the PHI in B' which has the same
55         value as the PHI in B associated with the edge A->B.  Associate
56         the new argument in the PHI in B' with the edge A->B.
57
58      5. Change the edge A->B to A->B'.
59
60         5a. This automatically deletes any PHI arguments associated with the
61             edge A->B in B.
62
63         5b. This automatically associates each new argument added in step 4
64             with the edge A->B'.
65
66      6. Repeat for other incoming edges into B.
67
68      7. Put the duplicated resources in B and all the B' blocks into SSA form.
69
70    Note that block duplication can be minimized by first collecting the
71    set of unique destination blocks that the incoming edges should
72    be threaded to.
73
74    Block duplication can be further minimized by using B instead of 
75    creating B' for one destination if all edges into B are going to be
76    threaded to a successor of B.  We had code to do this at one time, but
77    I'm not convinced it is correct with the changes to avoid mucking up
78    the loop structure (which may cancel threading requests, thus a block
79    which we thought was going to become unreachable may still be reachable).
80    This code was also going to get ugly with the introduction of the ability
81    for a single jump thread request to bypass multiple blocks. 
82
83    We further reduce the number of edges and statements we create by
84    not copying all the outgoing edges and the control statement in
85    step #1.  We instead create a template block without the outgoing
86    edges and duplicate the template.  */
87
88
89 /* Steps #5 and #6 of the above algorithm are best implemented by walking
90    all the incoming edges which thread to the same destination edge at
91    the same time.  That avoids lots of table lookups to get information
92    for the destination edge.
93
94    To realize that implementation we create a list of incoming edges
95    which thread to the same outgoing edge.  Thus to implement steps
96    #5 and #6 we traverse our hash table of outgoing edge information.
97    For each entry we walk the list of incoming edges which thread to
98    the current outgoing edge.  */
99
100 struct el
101 {
102   edge e;
103   struct el *next;
104 };
105
106 /* Main data structure recording information regarding B's duplicate
107    blocks.  */
108
109 /* We need to efficiently record the unique thread destinations of this
110    block and specific information associated with those destinations.  We
111    may have many incoming edges threaded to the same outgoing edge.  This
112    can be naturally implemented with a hash table.  */
113
114 struct redirection_data
115 {
116   /* A duplicate of B with the trailing control statement removed and which
117      targets a single successor of B.  */
118   basic_block dup_block;
119
120   /* An outgoing edge from B.  DUP_BLOCK will have OUTGOING_EDGE->dest as
121      its single successor.  */
122   edge outgoing_edge;
123
124   /* A list of incoming edges which we want to thread to
125      OUTGOING_EDGE->dest.  */
126   struct el *incoming_edges;
127 };
128
129 /* Main data structure to hold information for duplicates of BB.  */
130 static htab_t redirection_data;
131
132 /* Data structure of information to pass to hash table traversal routines.  */
133 struct local_info
134 {
135   /* The current block we are working on.  */
136   basic_block bb;
137
138   /* A template copy of BB with no outgoing edges or control statement that
139      we use for creating copies.  */
140   basic_block template_block;
141
142   /* TRUE if we thread one or more jumps, FALSE otherwise.  */
143   bool jumps_threaded;
144 };
145
146 /* Passes which use the jump threading code register jump threading
147    opportunities as they are discovered.  We keep the registered
148    jump threading opportunities in this vector as edge pairs
149    (original_edge, target_edge).  */
150 static VEC(edge,heap) *threaded_edges;
151
152 /* When we start updating the CFG for threading, data necessary for jump
153    threading is attached to the AUX field for the incoming edge.  Use these
154    macros to access the underlying structure attached to the AUX field.  */
155 #define THREAD_TARGET(E) ((edge *)(E)->aux)[0]
156
157 /* Jump threading statistics.  */
158
159 struct thread_stats_d
160 {
161   unsigned long num_threaded_edges;
162 };
163
164 struct thread_stats_d thread_stats;
165
166
167 /* Remove the last statement in block BB if it is a control statement
168    Also remove all outgoing edges except the edge which reaches DEST_BB.
169    If DEST_BB is NULL, then remove all outgoing edges.  */
170
171 static void
172 remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
173 {
174   gimple_stmt_iterator gsi;
175   edge e;
176   edge_iterator ei;
177
178   gsi = gsi_last_bb (bb);
179
180   /* If the duplicate ends with a control statement, then remove it.
181
182      Note that if we are duplicating the template block rather than the
183      original basic block, then the duplicate might not have any real
184      statements in it.  */
185   if (!gsi_end_p (gsi)
186       && gsi_stmt (gsi)
187       && (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
188           || gimple_code (gsi_stmt (gsi)) == GIMPLE_GOTO
189           || gimple_code (gsi_stmt (gsi)) == GIMPLE_SWITCH))
190     gsi_remove (&gsi, true);
191
192   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
193     {
194       if (e->dest != dest_bb)
195         remove_edge (e);
196       else
197         ei_next (&ei);
198     }
199 }
200
201 /* Create a duplicate of BB which only reaches the destination of the edge
202    stored in RD.  Record the duplicate block in RD.  */
203
204 static void
205 create_block_for_threading (basic_block bb, struct redirection_data *rd)
206 {
207   edge_iterator ei;
208   edge e;
209
210   /* We can use the generic block duplication code and simply remove
211      the stuff we do not need.  */
212   rd->dup_block = duplicate_block (bb, NULL, NULL);
213
214   FOR_EACH_EDGE (e, ei, rd->dup_block->succs)
215     e->aux = NULL;
216
217   /* Zero out the profile, since the block is unreachable for now.  */
218   rd->dup_block->frequency = 0;
219   rd->dup_block->count = 0;
220
221   /* The call to duplicate_block will copy everything, including the
222      useless COND_EXPR or SWITCH_EXPR at the end of BB.  We just remove
223      the useless COND_EXPR or SWITCH_EXPR here rather than having a
224      specialized block copier.  We also remove all outgoing edges
225      from the duplicate block.  The appropriate edge will be created
226      later.  */
227   remove_ctrl_stmt_and_useless_edges (rd->dup_block, NULL);
228 }
229
230 /* Hashing and equality routines for our hash table.  */
231 static hashval_t
232 redirection_data_hash (const void *p)
233 {
234   edge e = ((const struct redirection_data *)p)->outgoing_edge;
235   return e->dest->index;
236 }
237
238 static int
239 redirection_data_eq (const void *p1, const void *p2)
240 {
241   edge e1 = ((const struct redirection_data *)p1)->outgoing_edge;
242   edge e2 = ((const struct redirection_data *)p2)->outgoing_edge;
243
244   return e1 == e2;
245 }
246
247 /* Given an outgoing edge E lookup and return its entry in our hash table.
248
249    If INSERT is true, then we insert the entry into the hash table if
250    it is not already present.  INCOMING_EDGE is added to the list of incoming
251    edges associated with E in the hash table.  */
252
253 static struct redirection_data *
254 lookup_redirection_data (edge e, edge incoming_edge, enum insert_option insert)
255 {
256   void **slot;
257   struct redirection_data *elt;
258
259  /* Build a hash table element so we can see if E is already
260      in the table.  */
261   elt = XNEW (struct redirection_data);
262   elt->outgoing_edge = e;
263   elt->dup_block = NULL;
264   elt->incoming_edges = NULL;
265
266   slot = htab_find_slot (redirection_data, elt, insert);
267
268   /* This will only happen if INSERT is false and the entry is not
269      in the hash table.  */
270   if (slot == NULL)
271     {
272       free (elt);
273       return NULL;
274     }
275
276   /* This will only happen if E was not in the hash table and
277      INSERT is true.  */
278   if (*slot == NULL)
279     {
280       *slot = (void *)elt;
281       elt->incoming_edges = XNEW (struct el);
282       elt->incoming_edges->e = incoming_edge;
283       elt->incoming_edges->next = NULL;
284       return elt;
285     }
286   /* E was in the hash table.  */
287   else
288     {
289       /* Free ELT as we do not need it anymore, we will extract the
290          relevant entry from the hash table itself.  */
291       free (elt);
292
293       /* Get the entry stored in the hash table.  */
294       elt = (struct redirection_data *) *slot;
295
296       /* If insertion was requested, then we need to add INCOMING_EDGE
297          to the list of incoming edges associated with E.  */
298       if (insert)
299         {
300           struct el *el = XNEW (struct el);
301           el->next = elt->incoming_edges;
302           el->e = incoming_edge;
303           elt->incoming_edges = el;
304         }
305
306       return elt;
307     }
308 }
309
310 /* Given a duplicate block and its single destination (both stored
311    in RD).  Create an edge between the duplicate and its single
312    destination.
313
314    Add an additional argument to any PHI nodes at the single
315    destination.  */
316
317 static void
318 create_edge_and_update_destination_phis (struct redirection_data *rd,
319                                          basic_block bb)
320 {
321   edge e = make_edge (bb, rd->outgoing_edge->dest, EDGE_FALLTHRU);
322   gimple_stmt_iterator gsi;
323
324   rescan_loop_exit (e, true, false);
325   e->probability = REG_BR_PROB_BASE;
326   e->count = bb->count;
327
328   if (rd->outgoing_edge->aux)
329     {
330       e->aux = (edge *) XNEWVEC (edge, 1);
331       THREAD_TARGET(e) = THREAD_TARGET (rd->outgoing_edge);
332     }
333   else
334     {
335       e->aux = NULL;
336     }
337
338   /* If there are any PHI nodes at the destination of the outgoing edge
339      from the duplicate block, then we will need to add a new argument
340      to them.  The argument should have the same value as the argument
341      associated with the outgoing edge stored in RD.  */
342   for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
343     {
344       gimple phi = gsi_stmt (gsi);
345       source_location locus;
346       int indx = rd->outgoing_edge->dest_idx;
347
348       locus = gimple_phi_arg_location (phi, indx);
349       add_phi_arg (phi, gimple_phi_arg_def (phi, indx), e, locus);
350     }
351 }
352
353 /* Hash table traversal callback routine to create duplicate blocks.  */
354
355 static int
356 create_duplicates (void **slot, void *data)
357 {
358   struct redirection_data *rd = (struct redirection_data *) *slot;
359   struct local_info *local_info = (struct local_info *)data;
360
361   /* Create a template block if we have not done so already.  Otherwise
362      use the template to create a new block.  */
363   if (local_info->template_block == NULL)
364     {
365       create_block_for_threading (local_info->bb, rd);
366       local_info->template_block = rd->dup_block;
367
368       /* We do not create any outgoing edges for the template.  We will
369          take care of that in a later traversal.  That way we do not
370          create edges that are going to just be deleted.  */
371     }
372   else
373     {
374       create_block_for_threading (local_info->template_block, rd);
375
376       /* Go ahead and wire up outgoing edges and update PHIs for the duplicate
377          block.  */
378       create_edge_and_update_destination_phis (rd, rd->dup_block);
379     }
380
381   /* Keep walking the hash table.  */
382   return 1;
383 }
384
385 /* We did not create any outgoing edges for the template block during
386    block creation.  This hash table traversal callback creates the
387    outgoing edge for the template block.  */
388
389 static int
390 fixup_template_block (void **slot, void *data)
391 {
392   struct redirection_data *rd = (struct redirection_data *) *slot;
393   struct local_info *local_info = (struct local_info *)data;
394
395   /* If this is the template block, then create its outgoing edges
396      and halt the hash table traversal.  */
397   if (rd->dup_block && rd->dup_block == local_info->template_block)
398     {
399       create_edge_and_update_destination_phis (rd, rd->dup_block);
400       return 0;
401     }
402
403   return 1;
404 }
405
406 /* Hash table traversal callback to redirect each incoming edge
407    associated with this hash table element to its new destination.  */
408
409 static int
410 redirect_edges (void **slot, void *data)
411 {
412   struct redirection_data *rd = (struct redirection_data *) *slot;
413   struct local_info *local_info = (struct local_info *)data;
414   struct el *next, *el;
415
416   /* Walk over all the incoming edges associated associated with this
417      hash table entry.  */
418   for (el = rd->incoming_edges; el; el = next)
419     {
420       edge e = el->e;
421
422       /* Go ahead and free this element from the list.  Doing this now
423          avoids the need for another list walk when we destroy the hash
424          table.  */
425       next = el->next;
426       free (el);
427
428       thread_stats.num_threaded_edges++;
429
430       if (rd->dup_block)
431         {
432           edge e2;
433
434           if (dump_file && (dump_flags & TDF_DETAILS))
435             fprintf (dump_file, "  Threaded jump %d --> %d to %d\n",
436                      e->src->index, e->dest->index, rd->dup_block->index);
437
438           rd->dup_block->count += e->count;
439           rd->dup_block->frequency += EDGE_FREQUENCY (e);
440           EDGE_SUCC (rd->dup_block, 0)->count += e->count;
441           /* Redirect the incoming edge to the appropriate duplicate
442              block.  */
443           e2 = redirect_edge_and_branch (e, rd->dup_block);
444           gcc_assert (e == e2);
445           flush_pending_stmts (e2);
446         }
447
448       /* Go ahead and clear E->aux.  It's not needed anymore and failure
449          to clear it will cause all kinds of unpleasant problems later.  */
450       free (e->aux);
451       e->aux = NULL;
452
453     }
454
455   /* Indicate that we actually threaded one or more jumps.  */
456   if (rd->incoming_edges)
457     local_info->jumps_threaded = true;
458
459   return 1;
460 }
461
462 /* Return true if this block has no executable statements other than
463    a simple ctrl flow instruction.  When the number of outgoing edges
464    is one, this is equivalent to a "forwarder" block.  */
465
466 static bool
467 redirection_block_p (basic_block bb)
468 {
469   gimple_stmt_iterator gsi;
470
471   /* Advance to the first executable statement.  */
472   gsi = gsi_start_bb (bb);
473   while (!gsi_end_p (gsi)
474          && (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL
475              || is_gimple_debug (gsi_stmt (gsi))
476              || gimple_nop_p (gsi_stmt (gsi))))
477     gsi_next (&gsi);
478
479   /* Check if this is an empty block.  */
480   if (gsi_end_p (gsi))
481     return true;
482
483   /* Test that we've reached the terminating control statement.  */
484   return gsi_stmt (gsi)
485          && (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
486              || gimple_code (gsi_stmt (gsi)) == GIMPLE_GOTO
487              || gimple_code (gsi_stmt (gsi)) == GIMPLE_SWITCH);
488 }
489
490 /* BB is a block which ends with a COND_EXPR or SWITCH_EXPR and when BB
491    is reached via one or more specific incoming edges, we know which
492    outgoing edge from BB will be traversed.
493
494    We want to redirect those incoming edges to the target of the
495    appropriate outgoing edge.  Doing so avoids a conditional branch
496    and may expose new optimization opportunities.  Note that we have
497    to update dominator tree and SSA graph after such changes.
498
499    The key to keeping the SSA graph update manageable is to duplicate
500    the side effects occurring in BB so that those side effects still
501    occur on the paths which bypass BB after redirecting edges.
502
503    We accomplish this by creating duplicates of BB and arranging for
504    the duplicates to unconditionally pass control to one specific
505    successor of BB.  We then revector the incoming edges into BB to
506    the appropriate duplicate of BB.
507
508    If NOLOOP_ONLY is true, we only perform the threading as long as it
509    does not affect the structure of the loops in a nontrivial way.  */
510
511 static bool
512 thread_block (basic_block bb, bool noloop_only)
513 {
514   /* E is an incoming edge into BB that we may or may not want to
515      redirect to a duplicate of BB.  */
516   edge e, e2;
517   edge_iterator ei;
518   struct local_info local_info;
519   struct loop *loop = bb->loop_father;
520
521   /* To avoid scanning a linear array for the element we need we instead
522      use a hash table.  For normal code there should be no noticeable
523      difference.  However, if we have a block with a large number of
524      incoming and outgoing edges such linear searches can get expensive.  */
525   redirection_data = htab_create (EDGE_COUNT (bb->succs),
526                                   redirection_data_hash,
527                                   redirection_data_eq,
528                                   free);
529
530   /* If we thread the latch of the loop to its exit, the loop ceases to
531      exist.  Make sure we do not restrict ourselves in order to preserve
532      this loop.  */
533   if (loop->header == bb)
534     {
535       e = loop_latch_edge (loop);
536
537       if (e->aux)
538         e2 = THREAD_TARGET (e);
539       else
540         e2 = NULL;
541
542       if (e2 && loop_exit_edge_p (loop, e2))
543         {
544           loop->header = NULL;
545           loop->latch = NULL;
546         }
547     }
548
549   /* Record each unique threaded destination into a hash table for
550      efficient lookups.  */
551   FOR_EACH_EDGE (e, ei, bb->preds)
552     {
553       if (e->aux == NULL)
554         continue;
555
556       e2 = THREAD_TARGET (e);
557
558       if (!e2
559           /* If NOLOOP_ONLY is true, we only allow threading through the
560              header of a loop to exit edges.  */
561           || (noloop_only
562               && bb == bb->loop_father->header
563               && (!loop_exit_edge_p (bb->loop_father, e2))))
564         continue;
565
566       if (e->dest == e2->src)
567         update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e),
568                                          e->count, THREAD_TARGET (e));
569
570       /* Insert the outgoing edge into the hash table if it is not
571          already in the hash table.  */
572       lookup_redirection_data (e2, e, INSERT);
573     }
574
575   /* We do not update dominance info.  */
576   free_dominance_info (CDI_DOMINATORS);
577
578   /* Now create duplicates of BB.
579
580      Note that for a block with a high outgoing degree we can waste
581      a lot of time and memory creating and destroying useless edges.
582
583      So we first duplicate BB and remove the control structure at the
584      tail of the duplicate as well as all outgoing edges from the
585      duplicate.  We then use that duplicate block as a template for
586      the rest of the duplicates.  */
587   local_info.template_block = NULL;
588   local_info.bb = bb;
589   local_info.jumps_threaded = false;
590   htab_traverse (redirection_data, create_duplicates, &local_info);
591
592   /* The template does not have an outgoing edge.  Create that outgoing
593      edge and update PHI nodes as the edge's target as necessary.
594
595      We do this after creating all the duplicates to avoid creating
596      unnecessary edges.  */
597   htab_traverse (redirection_data, fixup_template_block, &local_info);
598
599   /* The hash table traversals above created the duplicate blocks (and the
600      statements within the duplicate blocks).  This loop creates PHI nodes for
601      the duplicated blocks and redirects the incoming edges into BB to reach
602      the duplicates of BB.  */
603   htab_traverse (redirection_data, redirect_edges, &local_info);
604
605   /* Done with this block.  Clear REDIRECTION_DATA.  */
606   htab_delete (redirection_data);
607   redirection_data = NULL;
608
609   /* Indicate to our caller whether or not any jumps were threaded.  */
610   return local_info.jumps_threaded;
611 }
612
613 /* Threads edge E through E->dest to the edge THREAD_TARGET (E).  Returns the
614    copy of E->dest created during threading, or E->dest if it was not necessary
615    to copy it (E is its single predecessor).  */
616
617 static basic_block
618 thread_single_edge (edge e)
619 {
620   basic_block bb = e->dest;
621   edge eto = THREAD_TARGET (e);
622   struct redirection_data rd;
623
624   free (e->aux);
625   e->aux = NULL;
626
627   thread_stats.num_threaded_edges++;
628
629   if (single_pred_p (bb))
630     {
631       /* If BB has just a single predecessor, we should only remove the
632          control statements at its end, and successors except for ETO.  */
633       remove_ctrl_stmt_and_useless_edges (bb, eto->dest);
634
635       /* And fixup the flags on the single remaining edge.  */
636       eto->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE | EDGE_ABNORMAL);
637       eto->flags |= EDGE_FALLTHRU;
638
639       return bb;
640     }
641
642   /* Otherwise, we need to create a copy.  */
643   if (e->dest == eto->src)
644     update_bb_profile_for_threading (bb, EDGE_FREQUENCY (e), e->count, eto);
645
646   rd.outgoing_edge = eto;
647
648   create_block_for_threading (bb, &rd);
649   create_edge_and_update_destination_phis (&rd, rd.dup_block);
650
651   if (dump_file && (dump_flags & TDF_DETAILS))
652     fprintf (dump_file, "  Threaded jump %d --> %d to %d\n",
653              e->src->index, e->dest->index, rd.dup_block->index);
654
655   rd.dup_block->count = e->count;
656   rd.dup_block->frequency = EDGE_FREQUENCY (e);
657   single_succ_edge (rd.dup_block)->count = e->count;
658   redirect_edge_and_branch (e, rd.dup_block);
659   flush_pending_stmts (e);
660
661   return rd.dup_block;
662 }
663
664 /* Callback for dfs_enumerate_from.  Returns true if BB is different
665    from STOP and DBDS_CE_STOP.  */
666
667 static basic_block dbds_ce_stop;
668 static bool
669 dbds_continue_enumeration_p (const_basic_block bb, const void *stop)
670 {
671   return (bb != (const_basic_block) stop
672           && bb != dbds_ce_stop);
673 }
674
675 /* Evaluates the dominance relationship of latch of the LOOP and BB, and
676    returns the state.  */
677
678 enum bb_dom_status
679 {
680   /* BB does not dominate latch of the LOOP.  */
681   DOMST_NONDOMINATING,
682   /* The LOOP is broken (there is no path from the header to its latch.  */
683   DOMST_LOOP_BROKEN,
684   /* BB dominates the latch of the LOOP.  */
685   DOMST_DOMINATING
686 };
687
688 static enum bb_dom_status
689 determine_bb_domination_status (struct loop *loop, basic_block bb)
690 {
691   basic_block *bblocks;
692   unsigned nblocks, i;
693   bool bb_reachable = false;
694   edge_iterator ei;
695   edge e;
696
697   /* This function assumes BB is a successor of LOOP->header.
698      If that is not the case return DOMST_NONDOMINATING which
699      is always safe.  */
700     {
701       bool ok = false;
702
703       FOR_EACH_EDGE (e, ei, bb->preds)
704         {
705           if (e->src == loop->header)
706             {
707               ok = true;
708               break;
709             }
710         }
711
712       if (!ok)
713         return DOMST_NONDOMINATING;
714     }
715
716   if (bb == loop->latch)
717     return DOMST_DOMINATING;
718
719   /* Check that BB dominates LOOP->latch, and that it is back-reachable
720      from it.  */
721
722   bblocks = XCNEWVEC (basic_block, loop->num_nodes);
723   dbds_ce_stop = loop->header;
724   nblocks = dfs_enumerate_from (loop->latch, 1, dbds_continue_enumeration_p,
725                                 bblocks, loop->num_nodes, bb);
726   for (i = 0; i < nblocks; i++)
727     FOR_EACH_EDGE (e, ei, bblocks[i]->preds)
728       {
729         if (e->src == loop->header)
730           {
731             free (bblocks);
732             return DOMST_NONDOMINATING;
733           }
734         if (e->src == bb)
735           bb_reachable = true;
736       }
737
738   free (bblocks);
739   return (bb_reachable ? DOMST_DOMINATING : DOMST_LOOP_BROKEN);
740 }
741
742 /* Thread jumps through the header of LOOP.  Returns true if cfg changes.
743    If MAY_PEEL_LOOP_HEADERS is false, we avoid threading from entry edges
744    to the inside of the loop.  */
745
746 static bool
747 thread_through_loop_header (struct loop *loop, bool may_peel_loop_headers)
748 {
749   basic_block header = loop->header;
750   edge e, tgt_edge, latch = loop_latch_edge (loop);
751   edge_iterator ei;
752   basic_block tgt_bb, atgt_bb;
753   enum bb_dom_status domst;
754
755   /* We have already threaded through headers to exits, so all the threading
756      requests now are to the inside of the loop.  We need to avoid creating
757      irreducible regions (i.e., loops with more than one entry block), and
758      also loop with several latch edges, or new subloops of the loop (although
759      there are cases where it might be appropriate, it is difficult to decide,
760      and doing it wrongly may confuse other optimizers).
761
762      We could handle more general cases here.  However, the intention is to
763      preserve some information about the loop, which is impossible if its
764      structure changes significantly, in a way that is not well understood.
765      Thus we only handle few important special cases, in which also updating
766      of the loop-carried information should be feasible:
767
768      1) Propagation of latch edge to a block that dominates the latch block
769         of a loop.  This aims to handle the following idiom:
770
771         first = 1;
772         while (1)
773           {
774             if (first)
775               initialize;
776             first = 0;
777             body;
778           }
779
780         After threading the latch edge, this becomes
781
782         first = 1;
783         if (first)
784           initialize;
785         while (1)
786           {
787             first = 0;
788             body;
789           }
790
791         The original header of the loop is moved out of it, and we may thread
792         the remaining edges through it without further constraints.
793
794      2) All entry edges are propagated to a single basic block that dominates
795         the latch block of the loop.  This aims to handle the following idiom
796         (normally created for "for" loops):
797
798         i = 0;
799         while (1)
800           {
801             if (i >= 100)
802               break;
803             body;
804             i++;
805           }
806
807         This becomes
808
809         i = 0;
810         while (1)
811           {
812             body;
813             i++;
814             if (i >= 100)
815               break;
816           }
817      */
818
819   /* Threading through the header won't improve the code if the header has just
820      one successor.  */
821   if (single_succ_p (header))
822     goto fail;
823
824   if (latch->aux)
825     {
826       tgt_edge = THREAD_TARGET (latch);
827       tgt_bb = tgt_edge->dest;
828     }
829   else if (!may_peel_loop_headers
830            && !redirection_block_p (loop->header))
831     goto fail;
832   else
833     {
834       tgt_bb = NULL;
835       tgt_edge = NULL;
836       FOR_EACH_EDGE (e, ei, header->preds)
837         {
838           if (!e->aux)
839             {
840               if (e == latch)
841                 continue;
842
843               /* If latch is not threaded, and there is a header
844                  edge that is not threaded, we would create loop
845                  with multiple entries.  */
846               goto fail;
847             }
848
849           tgt_edge = THREAD_TARGET (e);
850           atgt_bb = tgt_edge->dest;
851           if (!tgt_bb)
852             tgt_bb = atgt_bb;
853           /* Two targets of threading would make us create loop
854              with multiple entries.  */
855           else if (tgt_bb != atgt_bb)
856             goto fail;
857         }
858
859       if (!tgt_bb)
860         {
861           /* There are no threading requests.  */
862           return false;
863         }
864
865       /* Redirecting to empty loop latch is useless.  */
866       if (tgt_bb == loop->latch
867           && empty_block_p (loop->latch))
868         goto fail;
869     }
870
871   /* The target block must dominate the loop latch, otherwise we would be
872      creating a subloop.  */
873   domst = determine_bb_domination_status (loop, tgt_bb);
874   if (domst == DOMST_NONDOMINATING)
875     goto fail;
876   if (domst == DOMST_LOOP_BROKEN)
877     {
878       /* If the loop ceased to exist, mark it as such, and thread through its
879          original header.  */
880       loop->header = NULL;
881       loop->latch = NULL;
882       return thread_block (header, false);
883     }
884
885   if (tgt_bb->loop_father->header == tgt_bb)
886     {
887       /* If the target of the threading is a header of a subloop, we need
888          to create a preheader for it, so that the headers of the two loops
889          do not merge.  */
890       if (EDGE_COUNT (tgt_bb->preds) > 2)
891         {
892           tgt_bb = create_preheader (tgt_bb->loop_father, 0);
893           gcc_assert (tgt_bb != NULL);
894         }
895       else
896         tgt_bb = split_edge (tgt_edge);
897     }
898
899   if (latch->aux)
900     {
901       /* First handle the case latch edge is redirected.  */
902       loop->latch = thread_single_edge (latch);
903       gcc_assert (single_succ (loop->latch) == tgt_bb);
904       loop->header = tgt_bb;
905
906       /* Thread the remaining edges through the former header.  */
907       thread_block (header, false);
908     }
909   else
910     {
911       basic_block new_preheader;
912
913       /* Now consider the case entry edges are redirected to the new entry
914          block.  Remember one entry edge, so that we can find the new
915          preheader (its destination after threading).  */
916       FOR_EACH_EDGE (e, ei, header->preds)
917         {
918           if (e->aux)
919             break;
920         }
921
922       /* The duplicate of the header is the new preheader of the loop.  Ensure
923          that it is placed correctly in the loop hierarchy.  */
924       set_loop_copy (loop, loop_outer (loop));
925
926       thread_block (header, false);
927       set_loop_copy (loop, NULL);
928       new_preheader = e->dest;
929
930       /* Create the new latch block.  This is always necessary, as the latch
931          must have only a single successor, but the original header had at
932          least two successors.  */
933       loop->latch = NULL;
934       mfb_kj_edge = single_succ_edge (new_preheader);
935       loop->header = mfb_kj_edge->dest;
936       latch = make_forwarder_block (tgt_bb, mfb_keep_just, NULL);
937       loop->header = latch->dest;
938       loop->latch = latch->src;
939     }
940
941   return true;
942
943 fail:
944   /* We failed to thread anything.  Cancel the requests.  */
945   FOR_EACH_EDGE (e, ei, header->preds)
946     {
947       free (e->aux);
948       e->aux = NULL;
949     }
950   return false;
951 }
952
953 /* Walk through the registered jump threads and convert them into a
954    form convenient for this pass.
955
956    Any block which has incoming edges threaded to outgoing edges
957    will have its entry in THREADED_BLOCK set.
958
959    Any threaded edge will have its new outgoing edge stored in the
960    original edge's AUX field.
961
962    This form avoids the need to walk all the edges in the CFG to
963    discover blocks which need processing and avoids unnecessary
964    hash table lookups to map from threaded edge to new target.  */
965
966 static void
967 mark_threaded_blocks (bitmap threaded_blocks)
968 {
969   unsigned int i;
970   bitmap_iterator bi;
971   bitmap tmp = BITMAP_ALLOC (NULL);
972   basic_block bb;
973   edge e;
974   edge_iterator ei;
975
976   for (i = 0; i < VEC_length (edge, threaded_edges); i += 2)
977     {
978       edge e = VEC_index (edge, threaded_edges, i);
979       edge *x = (edge *) XNEWVEC (edge, 1);
980
981       x[0] = VEC_index (edge, threaded_edges, i + 1);
982       e->aux = x;
983       bitmap_set_bit (tmp, e->dest->index);
984     }
985
986   /* If optimizing for size, only thread through block if we don't have
987      to duplicate it or it's an otherwise empty redirection block.  */
988   if (optimize_function_for_size_p (cfun))
989     {
990       EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
991         {
992           bb = BASIC_BLOCK (i);
993           if (EDGE_COUNT (bb->preds) > 1
994               && !redirection_block_p (bb))
995             {
996               FOR_EACH_EDGE (e, ei, bb->preds)
997                 {
998                   free (e->aux);
999                   e->aux = NULL;
1000                 }
1001             }
1002           else
1003             bitmap_set_bit (threaded_blocks, i);
1004         }
1005     }
1006   else
1007     bitmap_copy (threaded_blocks, tmp);
1008
1009   BITMAP_FREE(tmp);
1010 }
1011
1012
1013 /* Walk through all blocks and thread incoming edges to the appropriate
1014    outgoing edge for each edge pair recorded in THREADED_EDGES.
1015
1016    It is the caller's responsibility to fix the dominance information
1017    and rewrite duplicated SSA_NAMEs back into SSA form.
1018
1019    If MAY_PEEL_LOOP_HEADERS is false, we avoid threading edges through
1020    loop headers if it does not simplify the loop.
1021
1022    Returns true if one or more edges were threaded, false otherwise.  */
1023
1024 bool
1025 thread_through_all_blocks (bool may_peel_loop_headers)
1026 {
1027   bool retval = false;
1028   unsigned int i;
1029   bitmap_iterator bi;
1030   bitmap threaded_blocks;
1031   struct loop *loop;
1032   loop_iterator li;
1033
1034   /* We must know about loops in order to preserve them.  */
1035   gcc_assert (current_loops != NULL);
1036
1037   if (threaded_edges == NULL)
1038     return false;
1039
1040   threaded_blocks = BITMAP_ALLOC (NULL);
1041   memset (&thread_stats, 0, sizeof (thread_stats));
1042
1043   mark_threaded_blocks (threaded_blocks);
1044
1045   initialize_original_copy_tables ();
1046
1047   /* First perform the threading requests that do not affect
1048      loop structure.  */
1049   EXECUTE_IF_SET_IN_BITMAP (threaded_blocks, 0, i, bi)
1050     {
1051       basic_block bb = BASIC_BLOCK (i);
1052
1053       if (EDGE_COUNT (bb->preds) > 0)
1054         retval |= thread_block (bb, true);
1055     }
1056
1057   /* Then perform the threading through loop headers.  We start with the
1058      innermost loop, so that the changes in cfg we perform won't affect
1059      further threading.  */
1060   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1061     {
1062       if (!loop->header
1063           || !bitmap_bit_p (threaded_blocks, loop->header->index))
1064         continue;
1065
1066       retval |= thread_through_loop_header (loop, may_peel_loop_headers);
1067     }
1068
1069   statistics_counter_event (cfun, "Jumps threaded",
1070                             thread_stats.num_threaded_edges);
1071
1072   free_original_copy_tables ();
1073
1074   BITMAP_FREE (threaded_blocks);
1075   threaded_blocks = NULL;
1076   VEC_free (edge, heap, threaded_edges);
1077   threaded_edges = NULL;
1078
1079   if (retval)
1080     loops_state_set (LOOPS_NEED_FIXUP);
1081
1082   return retval;
1083 }
1084
1085 /* Register a jump threading opportunity.  We queue up all the jump
1086    threading opportunities discovered by a pass and update the CFG
1087    and SSA form all at once.
1088
1089    E is the edge we can thread, E2 is the new target edge, i.e., we
1090    are effectively recording that E->dest can be changed to E2->dest
1091    after fixing the SSA graph.  */
1092
1093 void
1094 register_jump_thread (edge e, edge e2)
1095 {
1096   /* This can occur if we're jumping to a constant address or
1097      or something similar.  Just get out now.  */
1098   if (e2 == NULL)
1099     return;
1100
1101   if (threaded_edges == NULL)
1102     threaded_edges = VEC_alloc (edge, heap, 15);
1103
1104   if (dump_file && (dump_flags & TDF_DETAILS)
1105       && e->dest != e2->src)
1106     fprintf (dump_file,
1107              "  Registering jump thread around one or more intermediate blocks\n");
1108
1109   VEC_safe_push (edge, heap, threaded_edges, e);
1110   VEC_safe_push (edge, heap, threaded_edges, e2);
1111 }