tree-ssa-tail-merge.cc revision 1.1 1 1.1 mrg /* Tail merging for gimple.
2 1.1 mrg Copyright (C) 2011-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Tom de Vries (tom (at) codesourcery.com)
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify
8 1.1 mrg it under the terms of the GNU General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
10 1.1 mrg any later version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful,
13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 mrg GNU General Public License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg /* Pass overview.
22 1.1 mrg
23 1.1 mrg
24 1.1 mrg MOTIVATIONAL EXAMPLE
25 1.1 mrg
26 1.1 mrg gimple representation of gcc/testsuite/gcc.dg/pr43864.c at
27 1.1 mrg
28 1.1 mrg hprofStartupp (charD.1 * outputFileNameD.2600, charD.1 * ctxD.2601)
29 1.1 mrg {
30 1.1 mrg struct FILED.1638 * fpD.2605;
31 1.1 mrg charD.1 fileNameD.2604[1000];
32 1.1 mrg intD.0 D.3915;
33 1.1 mrg const charD.1 * restrict outputFileName.0D.3914;
34 1.1 mrg
35 1.1 mrg # BLOCK 2 freq:10000
36 1.1 mrg # PRED: ENTRY [100.0%] (fallthru,exec)
37 1.1 mrg # PT = nonlocal { D.3926 } (restr)
38 1.1 mrg outputFileName.0D.3914_3
39 1.1 mrg = (const charD.1 * restrict) outputFileNameD.2600_2(D);
40 1.1 mrg # .MEMD.3923_13 = VDEF <.MEMD.3923_12(D)>
41 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
42 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
43 1.1 mrg sprintfD.759 (&fileNameD.2604, outputFileName.0D.3914_3);
44 1.1 mrg # .MEMD.3923_14 = VDEF <.MEMD.3923_13>
45 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
46 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
47 1.1 mrg D.3915_4 = accessD.2606 (&fileNameD.2604, 1);
48 1.1 mrg if (D.3915_4 == 0)
49 1.1 mrg goto <bb 3>;
50 1.1 mrg else
51 1.1 mrg goto <bb 4>;
52 1.1 mrg # SUCC: 3 [10.0%] (true,exec) 4 [90.0%] (false,exec)
53 1.1 mrg
54 1.1 mrg # BLOCK 3 freq:1000
55 1.1 mrg # PRED: 2 [10.0%] (true,exec)
56 1.1 mrg # .MEMD.3923_15 = VDEF <.MEMD.3923_14>
57 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
58 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
59 1.1 mrg freeD.898 (ctxD.2601_5(D));
60 1.1 mrg goto <bb 7>;
61 1.1 mrg # SUCC: 7 [100.0%] (fallthru,exec)
62 1.1 mrg
63 1.1 mrg # BLOCK 4 freq:9000
64 1.1 mrg # PRED: 2 [90.0%] (false,exec)
65 1.1 mrg # .MEMD.3923_16 = VDEF <.MEMD.3923_14>
66 1.1 mrg # PT = nonlocal escaped
67 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
68 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
69 1.1 mrg fpD.2605_8 = fopenD.1805 (&fileNameD.2604[0], 0B);
70 1.1 mrg if (fpD.2605_8 == 0B)
71 1.1 mrg goto <bb 5>;
72 1.1 mrg else
73 1.1 mrg goto <bb 6>;
74 1.1 mrg # SUCC: 5 [1.9%] (true,exec) 6 [98.1%] (false,exec)
75 1.1 mrg
76 1.1 mrg # BLOCK 5 freq:173
77 1.1 mrg # PRED: 4 [1.9%] (true,exec)
78 1.1 mrg # .MEMD.3923_17 = VDEF <.MEMD.3923_16>
79 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
80 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
81 1.1 mrg freeD.898 (ctxD.2601_5(D));
82 1.1 mrg goto <bb 7>;
83 1.1 mrg # SUCC: 7 [100.0%] (fallthru,exec)
84 1.1 mrg
85 1.1 mrg # BLOCK 6 freq:8827
86 1.1 mrg # PRED: 4 [98.1%] (false,exec)
87 1.1 mrg # .MEMD.3923_18 = VDEF <.MEMD.3923_16>
88 1.1 mrg # USE = nonlocal null { fileNameD.2604 D.3926 } (restr)
89 1.1 mrg # CLB = nonlocal null { fileNameD.2604 D.3926 } (restr)
90 1.1 mrg fooD.2599 (outputFileNameD.2600_2(D), fpD.2605_8);
91 1.1 mrg # SUCC: 7 [100.0%] (fallthru,exec)
92 1.1 mrg
93 1.1 mrg # BLOCK 7 freq:10000
94 1.1 mrg # PRED: 3 [100.0%] (fallthru,exec) 5 [100.0%] (fallthru,exec)
95 1.1 mrg 6 [100.0%] (fallthru,exec)
96 1.1 mrg # PT = nonlocal null
97 1.1 mrg
98 1.1 mrg # ctxD.2601_1 = PHI <0B(3), 0B(5), ctxD.2601_5(D)(6)>
99 1.1 mrg # .MEMD.3923_11 = PHI <.MEMD.3923_15(3), .MEMD.3923_17(5),
100 1.1 mrg .MEMD.3923_18(6)>
101 1.1 mrg # VUSE <.MEMD.3923_11>
102 1.1 mrg return ctxD.2601_1;
103 1.1 mrg # SUCC: EXIT [100.0%]
104 1.1 mrg }
105 1.1 mrg
106 1.1 mrg bb 3 and bb 5 can be merged. The blocks have different predecessors, but the
107 1.1 mrg same successors, and the same operations.
108 1.1 mrg
109 1.1 mrg
110 1.1 mrg CONTEXT
111 1.1 mrg
112 1.1 mrg A technique called tail merging (or cross jumping) can fix the example
113 1.1 mrg above. For a block, we look for common code at the end (the tail) of the
114 1.1 mrg predecessor blocks, and insert jumps from one block to the other.
115 1.1 mrg The example is a special case for tail merging, in that 2 whole blocks
116 1.1 mrg can be merged, rather than just the end parts of it.
117 1.1 mrg We currently only focus on whole block merging, so in that sense
118 1.1 mrg calling this pass tail merge is a bit of a misnomer.
119 1.1 mrg
120 1.1 mrg We distinguish 2 kinds of situations in which blocks can be merged:
121 1.1 mrg - same operations, same predecessors. The successor edges coming from one
122 1.1 mrg block are redirected to come from the other block.
123 1.1 mrg - same operations, same successors. The predecessor edges entering one block
124 1.1 mrg are redirected to enter the other block. Note that this operation might
125 1.1 mrg involve introducing phi operations.
126 1.1 mrg
127 1.1 mrg For efficient implementation, we would like to value numbers the blocks, and
128 1.1 mrg have a comparison operator that tells us whether the blocks are equal.
129 1.1 mrg Besides being runtime efficient, block value numbering should also abstract
130 1.1 mrg from irrelevant differences in order of operations, much like normal value
131 1.1 mrg numbering abstracts from irrelevant order of operations.
132 1.1 mrg
133 1.1 mrg For the first situation (same_operations, same predecessors), normal value
134 1.1 mrg numbering fits well. We can calculate a block value number based on the
135 1.1 mrg value numbers of the defs and vdefs.
136 1.1 mrg
137 1.1 mrg For the second situation (same operations, same successors), this approach
138 1.1 mrg doesn't work so well. We can illustrate this using the example. The calls
139 1.1 mrg to free use different vdefs: MEMD.3923_16 and MEMD.3923_14, and these will
140 1.1 mrg remain different in value numbering, since they represent different memory
141 1.1 mrg states. So the resulting vdefs of the frees will be different in value
142 1.1 mrg numbering, so the block value numbers will be different.
143 1.1 mrg
144 1.1 mrg The reason why we call the blocks equal is not because they define the same
145 1.1 mrg values, but because uses in the blocks use (possibly different) defs in the
146 1.1 mrg same way. To be able to detect this efficiently, we need to do some kind of
147 1.1 mrg reverse value numbering, meaning number the uses rather than the defs, and
148 1.1 mrg calculate a block value number based on the value number of the uses.
149 1.1 mrg Ideally, a block comparison operator will also indicate which phis are needed
150 1.1 mrg to merge the blocks.
151 1.1 mrg
152 1.1 mrg For the moment, we don't do block value numbering, but we do insn-by-insn
153 1.1 mrg matching, using scc value numbers to match operations with results, and
154 1.1 mrg structural comparison otherwise, while ignoring vop mismatches.
155 1.1 mrg
156 1.1 mrg
157 1.1 mrg IMPLEMENTATION
158 1.1 mrg
159 1.1 mrg 1. The pass first determines all groups of blocks with the same successor
160 1.1 mrg blocks.
161 1.1 mrg 2. Within each group, it tries to determine clusters of equal basic blocks.
162 1.1 mrg 3. The clusters are applied.
163 1.1 mrg 4. The same successor groups are updated.
164 1.1 mrg 5. This process is repeated from 2 onwards, until no more changes.
165 1.1 mrg
166 1.1 mrg
167 1.1 mrg LIMITATIONS/TODO
168 1.1 mrg
169 1.1 mrg - block only
170 1.1 mrg - handles only 'same operations, same successors'.
171 1.1 mrg It handles same predecessors as a special subcase though.
172 1.1 mrg - does not implement the reverse value numbering and block value numbering.
173 1.1 mrg - improve memory allocation: use garbage collected memory, obstacks,
174 1.1 mrg allocpools where appropriate.
175 1.1 mrg - no insertion of gimple_reg phis, We only introduce vop-phis.
176 1.1 mrg - handle blocks with gimple_reg phi_nodes.
177 1.1 mrg
178 1.1 mrg
179 1.1 mrg PASS PLACEMENT
180 1.1 mrg This 'pass' is not a stand-alone gimple pass, but runs as part of
181 1.1 mrg pass_pre, in order to share the value numbering.
182 1.1 mrg
183 1.1 mrg
184 1.1 mrg SWITCHES
185 1.1 mrg
186 1.1 mrg - ftree-tail-merge. On at -O2. We may have to enable it only at -Os. */
187 1.1 mrg
188 1.1 mrg #include "config.h"
189 1.1 mrg #include "system.h"
190 1.1 mrg #include "coretypes.h"
191 1.1 mrg #include "backend.h"
192 1.1 mrg #include "tree.h"
193 1.1 mrg #include "gimple.h"
194 1.1 mrg #include "cfghooks.h"
195 1.1 mrg #include "tree-pass.h"
196 1.1 mrg #include "ssa.h"
197 1.1 mrg #include "fold-const.h"
198 1.1 mrg #include "trans-mem.h"
199 1.1 mrg #include "cfganal.h"
200 1.1 mrg #include "cfgcleanup.h"
201 1.1 mrg #include "gimple-iterator.h"
202 1.1 mrg #include "tree-cfg.h"
203 1.1 mrg #include "tree-into-ssa.h"
204 1.1 mrg #include "tree-ssa-sccvn.h"
205 1.1 mrg #include "cfgloop.h"
206 1.1 mrg #include "tree-eh.h"
207 1.1 mrg #include "tree-cfgcleanup.h"
208 1.1 mrg
209 1.1 mrg const int ignore_edge_flags = EDGE_DFS_BACK | EDGE_EXECUTABLE;
210 1.1 mrg
211 1.1 mrg /* Describes a group of bbs with the same successors. The successor bbs are
212 1.1 mrg cached in succs, and the successor edge flags are cached in succ_flags.
213 1.1 mrg If a bb has the EDGE_TRUE/FALSE_VALUE flags swapped compared to succ_flags,
214 1.1 mrg it's marked in inverse.
215 1.1 mrg Additionally, the hash value for the struct is cached in hashval, and
216 1.1 mrg in_worklist indicates whether it's currently part of worklist. */
217 1.1 mrg
218 1.1 mrg struct same_succ : pointer_hash <same_succ>
219 1.1 mrg {
220 1.1 mrg /* The bbs that have the same successor bbs. */
221 1.1 mrg bitmap bbs;
222 1.1 mrg /* The successor bbs. */
223 1.1 mrg bitmap succs;
224 1.1 mrg /* Indicates whether the EDGE_TRUE/FALSE_VALUEs of succ_flags are swapped for
225 1.1 mrg bb. */
226 1.1 mrg bitmap inverse;
227 1.1 mrg /* The edge flags for each of the successor bbs. */
228 1.1 mrg vec<int> succ_flags;
229 1.1 mrg /* Indicates whether the struct is currently in the worklist. */
230 1.1 mrg bool in_worklist;
231 1.1 mrg /* The hash value of the struct. */
232 1.1 mrg hashval_t hashval;
233 1.1 mrg
234 1.1 mrg /* hash_table support. */
235 1.1 mrg static inline hashval_t hash (const same_succ *);
236 1.1 mrg static int equal (const same_succ *, const same_succ *);
237 1.1 mrg static void remove (same_succ *);
238 1.1 mrg };
239 1.1 mrg
240 1.1 mrg /* hash routine for hash_table support, returns hashval of E. */
241 1.1 mrg
242 1.1 mrg inline hashval_t
243 1.1 mrg same_succ::hash (const same_succ *e)
244 1.1 mrg {
245 1.1 mrg return e->hashval;
246 1.1 mrg }
247 1.1 mrg
248 1.1 mrg /* A group of bbs where 1 bb from bbs can replace the other bbs. */
249 1.1 mrg
250 1.1 mrg struct bb_cluster
251 1.1 mrg {
252 1.1 mrg /* The bbs in the cluster. */
253 1.1 mrg bitmap bbs;
254 1.1 mrg /* The preds of the bbs in the cluster. */
255 1.1 mrg bitmap preds;
256 1.1 mrg /* Index in all_clusters vector. */
257 1.1 mrg int index;
258 1.1 mrg /* The bb to replace the cluster with. */
259 1.1 mrg basic_block rep_bb;
260 1.1 mrg };
261 1.1 mrg
262 1.1 mrg /* Per bb-info. */
263 1.1 mrg
264 1.1 mrg struct aux_bb_info
265 1.1 mrg {
266 1.1 mrg /* The number of non-debug statements in the bb. */
267 1.1 mrg int size;
268 1.1 mrg /* The same_succ that this bb is a member of. */
269 1.1 mrg same_succ *bb_same_succ;
270 1.1 mrg /* The cluster that this bb is a member of. */
271 1.1 mrg bb_cluster *cluster;
272 1.1 mrg /* The vop state at the exit of a bb. This is shortlived data, used to
273 1.1 mrg communicate data between update_block_by and update_vuses. */
274 1.1 mrg tree vop_at_exit;
275 1.1 mrg /* The bb that either contains or is dominated by the dependencies of the
276 1.1 mrg bb. */
277 1.1 mrg basic_block dep_bb;
278 1.1 mrg };
279 1.1 mrg
280 1.1 mrg /* Macros to access the fields of struct aux_bb_info. */
281 1.1 mrg
282 1.1 mrg #define BB_SIZE(bb) (((struct aux_bb_info *)bb->aux)->size)
283 1.1 mrg #define BB_SAME_SUCC(bb) (((struct aux_bb_info *)bb->aux)->bb_same_succ)
284 1.1 mrg #define BB_CLUSTER(bb) (((struct aux_bb_info *)bb->aux)->cluster)
285 1.1 mrg #define BB_VOP_AT_EXIT(bb) (((struct aux_bb_info *)bb->aux)->vop_at_exit)
286 1.1 mrg #define BB_DEP_BB(bb) (((struct aux_bb_info *)bb->aux)->dep_bb)
287 1.1 mrg
288 1.1 mrg /* Valueization helper querying the VN lattice. */
289 1.1 mrg
290 1.1 mrg static tree
291 1.1 mrg tail_merge_valueize (tree name)
292 1.1 mrg {
293 1.1 mrg if (TREE_CODE (name) == SSA_NAME
294 1.1 mrg && has_VN_INFO (name))
295 1.1 mrg {
296 1.1 mrg tree tem = VN_INFO (name)->valnum;
297 1.1 mrg if (tem != VN_TOP)
298 1.1 mrg return tem;
299 1.1 mrg }
300 1.1 mrg return name;
301 1.1 mrg }
302 1.1 mrg
303 1.1 mrg /* Returns true if the only effect a statement STMT has, is to define locally
304 1.1 mrg used SSA_NAMEs. */
305 1.1 mrg
306 1.1 mrg static bool
307 1.1 mrg stmt_local_def (gimple *stmt)
308 1.1 mrg {
309 1.1 mrg basic_block bb, def_bb;
310 1.1 mrg imm_use_iterator iter;
311 1.1 mrg use_operand_p use_p;
312 1.1 mrg tree val;
313 1.1 mrg def_operand_p def_p;
314 1.1 mrg
315 1.1 mrg if (gimple_vdef (stmt) != NULL_TREE
316 1.1 mrg || gimple_has_side_effects (stmt)
317 1.1 mrg || gimple_could_trap_p_1 (stmt, false, false)
318 1.1 mrg || gimple_vuse (stmt) != NULL_TREE
319 1.1 mrg /* Copied from tree-ssa-ifcombine.cc:bb_no_side_effects_p():
320 1.1 mrg const calls don't match any of the above, yet they could
321 1.1 mrg still have some side-effects - they could contain
322 1.1 mrg gimple_could_trap_p statements, like floating point
323 1.1 mrg exceptions or integer division by zero. See PR70586.
324 1.1 mrg FIXME: perhaps gimple_has_side_effects or gimple_could_trap_p
325 1.1 mrg should handle this. */
326 1.1 mrg || is_gimple_call (stmt))
327 1.1 mrg return false;
328 1.1 mrg
329 1.1 mrg def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
330 1.1 mrg if (def_p == NULL)
331 1.1 mrg return false;
332 1.1 mrg
333 1.1 mrg val = DEF_FROM_PTR (def_p);
334 1.1 mrg if (val == NULL_TREE || TREE_CODE (val) != SSA_NAME)
335 1.1 mrg return false;
336 1.1 mrg
337 1.1 mrg def_bb = gimple_bb (stmt);
338 1.1 mrg
339 1.1 mrg FOR_EACH_IMM_USE_FAST (use_p, iter, val)
340 1.1 mrg {
341 1.1 mrg if (is_gimple_debug (USE_STMT (use_p)))
342 1.1 mrg continue;
343 1.1 mrg bb = gimple_bb (USE_STMT (use_p));
344 1.1 mrg if (bb == def_bb)
345 1.1 mrg continue;
346 1.1 mrg
347 1.1 mrg if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
348 1.1 mrg && EDGE_PRED (bb, PHI_ARG_INDEX_FROM_USE (use_p))->src == def_bb)
349 1.1 mrg continue;
350 1.1 mrg
351 1.1 mrg return false;
352 1.1 mrg }
353 1.1 mrg
354 1.1 mrg return true;
355 1.1 mrg }
356 1.1 mrg
357 1.1 mrg /* Let GSI skip forwards over local defs. */
358 1.1 mrg
359 1.1 mrg static void
360 1.1 mrg gsi_advance_fw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
361 1.1 mrg {
362 1.1 mrg gimple *stmt;
363 1.1 mrg
364 1.1 mrg while (true)
365 1.1 mrg {
366 1.1 mrg if (gsi_end_p (*gsi))
367 1.1 mrg return;
368 1.1 mrg stmt = gsi_stmt (*gsi);
369 1.1 mrg if (!stmt_local_def (stmt))
370 1.1 mrg return;
371 1.1 mrg gsi_next_nondebug (gsi);
372 1.1 mrg }
373 1.1 mrg }
374 1.1 mrg
375 1.1 mrg /* VAL1 and VAL2 are either:
376 1.1 mrg - uses in BB1 and BB2, or
377 1.1 mrg - phi alternatives for BB1 and BB2.
378 1.1 mrg Return true if the uses have the same gvn value. */
379 1.1 mrg
380 1.1 mrg static bool
381 1.1 mrg gvn_uses_equal (tree val1, tree val2)
382 1.1 mrg {
383 1.1 mrg gcc_checking_assert (val1 != NULL_TREE && val2 != NULL_TREE);
384 1.1 mrg
385 1.1 mrg if (val1 == val2)
386 1.1 mrg return true;
387 1.1 mrg
388 1.1 mrg if (tail_merge_valueize (val1) != tail_merge_valueize (val2))
389 1.1 mrg return false;
390 1.1 mrg
391 1.1 mrg return ((TREE_CODE (val1) == SSA_NAME || CONSTANT_CLASS_P (val1))
392 1.1 mrg && (TREE_CODE (val2) == SSA_NAME || CONSTANT_CLASS_P (val2)));
393 1.1 mrg }
394 1.1 mrg
395 1.1 mrg /* Prints E to FILE. */
396 1.1 mrg
397 1.1 mrg static void
398 1.1 mrg same_succ_print (FILE *file, const same_succ *e)
399 1.1 mrg {
400 1.1 mrg unsigned int i;
401 1.1 mrg bitmap_print (file, e->bbs, "bbs:", "\n");
402 1.1 mrg bitmap_print (file, e->succs, "succs:", "\n");
403 1.1 mrg bitmap_print (file, e->inverse, "inverse:", "\n");
404 1.1 mrg fprintf (file, "flags:");
405 1.1 mrg for (i = 0; i < e->succ_flags.length (); ++i)
406 1.1 mrg fprintf (file, " %x", e->succ_flags[i]);
407 1.1 mrg fprintf (file, "\n");
408 1.1 mrg }
409 1.1 mrg
410 1.1 mrg /* Prints same_succ VE to VFILE. */
411 1.1 mrg
412 1.1 mrg inline int
413 1.1 mrg ssa_same_succ_print_traverse (same_succ **pe, FILE *file)
414 1.1 mrg {
415 1.1 mrg const same_succ *e = *pe;
416 1.1 mrg same_succ_print (file, e);
417 1.1 mrg return 1;
418 1.1 mrg }
419 1.1 mrg
420 1.1 mrg /* Update BB_DEP_BB (USE_BB), given a use of VAL in USE_BB. */
421 1.1 mrg
422 1.1 mrg static void
423 1.1 mrg update_dep_bb (basic_block use_bb, tree val)
424 1.1 mrg {
425 1.1 mrg basic_block dep_bb;
426 1.1 mrg
427 1.1 mrg /* Not a dep. */
428 1.1 mrg if (TREE_CODE (val) != SSA_NAME)
429 1.1 mrg return;
430 1.1 mrg
431 1.1 mrg /* Skip use of global def. */
432 1.1 mrg if (SSA_NAME_IS_DEFAULT_DEF (val))
433 1.1 mrg return;
434 1.1 mrg
435 1.1 mrg /* Skip use of local def. */
436 1.1 mrg dep_bb = gimple_bb (SSA_NAME_DEF_STMT (val));
437 1.1 mrg if (dep_bb == use_bb)
438 1.1 mrg return;
439 1.1 mrg
440 1.1 mrg if (BB_DEP_BB (use_bb) == NULL
441 1.1 mrg || dominated_by_p (CDI_DOMINATORS, dep_bb, BB_DEP_BB (use_bb)))
442 1.1 mrg BB_DEP_BB (use_bb) = dep_bb;
443 1.1 mrg }
444 1.1 mrg
445 1.1 mrg /* Update BB_DEP_BB, given the dependencies in STMT. */
446 1.1 mrg
447 1.1 mrg static void
448 1.1 mrg stmt_update_dep_bb (gimple *stmt)
449 1.1 mrg {
450 1.1 mrg ssa_op_iter iter;
451 1.1 mrg use_operand_p use;
452 1.1 mrg
453 1.1 mrg FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE)
454 1.1 mrg update_dep_bb (gimple_bb (stmt), USE_FROM_PTR (use));
455 1.1 mrg }
456 1.1 mrg
457 1.1 mrg /* Calculates hash value for same_succ VE. */
458 1.1 mrg
459 1.1 mrg static hashval_t
460 1.1 mrg same_succ_hash (const same_succ *e)
461 1.1 mrg {
462 1.1 mrg inchash::hash hstate (bitmap_hash (e->succs));
463 1.1 mrg int flags;
464 1.1 mrg unsigned int i;
465 1.1 mrg unsigned int first = bitmap_first_set_bit (e->bbs);
466 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (cfun, first);
467 1.1 mrg int size = 0;
468 1.1 mrg gimple *stmt;
469 1.1 mrg tree arg;
470 1.1 mrg unsigned int s;
471 1.1 mrg bitmap_iterator bs;
472 1.1 mrg
473 1.1 mrg for (gimple_stmt_iterator gsi = gsi_start_nondebug_bb (bb);
474 1.1 mrg !gsi_end_p (gsi); gsi_next_nondebug (&gsi))
475 1.1 mrg {
476 1.1 mrg stmt = gsi_stmt (gsi);
477 1.1 mrg stmt_update_dep_bb (stmt);
478 1.1 mrg if (stmt_local_def (stmt))
479 1.1 mrg continue;
480 1.1 mrg size++;
481 1.1 mrg
482 1.1 mrg hstate.add_int (gimple_code (stmt));
483 1.1 mrg if (is_gimple_assign (stmt))
484 1.1 mrg hstate.add_int (gimple_assign_rhs_code (stmt));
485 1.1 mrg if (!is_gimple_call (stmt))
486 1.1 mrg continue;
487 1.1 mrg if (gimple_call_internal_p (stmt))
488 1.1 mrg hstate.add_int (gimple_call_internal_fn (stmt));
489 1.1 mrg else
490 1.1 mrg {
491 1.1 mrg inchash::add_expr (gimple_call_fn (stmt), hstate);
492 1.1 mrg if (gimple_call_chain (stmt))
493 1.1 mrg inchash::add_expr (gimple_call_chain (stmt), hstate);
494 1.1 mrg }
495 1.1 mrg for (i = 0; i < gimple_call_num_args (stmt); i++)
496 1.1 mrg {
497 1.1 mrg arg = gimple_call_arg (stmt, i);
498 1.1 mrg arg = tail_merge_valueize (arg);
499 1.1 mrg inchash::add_expr (arg, hstate);
500 1.1 mrg }
501 1.1 mrg }
502 1.1 mrg
503 1.1 mrg hstate.add_int (size);
504 1.1 mrg BB_SIZE (bb) = size;
505 1.1 mrg
506 1.1 mrg hstate.add_int (bb->loop_father->num);
507 1.1 mrg
508 1.1 mrg for (i = 0; i < e->succ_flags.length (); ++i)
509 1.1 mrg {
510 1.1 mrg flags = e->succ_flags[i];
511 1.1 mrg flags = flags & ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
512 1.1 mrg hstate.add_int (flags);
513 1.1 mrg }
514 1.1 mrg
515 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (e->succs, 0, s, bs)
516 1.1 mrg {
517 1.1 mrg int n = find_edge (bb, BASIC_BLOCK_FOR_FN (cfun, s))->dest_idx;
518 1.1 mrg for (gphi_iterator gsi = gsi_start_phis (BASIC_BLOCK_FOR_FN (cfun, s));
519 1.1 mrg !gsi_end_p (gsi);
520 1.1 mrg gsi_next (&gsi))
521 1.1 mrg {
522 1.1 mrg gphi *phi = gsi.phi ();
523 1.1 mrg tree lhs = gimple_phi_result (phi);
524 1.1 mrg tree val = gimple_phi_arg_def (phi, n);
525 1.1 mrg
526 1.1 mrg if (virtual_operand_p (lhs))
527 1.1 mrg continue;
528 1.1 mrg update_dep_bb (bb, val);
529 1.1 mrg }
530 1.1 mrg }
531 1.1 mrg
532 1.1 mrg return hstate.end ();
533 1.1 mrg }
534 1.1 mrg
535 1.1 mrg /* Returns true if E1 and E2 have 2 successors, and if the successor flags
536 1.1 mrg are inverse for the EDGE_TRUE_VALUE and EDGE_FALSE_VALUE flags, and equal for
537 1.1 mrg the other edge flags. */
538 1.1 mrg
539 1.1 mrg static bool
540 1.1 mrg inverse_flags (const same_succ *e1, const same_succ *e2)
541 1.1 mrg {
542 1.1 mrg int f1a, f1b, f2a, f2b;
543 1.1 mrg int mask = ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
544 1.1 mrg
545 1.1 mrg if (e1->succ_flags.length () != 2)
546 1.1 mrg return false;
547 1.1 mrg
548 1.1 mrg f1a = e1->succ_flags[0];
549 1.1 mrg f1b = e1->succ_flags[1];
550 1.1 mrg f2a = e2->succ_flags[0];
551 1.1 mrg f2b = e2->succ_flags[1];
552 1.1 mrg
553 1.1 mrg if (f1a == f2a && f1b == f2b)
554 1.1 mrg return false;
555 1.1 mrg
556 1.1 mrg return (f1a & mask) == (f2a & mask) && (f1b & mask) == (f2b & mask);
557 1.1 mrg }
558 1.1 mrg
559 1.1 mrg /* Compares SAME_SUCCs E1 and E2. */
560 1.1 mrg
561 1.1 mrg int
562 1.1 mrg same_succ::equal (const same_succ *e1, const same_succ *e2)
563 1.1 mrg {
564 1.1 mrg unsigned int i, first1, first2;
565 1.1 mrg gimple_stmt_iterator gsi1, gsi2;
566 1.1 mrg gimple *s1, *s2;
567 1.1 mrg basic_block bb1, bb2;
568 1.1 mrg
569 1.1 mrg if (e1 == e2)
570 1.1 mrg return 1;
571 1.1 mrg
572 1.1 mrg if (e1->hashval != e2->hashval)
573 1.1 mrg return 0;
574 1.1 mrg
575 1.1 mrg if (e1->succ_flags.length () != e2->succ_flags.length ())
576 1.1 mrg return 0;
577 1.1 mrg
578 1.1 mrg if (!bitmap_equal_p (e1->succs, e2->succs))
579 1.1 mrg return 0;
580 1.1 mrg
581 1.1 mrg if (!inverse_flags (e1, e2))
582 1.1 mrg {
583 1.1 mrg for (i = 0; i < e1->succ_flags.length (); ++i)
584 1.1 mrg if (e1->succ_flags[i] != e2->succ_flags[i])
585 1.1 mrg return 0;
586 1.1 mrg }
587 1.1 mrg
588 1.1 mrg first1 = bitmap_first_set_bit (e1->bbs);
589 1.1 mrg first2 = bitmap_first_set_bit (e2->bbs);
590 1.1 mrg
591 1.1 mrg bb1 = BASIC_BLOCK_FOR_FN (cfun, first1);
592 1.1 mrg bb2 = BASIC_BLOCK_FOR_FN (cfun, first2);
593 1.1 mrg
594 1.1 mrg if (BB_SIZE (bb1) != BB_SIZE (bb2))
595 1.1 mrg return 0;
596 1.1 mrg
597 1.1 mrg if (bb1->loop_father != bb2->loop_father)
598 1.1 mrg return 0;
599 1.1 mrg
600 1.1 mrg gsi1 = gsi_start_nondebug_bb (bb1);
601 1.1 mrg gsi2 = gsi_start_nondebug_bb (bb2);
602 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi1);
603 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi2);
604 1.1 mrg while (!(gsi_end_p (gsi1) || gsi_end_p (gsi2)))
605 1.1 mrg {
606 1.1 mrg s1 = gsi_stmt (gsi1);
607 1.1 mrg s2 = gsi_stmt (gsi2);
608 1.1 mrg if (gimple_code (s1) != gimple_code (s2))
609 1.1 mrg return 0;
610 1.1 mrg if (is_gimple_call (s1) && !gimple_call_same_target_p (s1, s2))
611 1.1 mrg return 0;
612 1.1 mrg gsi_next_nondebug (&gsi1);
613 1.1 mrg gsi_next_nondebug (&gsi2);
614 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi1);
615 1.1 mrg gsi_advance_fw_nondebug_nonlocal (&gsi2);
616 1.1 mrg }
617 1.1 mrg
618 1.1 mrg return 1;
619 1.1 mrg }
620 1.1 mrg
621 1.1 mrg /* Alloc and init a new SAME_SUCC. */
622 1.1 mrg
623 1.1 mrg static same_succ *
624 1.1 mrg same_succ_alloc (void)
625 1.1 mrg {
626 1.1 mrg same_succ *same = XNEW (struct same_succ);
627 1.1 mrg
628 1.1 mrg same->bbs = BITMAP_ALLOC (NULL);
629 1.1 mrg same->succs = BITMAP_ALLOC (NULL);
630 1.1 mrg same->inverse = BITMAP_ALLOC (NULL);
631 1.1 mrg same->succ_flags.create (10);
632 1.1 mrg same->in_worklist = false;
633 1.1 mrg
634 1.1 mrg return same;
635 1.1 mrg }
636 1.1 mrg
637 1.1 mrg /* Delete same_succ E. */
638 1.1 mrg
639 1.1 mrg void
640 1.1 mrg same_succ::remove (same_succ *e)
641 1.1 mrg {
642 1.1 mrg BITMAP_FREE (e->bbs);
643 1.1 mrg BITMAP_FREE (e->succs);
644 1.1 mrg BITMAP_FREE (e->inverse);
645 1.1 mrg e->succ_flags.release ();
646 1.1 mrg
647 1.1 mrg XDELETE (e);
648 1.1 mrg }
649 1.1 mrg
650 1.1 mrg /* Reset same_succ SAME. */
651 1.1 mrg
652 1.1 mrg static void
653 1.1 mrg same_succ_reset (same_succ *same)
654 1.1 mrg {
655 1.1 mrg bitmap_clear (same->bbs);
656 1.1 mrg bitmap_clear (same->succs);
657 1.1 mrg bitmap_clear (same->inverse);
658 1.1 mrg same->succ_flags.truncate (0);
659 1.1 mrg }
660 1.1 mrg
661 1.1 mrg static hash_table<same_succ> *same_succ_htab;
662 1.1 mrg
663 1.1 mrg /* Array that is used to store the edge flags for a successor. */
664 1.1 mrg
665 1.1 mrg static int *same_succ_edge_flags;
666 1.1 mrg
667 1.1 mrg /* Bitmap that is used to mark bbs that are recently deleted. */
668 1.1 mrg
669 1.1 mrg static bitmap deleted_bbs;
670 1.1 mrg
671 1.1 mrg /* Bitmap that is used to mark predecessors of bbs that are
672 1.1 mrg deleted. */
673 1.1 mrg
674 1.1 mrg static bitmap deleted_bb_preds;
675 1.1 mrg
676 1.1 mrg /* Prints same_succ_htab to stderr. */
677 1.1 mrg
678 1.1 mrg extern void debug_same_succ (void);
679 1.1 mrg DEBUG_FUNCTION void
680 1.1 mrg debug_same_succ ( void)
681 1.1 mrg {
682 1.1 mrg same_succ_htab->traverse <FILE *, ssa_same_succ_print_traverse> (stderr);
683 1.1 mrg }
684 1.1 mrg
685 1.1 mrg
686 1.1 mrg /* Vector of bbs to process. */
687 1.1 mrg
688 1.1 mrg static vec<same_succ *> worklist;
689 1.1 mrg
690 1.1 mrg /* Prints worklist to FILE. */
691 1.1 mrg
692 1.1 mrg static void
693 1.1 mrg print_worklist (FILE *file)
694 1.1 mrg {
695 1.1 mrg unsigned int i;
696 1.1 mrg for (i = 0; i < worklist.length (); ++i)
697 1.1 mrg same_succ_print (file, worklist[i]);
698 1.1 mrg }
699 1.1 mrg
700 1.1 mrg /* Adds SAME to worklist. */
701 1.1 mrg
702 1.1 mrg static void
703 1.1 mrg add_to_worklist (same_succ *same)
704 1.1 mrg {
705 1.1 mrg if (same->in_worklist)
706 1.1 mrg return;
707 1.1 mrg
708 1.1 mrg if (bitmap_count_bits (same->bbs) < 2)
709 1.1 mrg return;
710 1.1 mrg
711 1.1 mrg same->in_worklist = true;
712 1.1 mrg worklist.safe_push (same);
713 1.1 mrg }
714 1.1 mrg
715 1.1 mrg /* Add BB to same_succ_htab. */
716 1.1 mrg
717 1.1 mrg static void
718 1.1 mrg find_same_succ_bb (basic_block bb, same_succ **same_p)
719 1.1 mrg {
720 1.1 mrg unsigned int j;
721 1.1 mrg bitmap_iterator bj;
722 1.1 mrg same_succ *same = *same_p;
723 1.1 mrg same_succ **slot;
724 1.1 mrg edge_iterator ei;
725 1.1 mrg edge e;
726 1.1 mrg
727 1.1 mrg if (bb == NULL)
728 1.1 mrg return;
729 1.1 mrg bitmap_set_bit (same->bbs, bb->index);
730 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs)
731 1.1 mrg {
732 1.1 mrg int index = e->dest->index;
733 1.1 mrg bitmap_set_bit (same->succs, index);
734 1.1 mrg same_succ_edge_flags[index] = (e->flags & ~ignore_edge_flags);
735 1.1 mrg }
736 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same->succs, 0, j, bj)
737 1.1 mrg same->succ_flags.safe_push (same_succ_edge_flags[j]);
738 1.1 mrg
739 1.1 mrg same->hashval = same_succ_hash (same);
740 1.1 mrg
741 1.1 mrg slot = same_succ_htab->find_slot_with_hash (same, same->hashval, INSERT);
742 1.1 mrg if (*slot == NULL)
743 1.1 mrg {
744 1.1 mrg *slot = same;
745 1.1 mrg BB_SAME_SUCC (bb) = same;
746 1.1 mrg add_to_worklist (same);
747 1.1 mrg *same_p = NULL;
748 1.1 mrg }
749 1.1 mrg else
750 1.1 mrg {
751 1.1 mrg bitmap_set_bit ((*slot)->bbs, bb->index);
752 1.1 mrg BB_SAME_SUCC (bb) = *slot;
753 1.1 mrg add_to_worklist (*slot);
754 1.1 mrg if (inverse_flags (same, *slot))
755 1.1 mrg bitmap_set_bit ((*slot)->inverse, bb->index);
756 1.1 mrg same_succ_reset (same);
757 1.1 mrg }
758 1.1 mrg }
759 1.1 mrg
760 1.1 mrg /* Find bbs with same successors. */
761 1.1 mrg
762 1.1 mrg static void
763 1.1 mrg find_same_succ (void)
764 1.1 mrg {
765 1.1 mrg same_succ *same = same_succ_alloc ();
766 1.1 mrg basic_block bb;
767 1.1 mrg
768 1.1 mrg FOR_EACH_BB_FN (bb, cfun)
769 1.1 mrg {
770 1.1 mrg find_same_succ_bb (bb, &same);
771 1.1 mrg if (same == NULL)
772 1.1 mrg same = same_succ_alloc ();
773 1.1 mrg }
774 1.1 mrg
775 1.1 mrg same_succ::remove (same);
776 1.1 mrg }
777 1.1 mrg
778 1.1 mrg /* Initializes worklist administration. */
779 1.1 mrg
780 1.1 mrg static void
781 1.1 mrg init_worklist (void)
782 1.1 mrg {
783 1.1 mrg alloc_aux_for_blocks (sizeof (struct aux_bb_info));
784 1.1 mrg same_succ_htab = new hash_table<same_succ> (n_basic_blocks_for_fn (cfun));
785 1.1 mrg same_succ_edge_flags = XCNEWVEC (int, last_basic_block_for_fn (cfun));
786 1.1 mrg deleted_bbs = BITMAP_ALLOC (NULL);
787 1.1 mrg deleted_bb_preds = BITMAP_ALLOC (NULL);
788 1.1 mrg worklist.create (n_basic_blocks_for_fn (cfun));
789 1.1 mrg find_same_succ ();
790 1.1 mrg
791 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
792 1.1 mrg {
793 1.1 mrg fprintf (dump_file, "initial worklist:\n");
794 1.1 mrg print_worklist (dump_file);
795 1.1 mrg }
796 1.1 mrg }
797 1.1 mrg
798 1.1 mrg /* Deletes worklist administration. */
799 1.1 mrg
800 1.1 mrg static void
801 1.1 mrg delete_worklist (void)
802 1.1 mrg {
803 1.1 mrg free_aux_for_blocks ();
804 1.1 mrg delete same_succ_htab;
805 1.1 mrg same_succ_htab = NULL;
806 1.1 mrg XDELETEVEC (same_succ_edge_flags);
807 1.1 mrg same_succ_edge_flags = NULL;
808 1.1 mrg BITMAP_FREE (deleted_bbs);
809 1.1 mrg BITMAP_FREE (deleted_bb_preds);
810 1.1 mrg worklist.release ();
811 1.1 mrg }
812 1.1 mrg
813 1.1 mrg /* Mark BB as deleted, and mark its predecessors. */
814 1.1 mrg
815 1.1 mrg static void
816 1.1 mrg mark_basic_block_deleted (basic_block bb)
817 1.1 mrg {
818 1.1 mrg edge e;
819 1.1 mrg edge_iterator ei;
820 1.1 mrg
821 1.1 mrg bitmap_set_bit (deleted_bbs, bb->index);
822 1.1 mrg
823 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
824 1.1 mrg bitmap_set_bit (deleted_bb_preds, e->src->index);
825 1.1 mrg }
826 1.1 mrg
827 1.1 mrg /* Removes BB from its corresponding same_succ. */
828 1.1 mrg
829 1.1 mrg static void
830 1.1 mrg same_succ_flush_bb (basic_block bb)
831 1.1 mrg {
832 1.1 mrg same_succ *same = BB_SAME_SUCC (bb);
833 1.1 mrg if (! same)
834 1.1 mrg return;
835 1.1 mrg
836 1.1 mrg BB_SAME_SUCC (bb) = NULL;
837 1.1 mrg if (bitmap_single_bit_set_p (same->bbs))
838 1.1 mrg same_succ_htab->remove_elt_with_hash (same, same->hashval);
839 1.1 mrg else
840 1.1 mrg bitmap_clear_bit (same->bbs, bb->index);
841 1.1 mrg }
842 1.1 mrg
843 1.1 mrg /* Removes all bbs in BBS from their corresponding same_succ. */
844 1.1 mrg
845 1.1 mrg static void
846 1.1 mrg same_succ_flush_bbs (bitmap bbs)
847 1.1 mrg {
848 1.1 mrg unsigned int i;
849 1.1 mrg bitmap_iterator bi;
850 1.1 mrg
851 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (bbs, 0, i, bi)
852 1.1 mrg same_succ_flush_bb (BASIC_BLOCK_FOR_FN (cfun, i));
853 1.1 mrg }
854 1.1 mrg
855 1.1 mrg /* Release the last vdef in BB, either normal or phi result. */
856 1.1 mrg
857 1.1 mrg static void
858 1.1 mrg release_last_vdef (basic_block bb)
859 1.1 mrg {
860 1.1 mrg for (gimple_stmt_iterator i = gsi_last_bb (bb); !gsi_end_p (i);
861 1.1 mrg gsi_prev_nondebug (&i))
862 1.1 mrg {
863 1.1 mrg gimple *stmt = gsi_stmt (i);
864 1.1 mrg if (gimple_vdef (stmt) == NULL_TREE)
865 1.1 mrg continue;
866 1.1 mrg
867 1.1 mrg mark_virtual_operand_for_renaming (gimple_vdef (stmt));
868 1.1 mrg return;
869 1.1 mrg }
870 1.1 mrg
871 1.1 mrg for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i);
872 1.1 mrg gsi_next (&i))
873 1.1 mrg {
874 1.1 mrg gphi *phi = i.phi ();
875 1.1 mrg tree res = gimple_phi_result (phi);
876 1.1 mrg
877 1.1 mrg if (!virtual_operand_p (res))
878 1.1 mrg continue;
879 1.1 mrg
880 1.1 mrg mark_virtual_phi_result_for_renaming (phi);
881 1.1 mrg return;
882 1.1 mrg }
883 1.1 mrg }
884 1.1 mrg
885 1.1 mrg /* For deleted_bb_preds, find bbs with same successors. */
886 1.1 mrg
887 1.1 mrg static void
888 1.1 mrg update_worklist (void)
889 1.1 mrg {
890 1.1 mrg unsigned int i;
891 1.1 mrg bitmap_iterator bi;
892 1.1 mrg basic_block bb;
893 1.1 mrg same_succ *same;
894 1.1 mrg
895 1.1 mrg bitmap_and_compl_into (deleted_bb_preds, deleted_bbs);
896 1.1 mrg bitmap_clear (deleted_bbs);
897 1.1 mrg
898 1.1 mrg bitmap_clear_bit (deleted_bb_preds, ENTRY_BLOCK);
899 1.1 mrg same_succ_flush_bbs (deleted_bb_preds);
900 1.1 mrg
901 1.1 mrg same = same_succ_alloc ();
902 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (deleted_bb_preds, 0, i, bi)
903 1.1 mrg {
904 1.1 mrg bb = BASIC_BLOCK_FOR_FN (cfun, i);
905 1.1 mrg gcc_assert (bb != NULL);
906 1.1 mrg find_same_succ_bb (bb, &same);
907 1.1 mrg if (same == NULL)
908 1.1 mrg same = same_succ_alloc ();
909 1.1 mrg }
910 1.1 mrg same_succ::remove (same);
911 1.1 mrg bitmap_clear (deleted_bb_preds);
912 1.1 mrg }
913 1.1 mrg
914 1.1 mrg /* Prints cluster C to FILE. */
915 1.1 mrg
916 1.1 mrg static void
917 1.1 mrg print_cluster (FILE *file, bb_cluster *c)
918 1.1 mrg {
919 1.1 mrg if (c == NULL)
920 1.1 mrg return;
921 1.1 mrg bitmap_print (file, c->bbs, "bbs:", "\n");
922 1.1 mrg bitmap_print (file, c->preds, "preds:", "\n");
923 1.1 mrg }
924 1.1 mrg
925 1.1 mrg /* Prints cluster C to stderr. */
926 1.1 mrg
927 1.1 mrg extern void debug_cluster (bb_cluster *);
928 1.1 mrg DEBUG_FUNCTION void
929 1.1 mrg debug_cluster (bb_cluster *c)
930 1.1 mrg {
931 1.1 mrg print_cluster (stderr, c);
932 1.1 mrg }
933 1.1 mrg
934 1.1 mrg /* Update C->rep_bb, given that BB is added to the cluster. */
935 1.1 mrg
936 1.1 mrg static void
937 1.1 mrg update_rep_bb (bb_cluster *c, basic_block bb)
938 1.1 mrg {
939 1.1 mrg /* Initial. */
940 1.1 mrg if (c->rep_bb == NULL)
941 1.1 mrg {
942 1.1 mrg c->rep_bb = bb;
943 1.1 mrg return;
944 1.1 mrg }
945 1.1 mrg
946 1.1 mrg /* Current needs no deps, keep it. */
947 1.1 mrg if (BB_DEP_BB (c->rep_bb) == NULL)
948 1.1 mrg return;
949 1.1 mrg
950 1.1 mrg /* Bb needs no deps, change rep_bb. */
951 1.1 mrg if (BB_DEP_BB (bb) == NULL)
952 1.1 mrg {
953 1.1 mrg c->rep_bb = bb;
954 1.1 mrg return;
955 1.1 mrg }
956 1.1 mrg
957 1.1 mrg /* Bb needs last deps earlier than current, change rep_bb. A potential
958 1.1 mrg problem with this, is that the first deps might also be earlier, which
959 1.1 mrg would mean we prefer longer lifetimes for the deps. To be able to check
960 1.1 mrg for this, we would have to trace BB_FIRST_DEP_BB as well, besides
961 1.1 mrg BB_DEP_BB, which is really BB_LAST_DEP_BB.
962 1.1 mrg The benefit of choosing the bb with last deps earlier, is that it can
963 1.1 mrg potentially be used as replacement for more bbs. */
964 1.1 mrg if (dominated_by_p (CDI_DOMINATORS, BB_DEP_BB (c->rep_bb), BB_DEP_BB (bb)))
965 1.1 mrg c->rep_bb = bb;
966 1.1 mrg }
967 1.1 mrg
968 1.1 mrg /* Add BB to cluster C. Sets BB in C->bbs, and preds of BB in C->preds. */
969 1.1 mrg
970 1.1 mrg static void
971 1.1 mrg add_bb_to_cluster (bb_cluster *c, basic_block bb)
972 1.1 mrg {
973 1.1 mrg edge e;
974 1.1 mrg edge_iterator ei;
975 1.1 mrg
976 1.1 mrg bitmap_set_bit (c->bbs, bb->index);
977 1.1 mrg
978 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
979 1.1 mrg bitmap_set_bit (c->preds, e->src->index);
980 1.1 mrg
981 1.1 mrg update_rep_bb (c, bb);
982 1.1 mrg }
983 1.1 mrg
984 1.1 mrg /* Allocate and init new cluster. */
985 1.1 mrg
986 1.1 mrg static bb_cluster *
987 1.1 mrg new_cluster (void)
988 1.1 mrg {
989 1.1 mrg bb_cluster *c;
990 1.1 mrg c = XCNEW (bb_cluster);
991 1.1 mrg c->bbs = BITMAP_ALLOC (NULL);
992 1.1 mrg c->preds = BITMAP_ALLOC (NULL);
993 1.1 mrg c->rep_bb = NULL;
994 1.1 mrg return c;
995 1.1 mrg }
996 1.1 mrg
997 1.1 mrg /* Delete clusters. */
998 1.1 mrg
999 1.1 mrg static void
1000 1.1 mrg delete_cluster (bb_cluster *c)
1001 1.1 mrg {
1002 1.1 mrg if (c == NULL)
1003 1.1 mrg return;
1004 1.1 mrg BITMAP_FREE (c->bbs);
1005 1.1 mrg BITMAP_FREE (c->preds);
1006 1.1 mrg XDELETE (c);
1007 1.1 mrg }
1008 1.1 mrg
1009 1.1 mrg
1010 1.1 mrg /* Array that contains all clusters. */
1011 1.1 mrg
1012 1.1 mrg static vec<bb_cluster *> all_clusters;
1013 1.1 mrg
1014 1.1 mrg /* Allocate all cluster vectors. */
1015 1.1 mrg
1016 1.1 mrg static void
1017 1.1 mrg alloc_cluster_vectors (void)
1018 1.1 mrg {
1019 1.1 mrg all_clusters.create (n_basic_blocks_for_fn (cfun));
1020 1.1 mrg }
1021 1.1 mrg
1022 1.1 mrg /* Reset all cluster vectors. */
1023 1.1 mrg
1024 1.1 mrg static void
1025 1.1 mrg reset_cluster_vectors (void)
1026 1.1 mrg {
1027 1.1 mrg unsigned int i;
1028 1.1 mrg basic_block bb;
1029 1.1 mrg for (i = 0; i < all_clusters.length (); ++i)
1030 1.1 mrg delete_cluster (all_clusters[i]);
1031 1.1 mrg all_clusters.truncate (0);
1032 1.1 mrg FOR_EACH_BB_FN (bb, cfun)
1033 1.1 mrg BB_CLUSTER (bb) = NULL;
1034 1.1 mrg }
1035 1.1 mrg
1036 1.1 mrg /* Delete all cluster vectors. */
1037 1.1 mrg
1038 1.1 mrg static void
1039 1.1 mrg delete_cluster_vectors (void)
1040 1.1 mrg {
1041 1.1 mrg unsigned int i;
1042 1.1 mrg for (i = 0; i < all_clusters.length (); ++i)
1043 1.1 mrg delete_cluster (all_clusters[i]);
1044 1.1 mrg all_clusters.release ();
1045 1.1 mrg }
1046 1.1 mrg
1047 1.1 mrg /* Merge cluster C2 into C1. */
1048 1.1 mrg
1049 1.1 mrg static void
1050 1.1 mrg merge_clusters (bb_cluster *c1, bb_cluster *c2)
1051 1.1 mrg {
1052 1.1 mrg bitmap_ior_into (c1->bbs, c2->bbs);
1053 1.1 mrg bitmap_ior_into (c1->preds, c2->preds);
1054 1.1 mrg }
1055 1.1 mrg
1056 1.1 mrg /* Register equivalence of BB1 and BB2 (members of cluster C). Store c in
1057 1.1 mrg all_clusters, or merge c with existing cluster. */
1058 1.1 mrg
1059 1.1 mrg static void
1060 1.1 mrg set_cluster (basic_block bb1, basic_block bb2)
1061 1.1 mrg {
1062 1.1 mrg basic_block merge_bb, other_bb;
1063 1.1 mrg bb_cluster *merge, *old, *c;
1064 1.1 mrg
1065 1.1 mrg if (BB_CLUSTER (bb1) == NULL && BB_CLUSTER (bb2) == NULL)
1066 1.1 mrg {
1067 1.1 mrg c = new_cluster ();
1068 1.1 mrg add_bb_to_cluster (c, bb1);
1069 1.1 mrg add_bb_to_cluster (c, bb2);
1070 1.1 mrg BB_CLUSTER (bb1) = c;
1071 1.1 mrg BB_CLUSTER (bb2) = c;
1072 1.1 mrg c->index = all_clusters.length ();
1073 1.1 mrg all_clusters.safe_push (c);
1074 1.1 mrg }
1075 1.1 mrg else if (BB_CLUSTER (bb1) == NULL || BB_CLUSTER (bb2) == NULL)
1076 1.1 mrg {
1077 1.1 mrg merge_bb = BB_CLUSTER (bb1) == NULL ? bb2 : bb1;
1078 1.1 mrg other_bb = BB_CLUSTER (bb1) == NULL ? bb1 : bb2;
1079 1.1 mrg merge = BB_CLUSTER (merge_bb);
1080 1.1 mrg add_bb_to_cluster (merge, other_bb);
1081 1.1 mrg BB_CLUSTER (other_bb) = merge;
1082 1.1 mrg }
1083 1.1 mrg else if (BB_CLUSTER (bb1) != BB_CLUSTER (bb2))
1084 1.1 mrg {
1085 1.1 mrg unsigned int i;
1086 1.1 mrg bitmap_iterator bi;
1087 1.1 mrg
1088 1.1 mrg old = BB_CLUSTER (bb2);
1089 1.1 mrg merge = BB_CLUSTER (bb1);
1090 1.1 mrg merge_clusters (merge, old);
1091 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (old->bbs, 0, i, bi)
1092 1.1 mrg BB_CLUSTER (BASIC_BLOCK_FOR_FN (cfun, i)) = merge;
1093 1.1 mrg all_clusters[old->index] = NULL;
1094 1.1 mrg update_rep_bb (merge, old->rep_bb);
1095 1.1 mrg delete_cluster (old);
1096 1.1 mrg }
1097 1.1 mrg else
1098 1.1 mrg gcc_unreachable ();
1099 1.1 mrg }
1100 1.1 mrg
1101 1.1 mrg /* Return true if gimple operands T1 and T2 have the same value. */
1102 1.1 mrg
1103 1.1 mrg static bool
1104 1.1 mrg gimple_operand_equal_value_p (tree t1, tree t2)
1105 1.1 mrg {
1106 1.1 mrg if (t1 == t2)
1107 1.1 mrg return true;
1108 1.1 mrg
1109 1.1 mrg if (t1 == NULL_TREE
1110 1.1 mrg || t2 == NULL_TREE)
1111 1.1 mrg return false;
1112 1.1 mrg
1113 1.1 mrg if (operand_equal_p (t1, t2, OEP_MATCH_SIDE_EFFECTS))
1114 1.1 mrg return true;
1115 1.1 mrg
1116 1.1 mrg return gvn_uses_equal (t1, t2);
1117 1.1 mrg }
1118 1.1 mrg
1119 1.1 mrg /* Return true if gimple statements S1 and S2 are equal. Gimple_bb (s1) and
1120 1.1 mrg gimple_bb (s2) are members of SAME_SUCC. */
1121 1.1 mrg
1122 1.1 mrg static bool
1123 1.1 mrg gimple_equal_p (same_succ *same_succ, gimple *s1, gimple *s2)
1124 1.1 mrg {
1125 1.1 mrg unsigned int i;
1126 1.1 mrg tree lhs1, lhs2;
1127 1.1 mrg basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
1128 1.1 mrg tree t1, t2;
1129 1.1 mrg bool inv_cond;
1130 1.1 mrg enum tree_code code1, code2;
1131 1.1 mrg
1132 1.1 mrg if (gimple_code (s1) != gimple_code (s2))
1133 1.1 mrg return false;
1134 1.1 mrg
1135 1.1 mrg switch (gimple_code (s1))
1136 1.1 mrg {
1137 1.1 mrg case GIMPLE_CALL:
1138 1.1 mrg if (!gimple_call_same_target_p (s1, s2))
1139 1.1 mrg return false;
1140 1.1 mrg
1141 1.1 mrg t1 = gimple_call_chain (s1);
1142 1.1 mrg t2 = gimple_call_chain (s2);
1143 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2))
1144 1.1 mrg return false;
1145 1.1 mrg
1146 1.1 mrg if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
1147 1.1 mrg return false;
1148 1.1 mrg
1149 1.1 mrg for (i = 0; i < gimple_call_num_args (s1); ++i)
1150 1.1 mrg {
1151 1.1 mrg t1 = gimple_call_arg (s1, i);
1152 1.1 mrg t2 = gimple_call_arg (s2, i);
1153 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2))
1154 1.1 mrg return false;
1155 1.1 mrg }
1156 1.1 mrg
1157 1.1 mrg lhs1 = gimple_get_lhs (s1);
1158 1.1 mrg lhs2 = gimple_get_lhs (s2);
1159 1.1 mrg if (lhs1 == NULL_TREE && lhs2 == NULL_TREE)
1160 1.1 mrg return true;
1161 1.1 mrg if (lhs1 == NULL_TREE || lhs2 == NULL_TREE)
1162 1.1 mrg return false;
1163 1.1 mrg if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME)
1164 1.1 mrg return tail_merge_valueize (lhs1) == tail_merge_valueize (lhs2);
1165 1.1 mrg return operand_equal_p (lhs1, lhs2, 0);
1166 1.1 mrg
1167 1.1 mrg case GIMPLE_ASSIGN:
1168 1.1 mrg if (gimple_assign_rhs_code (s1) != gimple_assign_rhs_code (s2))
1169 1.1 mrg return false;
1170 1.1 mrg
1171 1.1 mrg lhs1 = gimple_get_lhs (s1);
1172 1.1 mrg lhs2 = gimple_get_lhs (s2);
1173 1.1 mrg if (TREE_CODE (lhs1) != SSA_NAME
1174 1.1 mrg && TREE_CODE (lhs2) != SSA_NAME)
1175 1.1 mrg return (operand_equal_p (lhs1, lhs2, 0)
1176 1.1 mrg && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
1177 1.1 mrg gimple_assign_rhs1 (s2)));
1178 1.1 mrg
1179 1.1 mrg if (TREE_CODE (lhs1) != SSA_NAME
1180 1.1 mrg || TREE_CODE (lhs2) != SSA_NAME)
1181 1.1 mrg return false;
1182 1.1 mrg
1183 1.1 mrg gcc_checking_assert (gimple_num_args (s1) == gimple_num_args (s2));
1184 1.1 mrg for (i = 0; i < gimple_num_args (s1); ++i)
1185 1.1 mrg {
1186 1.1 mrg t1 = gimple_arg (s1, i);
1187 1.1 mrg t2 = gimple_arg (s2, i);
1188 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2))
1189 1.1 mrg return false;
1190 1.1 mrg }
1191 1.1 mrg return true;
1192 1.1 mrg
1193 1.1 mrg case GIMPLE_COND:
1194 1.1 mrg t1 = gimple_cond_lhs (s1);
1195 1.1 mrg t2 = gimple_cond_lhs (s2);
1196 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2))
1197 1.1 mrg return false;
1198 1.1 mrg
1199 1.1 mrg t1 = gimple_cond_rhs (s1);
1200 1.1 mrg t2 = gimple_cond_rhs (s2);
1201 1.1 mrg if (!gimple_operand_equal_value_p (t1, t2))
1202 1.1 mrg return false;
1203 1.1 mrg
1204 1.1 mrg code1 = gimple_cond_code (s1);
1205 1.1 mrg code2 = gimple_cond_code (s2);
1206 1.1 mrg inv_cond = (bitmap_bit_p (same_succ->inverse, bb1->index)
1207 1.1 mrg != bitmap_bit_p (same_succ->inverse, bb2->index));
1208 1.1 mrg if (inv_cond)
1209 1.1 mrg {
1210 1.1 mrg bool honor_nans = HONOR_NANS (t1);
1211 1.1 mrg code2 = invert_tree_comparison (code2, honor_nans);
1212 1.1 mrg }
1213 1.1 mrg return code1 == code2;
1214 1.1 mrg
1215 1.1 mrg default:
1216 1.1 mrg return false;
1217 1.1 mrg }
1218 1.1 mrg }
1219 1.1 mrg
1220 1.1 mrg /* Let GSI skip backwards over local defs. Return the earliest vuse in VUSE.
1221 1.1 mrg Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the
1222 1.1 mrg processed statements. */
1223 1.1 mrg
1224 1.1 mrg static void
1225 1.1 mrg gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
1226 1.1 mrg bool *vuse_escaped)
1227 1.1 mrg {
1228 1.1 mrg gimple *stmt;
1229 1.1 mrg tree lvuse;
1230 1.1 mrg
1231 1.1 mrg while (true)
1232 1.1 mrg {
1233 1.1 mrg if (gsi_end_p (*gsi))
1234 1.1 mrg return;
1235 1.1 mrg stmt = gsi_stmt (*gsi);
1236 1.1 mrg
1237 1.1 mrg lvuse = gimple_vuse (stmt);
1238 1.1 mrg if (lvuse != NULL_TREE)
1239 1.1 mrg {
1240 1.1 mrg *vuse = lvuse;
1241 1.1 mrg if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF))
1242 1.1 mrg *vuse_escaped = true;
1243 1.1 mrg }
1244 1.1 mrg
1245 1.1 mrg if (!stmt_local_def (stmt))
1246 1.1 mrg return;
1247 1.1 mrg gsi_prev_nondebug (gsi);
1248 1.1 mrg }
1249 1.1 mrg }
1250 1.1 mrg
1251 1.1 mrg /* Return true if equal (in the sense of gimple_equal_p) statements STMT1 and
1252 1.1 mrg STMT2 are allowed to be merged. */
1253 1.1 mrg
1254 1.1 mrg static bool
1255 1.1 mrg merge_stmts_p (gimple *stmt1, gimple *stmt2)
1256 1.1 mrg {
1257 1.1 mrg /* What could be better than this here is to blacklist the bb
1258 1.1 mrg containing the stmt, when encountering the stmt f.i. in
1259 1.1 mrg same_succ_hash. */
1260 1.1 mrg if (is_tm_ending (stmt1))
1261 1.1 mrg return false;
1262 1.1 mrg
1263 1.1 mrg /* Verify EH landing pads. */
1264 1.1 mrg if (lookup_stmt_eh_lp_fn (cfun, stmt1) != lookup_stmt_eh_lp_fn (cfun, stmt2))
1265 1.1 mrg return false;
1266 1.1 mrg
1267 1.1 mrg if (is_gimple_call (stmt1)
1268 1.1 mrg && gimple_call_internal_p (stmt1))
1269 1.1 mrg switch (gimple_call_internal_fn (stmt1))
1270 1.1 mrg {
1271 1.1 mrg case IFN_UBSAN_NULL:
1272 1.1 mrg case IFN_UBSAN_BOUNDS:
1273 1.1 mrg case IFN_UBSAN_VPTR:
1274 1.1 mrg case IFN_UBSAN_CHECK_ADD:
1275 1.1 mrg case IFN_UBSAN_CHECK_SUB:
1276 1.1 mrg case IFN_UBSAN_CHECK_MUL:
1277 1.1 mrg case IFN_UBSAN_OBJECT_SIZE:
1278 1.1 mrg case IFN_UBSAN_PTR:
1279 1.1 mrg case IFN_ASAN_CHECK:
1280 1.1 mrg /* For these internal functions, gimple_location is an implicit
1281 1.1 mrg parameter, which will be used explicitly after expansion.
1282 1.1 mrg Merging these statements may cause confusing line numbers in
1283 1.1 mrg sanitizer messages. */
1284 1.1 mrg return gimple_location (stmt1) == gimple_location (stmt2);
1285 1.1 mrg default:
1286 1.1 mrg break;
1287 1.1 mrg }
1288 1.1 mrg
1289 1.1 mrg return true;
1290 1.1 mrg }
1291 1.1 mrg
1292 1.1 mrg /* Determines whether BB1 and BB2 (members of same_succ) are duplicates. If so,
1293 1.1 mrg clusters them. */
1294 1.1 mrg
1295 1.1 mrg static void
1296 1.1 mrg find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2)
1297 1.1 mrg {
1298 1.1 mrg gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
1299 1.1 mrg gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
1300 1.1 mrg tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
1301 1.1 mrg bool vuse_escaped = false;
1302 1.1 mrg
1303 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
1304 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
1305 1.1 mrg
1306 1.1 mrg while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
1307 1.1 mrg {
1308 1.1 mrg gimple *stmt1 = gsi_stmt (gsi1);
1309 1.1 mrg gimple *stmt2 = gsi_stmt (gsi2);
1310 1.1 mrg
1311 1.1 mrg if (gimple_code (stmt1) == GIMPLE_LABEL
1312 1.1 mrg && gimple_code (stmt2) == GIMPLE_LABEL)
1313 1.1 mrg break;
1314 1.1 mrg
1315 1.1 mrg if (!gimple_equal_p (same_succ, stmt1, stmt2))
1316 1.1 mrg return;
1317 1.1 mrg
1318 1.1 mrg if (!merge_stmts_p (stmt1, stmt2))
1319 1.1 mrg return;
1320 1.1 mrg
1321 1.1 mrg gsi_prev_nondebug (&gsi1);
1322 1.1 mrg gsi_prev_nondebug (&gsi2);
1323 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
1324 1.1 mrg gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
1325 1.1 mrg }
1326 1.1 mrg
1327 1.1 mrg while (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
1328 1.1 mrg {
1329 1.1 mrg tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1)));
1330 1.1 mrg if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
1331 1.1 mrg return;
1332 1.1 mrg gsi_prev (&gsi1);
1333 1.1 mrg }
1334 1.1 mrg while (!gsi_end_p (gsi2) && gimple_code (gsi_stmt (gsi2)) == GIMPLE_LABEL)
1335 1.1 mrg {
1336 1.1 mrg tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi2)));
1337 1.1 mrg if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
1338 1.1 mrg return;
1339 1.1 mrg gsi_prev (&gsi2);
1340 1.1 mrg }
1341 1.1 mrg if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
1342 1.1 mrg return;
1343 1.1 mrg
1344 1.1 mrg /* If the incoming vuses are not the same, and the vuse escaped into an
1345 1.1 mrg SSA_OP_DEF, then merging the 2 blocks will change the value of the def,
1346 1.1 mrg which potentially means the semantics of one of the blocks will be changed.
1347 1.1 mrg TODO: make this check more precise. */
1348 1.1 mrg if (vuse_escaped && vuse1 != vuse2)
1349 1.1 mrg return;
1350 1.1 mrg
1351 1.1 mrg if (dump_file)
1352 1.1 mrg fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
1353 1.1 mrg bb1->index, bb2->index);
1354 1.1 mrg
1355 1.1 mrg set_cluster (bb1, bb2);
1356 1.1 mrg }
1357 1.1 mrg
1358 1.1 mrg /* Returns whether for all phis in DEST the phi alternatives for E1 and
1359 1.1 mrg E2 are equal. */
1360 1.1 mrg
1361 1.1 mrg static bool
1362 1.1 mrg same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
1363 1.1 mrg {
1364 1.1 mrg int n1 = e1->dest_idx, n2 = e2->dest_idx;
1365 1.1 mrg gphi_iterator gsi;
1366 1.1 mrg
1367 1.1 mrg for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
1368 1.1 mrg {
1369 1.1 mrg gphi *phi = gsi.phi ();
1370 1.1 mrg tree lhs = gimple_phi_result (phi);
1371 1.1 mrg tree val1 = gimple_phi_arg_def (phi, n1);
1372 1.1 mrg tree val2 = gimple_phi_arg_def (phi, n2);
1373 1.1 mrg
1374 1.1 mrg if (virtual_operand_p (lhs))
1375 1.1 mrg continue;
1376 1.1 mrg
1377 1.1 mrg if (operand_equal_for_phi_arg_p (val1, val2))
1378 1.1 mrg continue;
1379 1.1 mrg if (gvn_uses_equal (val1, val2))
1380 1.1 mrg continue;
1381 1.1 mrg
1382 1.1 mrg return false;
1383 1.1 mrg }
1384 1.1 mrg
1385 1.1 mrg return true;
1386 1.1 mrg }
1387 1.1 mrg
1388 1.1 mrg /* Returns whether for all successors of BB1 and BB2 (members of SAME_SUCC), the
1389 1.1 mrg phi alternatives for BB1 and BB2 are equal. */
1390 1.1 mrg
1391 1.1 mrg static bool
1392 1.1 mrg same_phi_alternatives (same_succ *same_succ, basic_block bb1, basic_block bb2)
1393 1.1 mrg {
1394 1.1 mrg unsigned int s;
1395 1.1 mrg bitmap_iterator bs;
1396 1.1 mrg edge e1, e2;
1397 1.1 mrg basic_block succ;
1398 1.1 mrg
1399 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same_succ->succs, 0, s, bs)
1400 1.1 mrg {
1401 1.1 mrg succ = BASIC_BLOCK_FOR_FN (cfun, s);
1402 1.1 mrg e1 = find_edge (bb1, succ);
1403 1.1 mrg e2 = find_edge (bb2, succ);
1404 1.1 mrg if (e1->flags & EDGE_COMPLEX
1405 1.1 mrg || e2->flags & EDGE_COMPLEX)
1406 1.1 mrg return false;
1407 1.1 mrg
1408 1.1 mrg /* For all phis in bb, the phi alternatives for e1 and e2 need to have
1409 1.1 mrg the same value. */
1410 1.1 mrg if (!same_phi_alternatives_1 (succ, e1, e2))
1411 1.1 mrg return false;
1412 1.1 mrg }
1413 1.1 mrg
1414 1.1 mrg return true;
1415 1.1 mrg }
1416 1.1 mrg
1417 1.1 mrg /* Return true if BB has non-vop phis. */
1418 1.1 mrg
1419 1.1 mrg static bool
1420 1.1 mrg bb_has_non_vop_phi (basic_block bb)
1421 1.1 mrg {
1422 1.1 mrg gimple_seq phis = phi_nodes (bb);
1423 1.1 mrg gimple *phi;
1424 1.1 mrg
1425 1.1 mrg if (phis == NULL)
1426 1.1 mrg return false;
1427 1.1 mrg
1428 1.1 mrg if (!gimple_seq_singleton_p (phis))
1429 1.1 mrg return true;
1430 1.1 mrg
1431 1.1 mrg phi = gimple_seq_first_stmt (phis);
1432 1.1 mrg return !virtual_operand_p (gimple_phi_result (phi));
1433 1.1 mrg }
1434 1.1 mrg
1435 1.1 mrg /* Returns true if redirecting the incoming edges of FROM to TO maintains the
1436 1.1 mrg invariant that uses in FROM are dominates by their defs. */
1437 1.1 mrg
1438 1.1 mrg static bool
1439 1.1 mrg deps_ok_for_redirect_from_bb_to_bb (basic_block from, basic_block to)
1440 1.1 mrg {
1441 1.1 mrg basic_block cd, dep_bb = BB_DEP_BB (to);
1442 1.1 mrg edge_iterator ei;
1443 1.1 mrg edge e;
1444 1.1 mrg
1445 1.1 mrg if (dep_bb == NULL)
1446 1.1 mrg return true;
1447 1.1 mrg
1448 1.1 mrg bitmap from_preds = BITMAP_ALLOC (NULL);
1449 1.1 mrg FOR_EACH_EDGE (e, ei, from->preds)
1450 1.1 mrg bitmap_set_bit (from_preds, e->src->index);
1451 1.1 mrg cd = nearest_common_dominator_for_set (CDI_DOMINATORS, from_preds);
1452 1.1 mrg BITMAP_FREE (from_preds);
1453 1.1 mrg
1454 1.1 mrg return dominated_by_p (CDI_DOMINATORS, dep_bb, cd);
1455 1.1 mrg }
1456 1.1 mrg
1457 1.1 mrg /* Returns true if replacing BB1 (or its replacement bb) by BB2 (or its
1458 1.1 mrg replacement bb) and vice versa maintains the invariant that uses in the
1459 1.1 mrg replacement are dominates by their defs. */
1460 1.1 mrg
1461 1.1 mrg static bool
1462 1.1 mrg deps_ok_for_redirect (basic_block bb1, basic_block bb2)
1463 1.1 mrg {
1464 1.1 mrg if (BB_CLUSTER (bb1) != NULL)
1465 1.1 mrg bb1 = BB_CLUSTER (bb1)->rep_bb;
1466 1.1 mrg
1467 1.1 mrg if (BB_CLUSTER (bb2) != NULL)
1468 1.1 mrg bb2 = BB_CLUSTER (bb2)->rep_bb;
1469 1.1 mrg
1470 1.1 mrg return (deps_ok_for_redirect_from_bb_to_bb (bb1, bb2)
1471 1.1 mrg && deps_ok_for_redirect_from_bb_to_bb (bb2, bb1));
1472 1.1 mrg }
1473 1.1 mrg
1474 1.1 mrg /* Within SAME_SUCC->bbs, find clusters of bbs which can be merged. */
1475 1.1 mrg
1476 1.1 mrg static void
1477 1.1 mrg find_clusters_1 (same_succ *same_succ)
1478 1.1 mrg {
1479 1.1 mrg basic_block bb1, bb2;
1480 1.1 mrg unsigned int i, j;
1481 1.1 mrg bitmap_iterator bi, bj;
1482 1.1 mrg int nr_comparisons;
1483 1.1 mrg int max_comparisons = param_max_tail_merge_comparisons;
1484 1.1 mrg
1485 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
1486 1.1 mrg {
1487 1.1 mrg bb1 = BASIC_BLOCK_FOR_FN (cfun, i);
1488 1.1 mrg
1489 1.1 mrg /* TODO: handle blocks with phi-nodes. We'll have to find corresponding
1490 1.1 mrg phi-nodes in bb1 and bb2, with the same alternatives for the same
1491 1.1 mrg preds. */
1492 1.1 mrg if (bb_has_non_vop_phi (bb1) || bb_has_eh_pred (bb1)
1493 1.1 mrg || bb_has_abnormal_pred (bb1))
1494 1.1 mrg continue;
1495 1.1 mrg
1496 1.1 mrg nr_comparisons = 0;
1497 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, i + 1, j, bj)
1498 1.1 mrg {
1499 1.1 mrg bb2 = BASIC_BLOCK_FOR_FN (cfun, j);
1500 1.1 mrg
1501 1.1 mrg if (bb_has_non_vop_phi (bb2) || bb_has_eh_pred (bb2)
1502 1.1 mrg || bb_has_abnormal_pred (bb2))
1503 1.1 mrg continue;
1504 1.1 mrg
1505 1.1 mrg if (BB_CLUSTER (bb1) != NULL && BB_CLUSTER (bb1) == BB_CLUSTER (bb2))
1506 1.1 mrg continue;
1507 1.1 mrg
1508 1.1 mrg /* Limit quadratic behavior. */
1509 1.1 mrg nr_comparisons++;
1510 1.1 mrg if (nr_comparisons > max_comparisons)
1511 1.1 mrg break;
1512 1.1 mrg
1513 1.1 mrg /* This is a conservative dependency check. We could test more
1514 1.1 mrg precise for allowed replacement direction. */
1515 1.1 mrg if (!deps_ok_for_redirect (bb1, bb2))
1516 1.1 mrg continue;
1517 1.1 mrg
1518 1.1 mrg if (!(same_phi_alternatives (same_succ, bb1, bb2)))
1519 1.1 mrg continue;
1520 1.1 mrg
1521 1.1 mrg find_duplicate (same_succ, bb1, bb2);
1522 1.1 mrg }
1523 1.1 mrg }
1524 1.1 mrg }
1525 1.1 mrg
1526 1.1 mrg /* Find clusters of bbs which can be merged. */
1527 1.1 mrg
1528 1.1 mrg static void
1529 1.1 mrg find_clusters (void)
1530 1.1 mrg {
1531 1.1 mrg same_succ *same;
1532 1.1 mrg
1533 1.1 mrg while (!worklist.is_empty ())
1534 1.1 mrg {
1535 1.1 mrg same = worklist.pop ();
1536 1.1 mrg same->in_worklist = false;
1537 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1538 1.1 mrg {
1539 1.1 mrg fprintf (dump_file, "processing worklist entry\n");
1540 1.1 mrg same_succ_print (dump_file, same);
1541 1.1 mrg }
1542 1.1 mrg find_clusters_1 (same);
1543 1.1 mrg }
1544 1.1 mrg }
1545 1.1 mrg
1546 1.1 mrg /* Returns the vop phi of BB, if any. */
1547 1.1 mrg
1548 1.1 mrg static gphi *
1549 1.1 mrg vop_phi (basic_block bb)
1550 1.1 mrg {
1551 1.1 mrg gphi *stmt;
1552 1.1 mrg gphi_iterator gsi;
1553 1.1 mrg for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1554 1.1 mrg {
1555 1.1 mrg stmt = gsi.phi ();
1556 1.1 mrg if (! virtual_operand_p (gimple_phi_result (stmt)))
1557 1.1 mrg continue;
1558 1.1 mrg return stmt;
1559 1.1 mrg }
1560 1.1 mrg return NULL;
1561 1.1 mrg }
1562 1.1 mrg
1563 1.1 mrg /* Redirect all edges from BB1 to BB2, removes BB1 and marks it as removed. */
1564 1.1 mrg
1565 1.1 mrg static void
1566 1.1 mrg replace_block_by (basic_block bb1, basic_block bb2)
1567 1.1 mrg {
1568 1.1 mrg edge pred_edge;
1569 1.1 mrg unsigned int i;
1570 1.1 mrg gphi *bb2_phi;
1571 1.1 mrg
1572 1.1 mrg bb2_phi = vop_phi (bb2);
1573 1.1 mrg
1574 1.1 mrg /* Mark the basic block as deleted. */
1575 1.1 mrg mark_basic_block_deleted (bb1);
1576 1.1 mrg
1577 1.1 mrg /* Redirect the incoming edges of bb1 to bb2. */
1578 1.1 mrg for (i = EDGE_COUNT (bb1->preds); i > 0 ; --i)
1579 1.1 mrg {
1580 1.1 mrg pred_edge = EDGE_PRED (bb1, i - 1);
1581 1.1 mrg pred_edge = redirect_edge_and_branch (pred_edge, bb2);
1582 1.1 mrg gcc_assert (pred_edge != NULL);
1583 1.1 mrg
1584 1.1 mrg if (bb2_phi == NULL)
1585 1.1 mrg continue;
1586 1.1 mrg
1587 1.1 mrg /* The phi might have run out of capacity when the redirect added an
1588 1.1 mrg argument, which means it could have been replaced. Refresh it. */
1589 1.1 mrg bb2_phi = vop_phi (bb2);
1590 1.1 mrg
1591 1.1 mrg add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
1592 1.1 mrg pred_edge, UNKNOWN_LOCATION);
1593 1.1 mrg }
1594 1.1 mrg
1595 1.1 mrg
1596 1.1 mrg /* Merge the outgoing edge counts from bb1 onto bb2. */
1597 1.1 mrg edge e1, e2;
1598 1.1 mrg edge_iterator ei;
1599 1.1 mrg
1600 1.1 mrg if (bb2->count.initialized_p ())
1601 1.1 mrg FOR_EACH_EDGE (e1, ei, bb1->succs)
1602 1.1 mrg {
1603 1.1 mrg e2 = find_edge (bb2, e1->dest);
1604 1.1 mrg gcc_assert (e2);
1605 1.1 mrg
1606 1.1 mrg /* If probabilities are same, we are done.
1607 1.1 mrg If counts are nonzero we can distribute accordingly. In remaining
1608 1.1 mrg cases just avreage the values and hope for the best. */
1609 1.1 mrg e2->probability = e1->probability.combine_with_count
1610 1.1 mrg (bb1->count, e2->probability, bb2->count);
1611 1.1 mrg }
1612 1.1 mrg bb2->count += bb1->count;
1613 1.1 mrg
1614 1.1 mrg /* Move over any user labels from bb1 after the bb2 labels. */
1615 1.1 mrg gimple_stmt_iterator gsi1 = gsi_start_bb (bb1);
1616 1.1 mrg if (!gsi_end_p (gsi1) && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
1617 1.1 mrg {
1618 1.1 mrg gimple_stmt_iterator gsi2 = gsi_after_labels (bb2);
1619 1.1 mrg while (!gsi_end_p (gsi1)
1620 1.1 mrg && gimple_code (gsi_stmt (gsi1)) == GIMPLE_LABEL)
1621 1.1 mrg {
1622 1.1 mrg tree label = gimple_label_label (as_a <glabel *> (gsi_stmt (gsi1)));
1623 1.1 mrg gcc_assert (!DECL_NONLOCAL (label) && !FORCED_LABEL (label));
1624 1.1 mrg if (DECL_ARTIFICIAL (label))
1625 1.1 mrg gsi_next (&gsi1);
1626 1.1 mrg else
1627 1.1 mrg gsi_move_before (&gsi1, &gsi2);
1628 1.1 mrg }
1629 1.1 mrg }
1630 1.1 mrg
1631 1.1 mrg /* Clear range info from all stmts in BB2 -- this transformation
1632 1.1 mrg could make them out of date. */
1633 1.1 mrg reset_flow_sensitive_info_in_bb (bb2);
1634 1.1 mrg
1635 1.1 mrg /* Do updates that use bb1, before deleting bb1. */
1636 1.1 mrg release_last_vdef (bb1);
1637 1.1 mrg same_succ_flush_bb (bb1);
1638 1.1 mrg
1639 1.1 mrg delete_basic_block (bb1);
1640 1.1 mrg }
1641 1.1 mrg
1642 1.1 mrg /* Bbs for which update_debug_stmt need to be called. */
1643 1.1 mrg
1644 1.1 mrg static bitmap update_bbs;
1645 1.1 mrg
1646 1.1 mrg /* For each cluster in all_clusters, merge all cluster->bbs. Returns
1647 1.1 mrg number of bbs removed. */
1648 1.1 mrg
1649 1.1 mrg static int
1650 1.1 mrg apply_clusters (void)
1651 1.1 mrg {
1652 1.1 mrg basic_block bb1, bb2;
1653 1.1 mrg bb_cluster *c;
1654 1.1 mrg unsigned int i, j;
1655 1.1 mrg bitmap_iterator bj;
1656 1.1 mrg int nr_bbs_removed = 0;
1657 1.1 mrg
1658 1.1 mrg for (i = 0; i < all_clusters.length (); ++i)
1659 1.1 mrg {
1660 1.1 mrg c = all_clusters[i];
1661 1.1 mrg if (c == NULL)
1662 1.1 mrg continue;
1663 1.1 mrg
1664 1.1 mrg bb2 = c->rep_bb;
1665 1.1 mrg bitmap_set_bit (update_bbs, bb2->index);
1666 1.1 mrg
1667 1.1 mrg bitmap_clear_bit (c->bbs, bb2->index);
1668 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (c->bbs, 0, j, bj)
1669 1.1 mrg {
1670 1.1 mrg bb1 = BASIC_BLOCK_FOR_FN (cfun, j);
1671 1.1 mrg bitmap_clear_bit (update_bbs, bb1->index);
1672 1.1 mrg
1673 1.1 mrg replace_block_by (bb1, bb2);
1674 1.1 mrg nr_bbs_removed++;
1675 1.1 mrg }
1676 1.1 mrg }
1677 1.1 mrg
1678 1.1 mrg return nr_bbs_removed;
1679 1.1 mrg }
1680 1.1 mrg
1681 1.1 mrg /* Resets debug statement STMT if it has uses that are not dominated by their
1682 1.1 mrg defs. */
1683 1.1 mrg
1684 1.1 mrg static void
1685 1.1 mrg update_debug_stmt (gimple *stmt)
1686 1.1 mrg {
1687 1.1 mrg use_operand_p use_p;
1688 1.1 mrg ssa_op_iter oi;
1689 1.1 mrg basic_block bbuse;
1690 1.1 mrg
1691 1.1 mrg if (!gimple_debug_bind_p (stmt))
1692 1.1 mrg return;
1693 1.1 mrg
1694 1.1 mrg bbuse = gimple_bb (stmt);
1695 1.1 mrg FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, oi, SSA_OP_USE)
1696 1.1 mrg {
1697 1.1 mrg tree name = USE_FROM_PTR (use_p);
1698 1.1 mrg gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1699 1.1 mrg basic_block bbdef = gimple_bb (def_stmt);
1700 1.1 mrg if (bbdef == NULL || bbuse == bbdef
1701 1.1 mrg || dominated_by_p (CDI_DOMINATORS, bbuse, bbdef))
1702 1.1 mrg continue;
1703 1.1 mrg
1704 1.1 mrg gimple_debug_bind_reset_value (stmt);
1705 1.1 mrg update_stmt (stmt);
1706 1.1 mrg break;
1707 1.1 mrg }
1708 1.1 mrg }
1709 1.1 mrg
1710 1.1 mrg /* Resets all debug statements that have uses that are not
1711 1.1 mrg dominated by their defs. */
1712 1.1 mrg
1713 1.1 mrg static void
1714 1.1 mrg update_debug_stmts (void)
1715 1.1 mrg {
1716 1.1 mrg basic_block bb;
1717 1.1 mrg bitmap_iterator bi;
1718 1.1 mrg unsigned int i;
1719 1.1 mrg
1720 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (update_bbs, 0, i, bi)
1721 1.1 mrg {
1722 1.1 mrg gimple *stmt;
1723 1.1 mrg gimple_stmt_iterator gsi;
1724 1.1 mrg
1725 1.1 mrg bb = BASIC_BLOCK_FOR_FN (cfun, i);
1726 1.1 mrg for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1727 1.1 mrg {
1728 1.1 mrg stmt = gsi_stmt (gsi);
1729 1.1 mrg if (!is_gimple_debug (stmt))
1730 1.1 mrg continue;
1731 1.1 mrg update_debug_stmt (stmt);
1732 1.1 mrg }
1733 1.1 mrg }
1734 1.1 mrg }
1735 1.1 mrg
1736 1.1 mrg /* Runs tail merge optimization. */
1737 1.1 mrg
1738 1.1 mrg unsigned int
1739 1.1 mrg tail_merge_optimize (bool need_crit_edge_split)
1740 1.1 mrg {
1741 1.1 mrg int nr_bbs_removed_total = 0;
1742 1.1 mrg int nr_bbs_removed;
1743 1.1 mrg bool loop_entered = false;
1744 1.1 mrg int iteration_nr = 0;
1745 1.1 mrg int max_iterations = param_max_tail_merge_iterations;
1746 1.1 mrg
1747 1.1 mrg if (!flag_tree_tail_merge
1748 1.1 mrg || max_iterations == 0)
1749 1.1 mrg return 0;
1750 1.1 mrg
1751 1.1 mrg timevar_push (TV_TREE_TAIL_MERGE);
1752 1.1 mrg
1753 1.1 mrg /* Re-split critical edges when PRE did a CFG cleanup. */
1754 1.1 mrg if (need_crit_edge_split)
1755 1.1 mrg split_edges_for_insertion ();
1756 1.1 mrg
1757 1.1 mrg if (!dom_info_available_p (CDI_DOMINATORS))
1758 1.1 mrg {
1759 1.1 mrg /* PRE can leave us with unreachable blocks, remove them now. */
1760 1.1 mrg delete_unreachable_blocks ();
1761 1.1 mrg calculate_dominance_info (CDI_DOMINATORS);
1762 1.1 mrg }
1763 1.1 mrg init_worklist ();
1764 1.1 mrg
1765 1.1 mrg while (!worklist.is_empty ())
1766 1.1 mrg {
1767 1.1 mrg if (!loop_entered)
1768 1.1 mrg {
1769 1.1 mrg loop_entered = true;
1770 1.1 mrg alloc_cluster_vectors ();
1771 1.1 mrg update_bbs = BITMAP_ALLOC (NULL);
1772 1.1 mrg }
1773 1.1 mrg else
1774 1.1 mrg reset_cluster_vectors ();
1775 1.1 mrg
1776 1.1 mrg iteration_nr++;
1777 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1778 1.1 mrg fprintf (dump_file, "worklist iteration #%d\n", iteration_nr);
1779 1.1 mrg
1780 1.1 mrg find_clusters ();
1781 1.1 mrg gcc_assert (worklist.is_empty ());
1782 1.1 mrg if (all_clusters.is_empty ())
1783 1.1 mrg break;
1784 1.1 mrg
1785 1.1 mrg nr_bbs_removed = apply_clusters ();
1786 1.1 mrg nr_bbs_removed_total += nr_bbs_removed;
1787 1.1 mrg if (nr_bbs_removed == 0)
1788 1.1 mrg break;
1789 1.1 mrg
1790 1.1 mrg free_dominance_info (CDI_DOMINATORS);
1791 1.1 mrg
1792 1.1 mrg if (iteration_nr == max_iterations)
1793 1.1 mrg break;
1794 1.1 mrg
1795 1.1 mrg calculate_dominance_info (CDI_DOMINATORS);
1796 1.1 mrg update_worklist ();
1797 1.1 mrg }
1798 1.1 mrg
1799 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1800 1.1 mrg fprintf (dump_file, "htab collision / search: %f\n",
1801 1.1 mrg same_succ_htab->collisions ());
1802 1.1 mrg
1803 1.1 mrg if (nr_bbs_removed_total > 0)
1804 1.1 mrg {
1805 1.1 mrg if (MAY_HAVE_DEBUG_BIND_STMTS)
1806 1.1 mrg {
1807 1.1 mrg calculate_dominance_info (CDI_DOMINATORS);
1808 1.1 mrg update_debug_stmts ();
1809 1.1 mrg }
1810 1.1 mrg
1811 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1812 1.1 mrg {
1813 1.1 mrg fprintf (dump_file, "Before TODOs.\n");
1814 1.1 mrg dump_function_to_file (current_function_decl, dump_file, dump_flags);
1815 1.1 mrg }
1816 1.1 mrg
1817 1.1 mrg mark_virtual_operands_for_renaming (cfun);
1818 1.1 mrg }
1819 1.1 mrg
1820 1.1 mrg delete_worklist ();
1821 1.1 mrg if (loop_entered)
1822 1.1 mrg {
1823 1.1 mrg delete_cluster_vectors ();
1824 1.1 mrg BITMAP_FREE (update_bbs);
1825 1.1 mrg }
1826 1.1 mrg
1827 1.1 mrg timevar_pop (TV_TREE_TAIL_MERGE);
1828 1.1 mrg
1829 1.1 mrg return 0;
1830 1.1 mrg }
1831