xref: /dflybsd-src/contrib/gcc-4.7/gcc/domwalk.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Generic dominator tree walker
2*e4b17023SJohn Marino    Copyright (C) 2003, 2004, 2005, 2007, 2008, 2010 Free Software Foundation,
3*e4b17023SJohn Marino    Inc.
4*e4b17023SJohn Marino    Contributed by Diego Novillo <dnovillo@redhat.com>
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino 
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
9*e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
10*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino any later version.
12*e4b17023SJohn Marino 
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*e4b17023SJohn Marino GNU General Public License for more details.
17*e4b17023SJohn Marino 
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
21*e4b17023SJohn Marino 
22*e4b17023SJohn Marino #include "config.h"
23*e4b17023SJohn Marino #include "system.h"
24*e4b17023SJohn Marino #include "coretypes.h"
25*e4b17023SJohn Marino #include "tm.h"
26*e4b17023SJohn Marino #include "basic-block.h"
27*e4b17023SJohn Marino #include "domwalk.h"
28*e4b17023SJohn Marino #include "sbitmap.h"
29*e4b17023SJohn Marino 
30*e4b17023SJohn Marino /* This file implements a generic walker for dominator trees.
31*e4b17023SJohn Marino 
32*e4b17023SJohn Marino   To understand the dominator walker one must first have a grasp of dominators,
33*e4b17023SJohn Marino   immediate dominators and the dominator tree.
34*e4b17023SJohn Marino 
35*e4b17023SJohn Marino   Dominators
36*e4b17023SJohn Marino     A block B1 is said to dominate B2 if every path from the entry to B2 must
37*e4b17023SJohn Marino     pass through B1.  Given the dominance relationship, we can proceed to
38*e4b17023SJohn Marino     compute immediate dominators.  Note it is not important whether or not
39*e4b17023SJohn Marino     our definition allows a block to dominate itself.
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino   Immediate Dominators:
42*e4b17023SJohn Marino     Every block in the CFG has no more than one immediate dominator.  The
43*e4b17023SJohn Marino     immediate dominator of block BB must dominate BB and must not dominate
44*e4b17023SJohn Marino     any other dominator of BB and must not be BB itself.
45*e4b17023SJohn Marino 
46*e4b17023SJohn Marino   Dominator tree:
47*e4b17023SJohn Marino     If we then construct a tree where each node is a basic block and there
48*e4b17023SJohn Marino     is an edge from each block's immediate dominator to the block itself, then
49*e4b17023SJohn Marino     we have a dominator tree.
50*e4b17023SJohn Marino 
51*e4b17023SJohn Marino 
52*e4b17023SJohn Marino   [ Note this walker can also walk the post-dominator tree, which is
53*e4b17023SJohn Marino     defined in a similar manner.  i.e., block B1 is said to post-dominate
54*e4b17023SJohn Marino     block B2 if all paths from B2 to the exit block must pass through
55*e4b17023SJohn Marino     B1.  ]
56*e4b17023SJohn Marino 
57*e4b17023SJohn Marino   For example, given the CFG
58*e4b17023SJohn Marino 
59*e4b17023SJohn Marino                    1
60*e4b17023SJohn Marino                    |
61*e4b17023SJohn Marino                    2
62*e4b17023SJohn Marino                   / \
63*e4b17023SJohn Marino                  3   4
64*e4b17023SJohn Marino                     / \
65*e4b17023SJohn Marino        +---------->5   6
66*e4b17023SJohn Marino        |          / \ /
67*e4b17023SJohn Marino        |    +--->8   7
68*e4b17023SJohn Marino        |    |   /    |
69*e4b17023SJohn Marino        |    +--9    11
70*e4b17023SJohn Marino        |      /      |
71*e4b17023SJohn Marino        +--- 10 ---> 12
72*e4b17023SJohn Marino 
73*e4b17023SJohn Marino 
74*e4b17023SJohn Marino   We have a dominator tree which looks like
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino                    1
77*e4b17023SJohn Marino                    |
78*e4b17023SJohn Marino                    2
79*e4b17023SJohn Marino                   / \
80*e4b17023SJohn Marino                  /   \
81*e4b17023SJohn Marino                 3     4
82*e4b17023SJohn Marino                    / / \ \
83*e4b17023SJohn Marino                    | | | |
84*e4b17023SJohn Marino                    5 6 7 12
85*e4b17023SJohn Marino                    |   |
86*e4b17023SJohn Marino                    8   11
87*e4b17023SJohn Marino                    |
88*e4b17023SJohn Marino                    9
89*e4b17023SJohn Marino                    |
90*e4b17023SJohn Marino                   10
91*e4b17023SJohn Marino 
92*e4b17023SJohn Marino 
93*e4b17023SJohn Marino 
94*e4b17023SJohn Marino   The dominator tree is the basis for a number of analysis, transformation
95*e4b17023SJohn Marino   and optimization algorithms that operate on a semi-global basis.
96*e4b17023SJohn Marino 
97*e4b17023SJohn Marino   The dominator walker is a generic routine which visits blocks in the CFG
98*e4b17023SJohn Marino   via a depth first search of the dominator tree.  In the example above
99*e4b17023SJohn Marino   the dominator walker might visit blocks in the following order
100*e4b17023SJohn Marino   1, 2, 3, 4, 5, 8, 9, 10, 6, 7, 11, 12.
101*e4b17023SJohn Marino 
102*e4b17023SJohn Marino   The dominator walker has a number of callbacks to perform actions
103*e4b17023SJohn Marino   during the walk of the dominator tree.  There are two callbacks
104*e4b17023SJohn Marino   which walk statements, one before visiting the dominator children,
105*e4b17023SJohn Marino   one after visiting the dominator children.  There is a callback
106*e4b17023SJohn Marino   before and after each statement walk callback.  In addition, the
107*e4b17023SJohn Marino   dominator walker manages allocation/deallocation of data structures
108*e4b17023SJohn Marino   which are local to each block visited.
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino   The dominator walker is meant to provide a generic means to build a pass
111*e4b17023SJohn Marino   which can analyze or transform/optimize a function based on walking
112*e4b17023SJohn Marino   the dominator tree.  One simply fills in the dominator walker data
113*e4b17023SJohn Marino   structure with the appropriate callbacks and calls the walker.
114*e4b17023SJohn Marino 
115*e4b17023SJohn Marino   We currently use the dominator walker to prune the set of variables
116*e4b17023SJohn Marino   which might need PHI nodes (which can greatly improve compile-time
117*e4b17023SJohn Marino   performance in some cases).
118*e4b17023SJohn Marino 
119*e4b17023SJohn Marino   We also use the dominator walker to rewrite the function into SSA form
120*e4b17023SJohn Marino   which reduces code duplication since the rewriting phase is inherently
121*e4b17023SJohn Marino   a walk of the dominator tree.
122*e4b17023SJohn Marino 
123*e4b17023SJohn Marino   And (of course), we use the dominator walker to drive our dominator
124*e4b17023SJohn Marino   optimizer, which is a semi-global optimizer.
125*e4b17023SJohn Marino 
126*e4b17023SJohn Marino   TODO:
127*e4b17023SJohn Marino 
128*e4b17023SJohn Marino     Walking statements is based on the block statement iterator abstraction,
129*e4b17023SJohn Marino     which is currently an abstraction over walking tree statements.  Thus
130*e4b17023SJohn Marino     the dominator walker is currently only useful for trees.  */
131*e4b17023SJohn Marino 
132*e4b17023SJohn Marino /* Recursively walk the dominator tree.
133*e4b17023SJohn Marino 
134*e4b17023SJohn Marino    WALK_DATA contains a set of callbacks to perform pass-specific
135*e4b17023SJohn Marino    actions during the dominator walk as well as a stack of block local
136*e4b17023SJohn Marino    data maintained during the dominator walk.
137*e4b17023SJohn Marino 
138*e4b17023SJohn Marino    BB is the basic block we are currently visiting.  */
139*e4b17023SJohn Marino 
140*e4b17023SJohn Marino void
walk_dominator_tree(struct dom_walk_data * walk_data,basic_block bb)141*e4b17023SJohn Marino walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb)
142*e4b17023SJohn Marino {
143*e4b17023SJohn Marino   void *bd = NULL;
144*e4b17023SJohn Marino   basic_block dest;
145*e4b17023SJohn Marino   basic_block *worklist = XNEWVEC (basic_block, n_basic_blocks * 2);
146*e4b17023SJohn Marino   int sp = 0;
147*e4b17023SJohn Marino   sbitmap visited = sbitmap_alloc (last_basic_block + 1);
148*e4b17023SJohn Marino   sbitmap_zero (visited);
149*e4b17023SJohn Marino   SET_BIT (visited, ENTRY_BLOCK_PTR->index);
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino   while (true)
152*e4b17023SJohn Marino     {
153*e4b17023SJohn Marino       /* Don't worry about unreachable blocks.  */
154*e4b17023SJohn Marino       if (EDGE_COUNT (bb->preds) > 0
155*e4b17023SJohn Marino 	  || bb == ENTRY_BLOCK_PTR
156*e4b17023SJohn Marino 	  || bb == EXIT_BLOCK_PTR)
157*e4b17023SJohn Marino 	{
158*e4b17023SJohn Marino 	  /* Callback to initialize the local data structure.  */
159*e4b17023SJohn Marino 	  if (walk_data->initialize_block_local_data)
160*e4b17023SJohn Marino 	    {
161*e4b17023SJohn Marino 	      bool recycled;
162*e4b17023SJohn Marino 
163*e4b17023SJohn Marino 	      /* First get some local data, reusing any local data
164*e4b17023SJohn Marino 		 pointer we may have saved.  */
165*e4b17023SJohn Marino 	      if (VEC_length (void_p, walk_data->free_block_data) > 0)
166*e4b17023SJohn Marino 		{
167*e4b17023SJohn Marino 		  bd = VEC_pop (void_p, walk_data->free_block_data);
168*e4b17023SJohn Marino 		  recycled = 1;
169*e4b17023SJohn Marino 		}
170*e4b17023SJohn Marino 	      else
171*e4b17023SJohn Marino 		{
172*e4b17023SJohn Marino 		  bd = xcalloc (1, walk_data->block_local_data_size);
173*e4b17023SJohn Marino 		  recycled = 0;
174*e4b17023SJohn Marino 		}
175*e4b17023SJohn Marino 
176*e4b17023SJohn Marino 	      /* Push the local data into the local data stack.  */
177*e4b17023SJohn Marino 	      VEC_safe_push (void_p, heap, walk_data->block_data_stack, bd);
178*e4b17023SJohn Marino 
179*e4b17023SJohn Marino 	      /* Call the initializer.  */
180*e4b17023SJohn Marino 	      walk_data->initialize_block_local_data (walk_data, bb,
181*e4b17023SJohn Marino 						      recycled);
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino 	    }
184*e4b17023SJohn Marino 
185*e4b17023SJohn Marino 	  /* Callback for operations to execute before we have walked the
186*e4b17023SJohn Marino 	     dominator children, but before we walk statements.  */
187*e4b17023SJohn Marino 	  if (walk_data->before_dom_children)
188*e4b17023SJohn Marino 	    (*walk_data->before_dom_children) (walk_data, bb);
189*e4b17023SJohn Marino 
190*e4b17023SJohn Marino 	  SET_BIT (visited, bb->index);
191*e4b17023SJohn Marino 
192*e4b17023SJohn Marino 	  /* Mark the current BB to be popped out of the recursion stack
193*e4b17023SJohn Marino 	     once children are processed.  */
194*e4b17023SJohn Marino 	  worklist[sp++] = bb;
195*e4b17023SJohn Marino 	  worklist[sp++] = NULL;
196*e4b17023SJohn Marino 
197*e4b17023SJohn Marino 	  for (dest = first_dom_son (walk_data->dom_direction, bb);
198*e4b17023SJohn Marino 	       dest; dest = next_dom_son (walk_data->dom_direction, dest))
199*e4b17023SJohn Marino 	    worklist[sp++] = dest;
200*e4b17023SJohn Marino 	}
201*e4b17023SJohn Marino       /* NULL is used to mark pop operations in the recursion stack.  */
202*e4b17023SJohn Marino       while (sp > 0 && !worklist[sp - 1])
203*e4b17023SJohn Marino 	{
204*e4b17023SJohn Marino 	  --sp;
205*e4b17023SJohn Marino 	  bb = worklist[--sp];
206*e4b17023SJohn Marino 
207*e4b17023SJohn Marino 	  /* Callback for operations to execute after we have walked the
208*e4b17023SJohn Marino 	     dominator children, but before we walk statements.  */
209*e4b17023SJohn Marino 	  if (walk_data->after_dom_children)
210*e4b17023SJohn Marino 	    (*walk_data->after_dom_children) (walk_data, bb);
211*e4b17023SJohn Marino 
212*e4b17023SJohn Marino 	  if (walk_data->initialize_block_local_data)
213*e4b17023SJohn Marino 	    {
214*e4b17023SJohn Marino 	      /* And finally pop the record off the block local data stack.  */
215*e4b17023SJohn Marino 	      bd = VEC_pop (void_p, walk_data->block_data_stack);
216*e4b17023SJohn Marino 	      /* And save the block data so that we can re-use it.  */
217*e4b17023SJohn Marino 	      VEC_safe_push (void_p, heap, walk_data->free_block_data, bd);
218*e4b17023SJohn Marino 	    }
219*e4b17023SJohn Marino 	}
220*e4b17023SJohn Marino       if (sp)
221*e4b17023SJohn Marino 	{
222*e4b17023SJohn Marino 	  int spp;
223*e4b17023SJohn Marino 	  spp = sp - 1;
224*e4b17023SJohn Marino 	  if (walk_data->dom_direction == CDI_DOMINATORS)
225*e4b17023SJohn Marino 	    /* Find the dominator son that has all its predecessors
226*e4b17023SJohn Marino 	       visited and continue with that.  */
227*e4b17023SJohn Marino 	    while (1)
228*e4b17023SJohn Marino 	      {
229*e4b17023SJohn Marino 		edge_iterator ei;
230*e4b17023SJohn Marino 		edge e;
231*e4b17023SJohn Marino 		bool found = true;
232*e4b17023SJohn Marino 		bb = worklist[spp];
233*e4b17023SJohn Marino 		FOR_EACH_EDGE (e, ei, bb->preds)
234*e4b17023SJohn Marino 		  {
235*e4b17023SJohn Marino 		    if (!dominated_by_p (CDI_DOMINATORS, e->src, e->dest)
236*e4b17023SJohn Marino 			&& !TEST_BIT (visited, e->src->index))
237*e4b17023SJohn Marino 		      {
238*e4b17023SJohn Marino 			found = false;
239*e4b17023SJohn Marino 			break;
240*e4b17023SJohn Marino 		      }
241*e4b17023SJohn Marino 		  }
242*e4b17023SJohn Marino 		if (found)
243*e4b17023SJohn Marino 		  break;
244*e4b17023SJohn Marino 		/* If we didn't find a dom child with all visited
245*e4b17023SJohn Marino 		   predecessors just use the candidate we were checking.
246*e4b17023SJohn Marino 		   This happens for candidates in irreducible loops.  */
247*e4b17023SJohn Marino 		if (!worklist[spp - 1])
248*e4b17023SJohn Marino 		  break;
249*e4b17023SJohn Marino 		--spp;
250*e4b17023SJohn Marino 	      }
251*e4b17023SJohn Marino 	  bb = worklist[spp];
252*e4b17023SJohn Marino 	  worklist[spp] = worklist[--sp];
253*e4b17023SJohn Marino 	}
254*e4b17023SJohn Marino       else
255*e4b17023SJohn Marino 	break;
256*e4b17023SJohn Marino     }
257*e4b17023SJohn Marino   free (worklist);
258*e4b17023SJohn Marino   sbitmap_free (visited);
259*e4b17023SJohn Marino }
260*e4b17023SJohn Marino 
261*e4b17023SJohn Marino void
init_walk_dominator_tree(struct dom_walk_data * walk_data)262*e4b17023SJohn Marino init_walk_dominator_tree (struct dom_walk_data *walk_data)
263*e4b17023SJohn Marino {
264*e4b17023SJohn Marino   walk_data->free_block_data = NULL;
265*e4b17023SJohn Marino   walk_data->block_data_stack = NULL;
266*e4b17023SJohn Marino }
267*e4b17023SJohn Marino 
268*e4b17023SJohn Marino void
fini_walk_dominator_tree(struct dom_walk_data * walk_data)269*e4b17023SJohn Marino fini_walk_dominator_tree (struct dom_walk_data *walk_data)
270*e4b17023SJohn Marino {
271*e4b17023SJohn Marino   if (walk_data->initialize_block_local_data)
272*e4b17023SJohn Marino     {
273*e4b17023SJohn Marino       while (VEC_length (void_p, walk_data->free_block_data) > 0)
274*e4b17023SJohn Marino 	free (VEC_pop (void_p, walk_data->free_block_data));
275*e4b17023SJohn Marino     }
276*e4b17023SJohn Marino 
277*e4b17023SJohn Marino   VEC_free (void_p, heap, walk_data->free_block_data);
278*e4b17023SJohn Marino   VEC_free (void_p, heap, walk_data->block_data_stack);
279*e4b17023SJohn Marino }
280