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