PR rtl-optimization/88470
[official-gcc.git] / gcc / gimple-ssa-split-paths.c
blob915965260459e045af73ed36900f979def3fc27a
1 /* Support routines for Splitting Paths to loop backedges
2 Copyright (C) 2015-2018 Free Software Foundation, Inc.
3 Contributed by Ajit Kumar Agarwal <ajitkum@xilinx.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "tree-pass.h"
28 #include "tree-cfg.h"
29 #include "cfganal.h"
30 #include "cfgloop.h"
31 #include "gimple-iterator.h"
32 #include "tracer.h"
33 #include "predict.h"
34 #include "params.h"
35 #include "gimple-ssa.h"
36 #include "tree-phinodes.h"
37 #include "ssa-iterators.h"
39 /* Given LATCH, the latch block in a loop, see if the shape of the
40 path reaching LATCH is suitable for being split by duplication.
41 If so, return the block that will be duplicated into its predecessor
42 paths. Else return NULL. */
44 static basic_block
45 find_block_to_duplicate_for_splitting_paths (basic_block latch)
47 /* We should have simple latches at this point. So the latch should
48 have a single successor. This implies the predecessor of the latch
49 likely has the loop exit. And it's that predecessor we're most
50 interested in. To keep things simple, we're going to require that
51 the latch have a single predecessor too. */
52 if (single_succ_p (latch) && single_pred_p (latch))
54 basic_block bb = get_immediate_dominator (CDI_DOMINATORS, latch);
55 gcc_assert (single_pred_edge (latch)->src == bb);
57 /* If BB has been marked as not to be duplicated, then honor that
58 request. */
59 if (ignore_bb_p (bb))
60 return NULL;
62 gimple *last = gsi_stmt (gsi_last_nondebug_bb (bb));
63 /* The immediate dominator of the latch must end in a conditional. */
64 if (!last || gimple_code (last) != GIMPLE_COND)
65 return NULL;
67 /* We're hoping that BB is a join point for an IF-THEN-ELSE diamond
68 region. Verify that it is.
70 First, verify that BB has two predecessors (each arm of the
71 IF-THEN-ELSE) and two successors (the latch and exit). */
72 if (EDGE_COUNT (bb->preds) == 2 && EDGE_COUNT (bb->succs) == 2)
74 /* Now verify that BB's immediate dominator ends in a
75 conditional as well. */
76 basic_block bb_idom = get_immediate_dominator (CDI_DOMINATORS, bb);
77 gimple *last = gsi_stmt (gsi_last_nondebug_bb (bb_idom));
78 if (!last || gimple_code (last) != GIMPLE_COND)
79 return NULL;
81 /* And that BB's immediate dominator's successors are the
82 predecessors of BB or BB itself. */
83 if (!(EDGE_PRED (bb, 0)->src == bb_idom
84 || find_edge (bb_idom, EDGE_PRED (bb, 0)->src))
85 || !(EDGE_PRED (bb, 1)->src == bb_idom
86 || find_edge (bb_idom, EDGE_PRED (bb, 1)->src)))
87 return NULL;
89 /* And that the predecessors of BB each have a single successor
90 or are BB's immediate domiator itself. */
91 if (!(EDGE_PRED (bb, 0)->src == bb_idom
92 || single_succ_p (EDGE_PRED (bb, 0)->src))
93 || !(EDGE_PRED (bb, 1)->src == bb_idom
94 || single_succ_p (EDGE_PRED (bb, 1)->src)))
95 return NULL;
97 /* So at this point we have a simple diamond for an IF-THEN-ELSE
98 construct starting at BB_IDOM, with a join point at BB. BB
99 pass control outside the loop or to the loop latch.
101 We're going to want to create two duplicates of BB, one for
102 each successor of BB_IDOM. */
103 return bb;
106 return NULL;
109 /* Return the number of non-debug statements in a block. */
110 static unsigned int
111 count_stmts_in_block (basic_block bb)
113 gimple_stmt_iterator gsi;
114 unsigned int num_stmts = 0;
116 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
118 gimple *stmt = gsi_stmt (gsi);
119 if (!is_gimple_debug (stmt))
120 num_stmts++;
122 return num_stmts;
125 /* Return TRUE if CODE represents a tree code that is not likely to
126 be easily if-convertable because it likely expands into multiple
127 insns, FALSE otherwise. */
128 static bool
129 poor_ifcvt_candidate_code (enum tree_code code)
131 return (code == MIN_EXPR
132 || code == MAX_EXPR
133 || code == ABS_EXPR
134 || code == COND_EXPR
135 || code == CALL_EXPR);
138 /* Return TRUE if BB is a reasonable block to duplicate by examining
139 its size, false otherwise. BB will always be a loop latch block.
141 Things to consider:
143 We do not want to spoil if-conversion if at all possible.
145 Most of the benefit seems to be from eliminating the unconditional
146 jump rather than CSE/DCE opportunities. So favor duplicating
147 small latches. A latch with just a conditional branch is ideal.
149 CSE/DCE opportunties crop up when statements from the predecessors
150 feed statements in the latch and allow statements in the latch to
151 simplify. */
153 static bool
154 is_feasible_trace (basic_block bb)
156 basic_block pred1 = EDGE_PRED (bb, 0)->src;
157 basic_block pred2 = EDGE_PRED (bb, 1)->src;
158 int num_stmts_in_join = count_stmts_in_block (bb);
159 int num_stmts_in_pred1
160 = EDGE_COUNT (pred1->succs) == 1 ? count_stmts_in_block (pred1) : 0;
161 int num_stmts_in_pred2
162 = EDGE_COUNT (pred2->succs) == 1 ? count_stmts_in_block (pred2) : 0;
164 /* This is meant to catch cases that are likely opportunities for
165 if-conversion. Essentially we look for the case where
166 BB's predecessors are both single statement blocks where
167 the output of that statement feed the same PHI in BB. */
168 if (num_stmts_in_pred1 == 1 && num_stmts_in_pred2 == 1)
170 gimple *stmt1 = last_and_only_stmt (pred1);
171 gimple *stmt2 = last_and_only_stmt (pred2);
173 if (stmt1 && stmt2
174 && gimple_code (stmt1) == GIMPLE_ASSIGN
175 && gimple_code (stmt2) == GIMPLE_ASSIGN)
177 enum tree_code code1 = gimple_assign_rhs_code (stmt1);
178 enum tree_code code2 = gimple_assign_rhs_code (stmt2);
180 if (!poor_ifcvt_candidate_code (code1)
181 && !poor_ifcvt_candidate_code (code2))
183 tree lhs1 = gimple_assign_lhs (stmt1);
184 tree lhs2 = gimple_assign_lhs (stmt2);
185 gimple_stmt_iterator gsi;
186 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
188 gimple *phi = gsi_stmt (gsi);
189 if ((gimple_phi_arg_def (phi, 0) == lhs1
190 && gimple_phi_arg_def (phi, 1) == lhs2)
191 || (gimple_phi_arg_def (phi, 1) == lhs1
192 && gimple_phi_arg_def (phi, 0) == lhs2))
194 if (dump_file && (dump_flags & TDF_DETAILS))
195 fprintf (dump_file,
196 "Block %d appears to be a join point for "
197 "if-convertable diamond.\n",
198 bb->index);
199 return false;
206 /* Canonicalize the form. */
207 if (num_stmts_in_pred1 == 0 && num_stmts_in_pred2 == 1)
209 std::swap (pred1, pred2);
210 std::swap (num_stmts_in_pred1, num_stmts_in_pred2);
213 /* Another variant. This one is half-diamond. */
214 if (num_stmts_in_pred1 == 1 && num_stmts_in_pred2 == 0
215 && dominated_by_p (CDI_DOMINATORS, pred1, pred2))
217 gimple *stmt1 = last_and_only_stmt (pred1);
219 /* The only statement in PRED1 must be an assignment that is
220 not a good candidate for if-conversion. This may need some
221 generalization. */
222 if (stmt1 && gimple_code (stmt1) == GIMPLE_ASSIGN)
224 enum tree_code code1 = gimple_assign_rhs_code (stmt1);
226 if (!poor_ifcvt_candidate_code (code1))
228 tree lhs1 = gimple_assign_lhs (stmt1);
229 tree rhs1 = gimple_assign_rhs1 (stmt1);
231 gimple_stmt_iterator gsi;
232 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
234 gimple *phi = gsi_stmt (gsi);
235 if ((gimple_phi_arg_def (phi, 0) == lhs1
236 && gimple_phi_arg_def (phi, 1) == rhs1)
237 || (gimple_phi_arg_def (phi, 1) == lhs1
238 && gimple_phi_arg_def (phi, 0) == rhs1))
240 if (dump_file && (dump_flags & TDF_DETAILS))
241 fprintf (dump_file,
242 "Block %d appears to be a join point for "
243 "if-convertable half-diamond.\n",
244 bb->index);
245 return false;
252 /* Canonicalize the form. */
253 if (num_stmts_in_pred1 == 0 && num_stmts_in_pred2 == 1)
255 std::swap (pred1, pred2);
256 std::swap (num_stmts_in_pred1, num_stmts_in_pred2);
259 /* Another variant. This one is half-diamond. */
260 if (num_stmts_in_pred1 == 1 && num_stmts_in_pred2 == 0
261 && dominated_by_p (CDI_DOMINATORS, pred1, pred2))
263 gimple *stmt1 = last_and_only_stmt (pred1);
265 /* The only statement in PRED1 must be an assignment that is
266 not a good candidate for if-conversion. This may need some
267 generalization. */
268 if (stmt1 && gimple_code (stmt1) == GIMPLE_ASSIGN)
270 enum tree_code code1 = gimple_assign_rhs_code (stmt1);
272 if (!poor_ifcvt_candidate_code (code1))
274 tree lhs1 = gimple_assign_lhs (stmt1);
275 tree rhs1 = gimple_assign_rhs1 (stmt1);
277 gimple_stmt_iterator gsi;
278 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
280 gimple *phi = gsi_stmt (gsi);
281 if ((gimple_phi_arg_def (phi, 0) == lhs1
282 && gimple_phi_arg_def (phi, 1) == rhs1)
283 || (gimple_phi_arg_def (phi, 1) == lhs1
284 && gimple_phi_arg_def (phi, 0) == rhs1))
286 if (dump_file && (dump_flags & TDF_DETAILS))
287 fprintf (dump_file,
288 "Block %d appears to be a join point for "
289 "if-convertable half-diamond.\n",
290 bb->index);
291 return false;
298 /* If the joiner has no PHIs with useful uses there is zero chance
299 of CSE/DCE/jump-threading possibilities exposed by duplicating it. */
300 bool found_useful_phi = false;
301 for (gphi_iterator si = gsi_start_phis (bb); ! gsi_end_p (si);
302 gsi_next (&si))
304 gphi *phi = si.phi ();
305 use_operand_p use_p;
306 imm_use_iterator iter;
307 FOR_EACH_IMM_USE_FAST (use_p, iter, gimple_phi_result (phi))
309 gimple *stmt = USE_STMT (use_p);
310 if (is_gimple_debug (stmt))
311 continue;
312 /* If there's a use in the joiner this might be a CSE/DCE
313 opportunity. */
314 if (gimple_bb (stmt) == bb)
316 found_useful_phi = true;
317 break;
319 /* If the use is on a loop header PHI and on one path the
320 value is unchanged this might expose a jump threading
321 opportunity. */
322 if (gimple_code (stmt) == GIMPLE_PHI
323 && gimple_bb (stmt) == bb->loop_father->header
324 /* But for memory the PHI alone isn't good enough. */
325 && ! virtual_operand_p (gimple_phi_result (stmt)))
327 bool found_unchanged_path = false;
328 for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
329 if (gimple_phi_arg_def (phi, i) == gimple_phi_result (stmt))
331 found_unchanged_path = true;
332 break;
334 /* If we found an unchanged path this can only be a threading
335 opportunity if we have uses of the loop header PHI result
336 in a stmt dominating the merge block. Otherwise the
337 splitting may prevent if-conversion. */
338 if (found_unchanged_path)
340 use_operand_p use2_p;
341 imm_use_iterator iter2;
342 FOR_EACH_IMM_USE_FAST (use2_p, iter2, gimple_phi_result (stmt))
344 gimple *use_stmt = USE_STMT (use2_p);
345 if (is_gimple_debug (use_stmt))
346 continue;
347 basic_block use_bb = gimple_bb (use_stmt);
348 if (use_bb != bb
349 && dominated_by_p (CDI_DOMINATORS, bb, use_bb))
351 if (gcond *cond = dyn_cast <gcond *> (use_stmt))
352 if (gimple_cond_code (cond) == EQ_EXPR
353 || gimple_cond_code (cond) == NE_EXPR)
354 found_useful_phi = true;
355 break;
359 if (found_useful_phi)
360 break;
363 if (found_useful_phi)
364 break;
366 /* There is one exception namely a controlling condition we can propagate
367 an equivalence from to the joiner. */
368 bool found_cprop_opportunity = false;
369 basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb);
370 gcond *cond = as_a <gcond *> (last_stmt (dom));
371 if (gimple_cond_code (cond) == EQ_EXPR
372 || gimple_cond_code (cond) == NE_EXPR)
373 for (unsigned i = 0; i < 2; ++i)
375 tree op = gimple_op (cond, i);
376 if (TREE_CODE (op) == SSA_NAME)
378 use_operand_p use_p;
379 imm_use_iterator iter;
380 FOR_EACH_IMM_USE_FAST (use_p, iter, op)
382 if (is_gimple_debug (USE_STMT (use_p)))
383 continue;
384 if (gimple_bb (USE_STMT (use_p)) == bb)
386 found_cprop_opportunity = true;
387 break;
391 if (found_cprop_opportunity)
392 break;
395 if (! found_useful_phi && ! found_cprop_opportunity)
397 if (dump_file && (dump_flags & TDF_DETAILS))
398 fprintf (dump_file,
399 "Block %d is a join that does not expose CSE/DCE/jump-thread "
400 "opportunities when duplicated.\n",
401 bb->index);
402 return false;
405 /* We may want something here which looks at dataflow and tries
406 to guess if duplication of BB is likely to result in simplification
407 of instructions in BB in either the original or the duplicate. */
409 /* Upper Hard limit on the number statements to copy. */
410 if (num_stmts_in_join
411 >= PARAM_VALUE (PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS))
412 return false;
414 return true;
417 /* If the immediate dominator of the latch of the loop is
418 block with conditional branch, then the loop latch is
419 duplicated to its predecessors path preserving the SSA
420 semantics.
422 CFG before transformation.
427 +---->3
428 | / \
429 | / \
430 | 4 5
431 | \ /
432 | \ /
434 | / \
435 | / \
436 | 8 7
437 | | |
438 ---+ E
442 Block 8 is the latch. We're going to make copies of block 6 (9 & 10)
443 and wire things up so they look like this:
448 +---->3
449 | / \
450 | / \
451 | 4 5
452 | | |
453 | | |
454 | 9 10
455 | |\ /|
456 | | \ / |
457 | | 7 |
458 | | | |
459 | | E |
460 | | |
461 | \ /
462 | \ /
463 +-----8
466 Blocks 9 and 10 will get merged into blocks 4 & 5 respectively which
467 enables CSE, DCE and other optimizations to occur on a larger block
468 of code. */
470 static bool
471 split_paths ()
473 bool changed = false;
474 loop_p loop;
476 loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
477 initialize_original_copy_tables ();
478 calculate_dominance_info (CDI_DOMINATORS);
480 FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
482 /* Only split paths if we are optimizing this loop for speed. */
483 if (!optimize_loop_for_speed_p (loop))
484 continue;
486 /* See if there is a block that we can duplicate to split the
487 path to the loop latch. */
488 basic_block bb
489 = find_block_to_duplicate_for_splitting_paths (loop->latch);
491 /* BB is the merge point for an IF-THEN-ELSE we want to transform.
493 Essentially we want to create a duplicate of bb and redirect the
494 first predecessor of BB to the duplicate (leaving the second
495 predecessor as is. This will split the path leading to the latch
496 re-using BB to avoid useless copying. */
497 if (bb && is_feasible_trace (bb))
499 if (dump_file && (dump_flags & TDF_DETAILS))
500 fprintf (dump_file,
501 "Duplicating join block %d into predecessor paths\n",
502 bb->index);
503 basic_block pred0 = EDGE_PRED (bb, 0)->src;
504 if (EDGE_COUNT (pred0->succs) != 1)
505 pred0 = EDGE_PRED (bb, 1)->src;
506 transform_duplicate (pred0, bb);
507 changed = true;
509 /* If BB has an outgoing edge marked as IRREDUCIBLE, then
510 duplicating BB may result in an irreducible region turning
511 into a natural loop.
513 Long term we might want to hook this into the block
514 duplication code, but as we've seen with similar changes
515 for edge removal, that can be somewhat risky. */
516 if (EDGE_SUCC (bb, 0)->flags & EDGE_IRREDUCIBLE_LOOP
517 || EDGE_SUCC (bb, 1)->flags & EDGE_IRREDUCIBLE_LOOP)
519 if (dump_file && (dump_flags & TDF_DETAILS))
520 fprintf (dump_file,
521 "Join block %d has EDGE_IRREDUCIBLE_LOOP set. "
522 "Scheduling loop fixups.\n",
523 bb->index);
524 loops_state_set (LOOPS_NEED_FIXUP);
529 loop_optimizer_finalize ();
530 free_original_copy_tables ();
531 return changed;
534 /* Main entry point for splitting paths. Returns TODO_cleanup_cfg if any
535 paths where split, otherwise return zero. */
537 static unsigned int
538 execute_split_paths ()
540 /* If we don't have at least 2 real blocks and backedges in the
541 CFG, then there's no point in trying to perform path splitting. */
542 if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1
543 || !mark_dfs_back_edges ())
544 return 0;
546 bool changed = split_paths();
547 if (changed)
548 free_dominance_info (CDI_DOMINATORS);
550 return changed ? TODO_cleanup_cfg : 0;
553 static bool
554 gate_split_paths ()
556 return flag_split_paths;
559 namespace {
561 const pass_data pass_data_split_paths =
563 GIMPLE_PASS, /* type */
564 "split-paths", /* name */
565 OPTGROUP_NONE, /* optinfo_flags */
566 TV_SPLIT_PATHS, /* tv_id */
567 PROP_ssa, /* properties_required */
568 0, /* properties_provided */
569 0, /* properties_destroyed */
570 0, /* todo_flags_start */
571 TODO_update_ssa, /* todo_flags_finish */
574 class pass_split_paths : public gimple_opt_pass
576 public:
577 pass_split_paths (gcc::context *ctxt)
578 : gimple_opt_pass (pass_data_split_paths, ctxt)
580 /* opt_pass methods: */
581 opt_pass * clone () { return new pass_split_paths (m_ctxt); }
582 virtual bool gate (function *) { return gate_split_paths (); }
583 virtual unsigned int execute (function *) { return execute_split_paths (); }
585 }; // class pass_split_paths
587 } // anon namespace
589 gimple_opt_pass *
590 make_pass_split_paths (gcc::context *ctxt)
592 return new pass_split_paths (ctxt);