]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-ssa-loop-unswitch.cc
ada: Fix alignment violation for chain of aligned and misaligned composite types
[thirdparty/gcc.git] / gcc / tree-ssa-loop-unswitch.cc
1 /* Loop unswitching.
2 Copyright (C) 2004-2025 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "tree.h"
25 #include "gimple.h"
26 #include "tree-pass.h"
27 #include "ssa.h"
28 #include "fold-const.h"
29 #include "gimplify.h"
30 #include "tree-cfg.h"
31 #include "tree-ssa.h"
32 #include "tree-ssa-loop-niter.h"
33 #include "tree-ssa-loop.h"
34 #include "tree-into-ssa.h"
35 #include "cfgloop.h"
36 #include "tree-inline.h"
37 #include "gimple-iterator.h"
38 #include "cfghooks.h"
39 #include "tree-ssa-loop-manip.h"
40 #include "tree-vectorizer.h"
41 #include "tree-pretty-print.h"
42 #include "gimple-range.h"
43 #include "dbgcnt.h"
44 #include "cfganal.h"
45
46 /* This file implements the loop unswitching, i.e. transformation of loops like
47
48 while (A)
49 {
50 if (inv)
51 B;
52
53 X;
54
55 if (!inv)
56 C;
57 }
58
59 where inv is the loop invariant, into
60
61 if (inv)
62 {
63 while (A)
64 {
65 B;
66 X;
67 }
68 }
69 else
70 {
71 while (A)
72 {
73 X;
74 C;
75 }
76 }
77
78 Inv is considered invariant iff the values it compares are both invariant;
79 tree-ssa-loop-im.cc ensures that all the suitable conditions are in this
80 shape. */
81
82 /* Loop unswitching algorithm for innermost loops works in the following steps:
83
84 1) Number of instructions is estimated for each BB that belongs to a loop.
85 2) Unswitching candidates are found for gcond and gswitch statements
86 (note that an unswitching predicate for a gswitch actually corresponds
87 to a non-default edge so it can contain multiple cases).
88 3) The so called unswitch predicates are stored in a cache where the
89 gimple_uid of the last stmt in a basic-block is an index to the cache.
90 4) We consider one by one the unswitching candidates and calculate BBs that
91 will be reachable in the unswitch version.
92 5) A selected predicate is chosen and we simplify the CFG (dead edges) in
93 both versions of the loop. We utilize both Ranger for condition
94 simplification and also symbol equivalence. The folded if conditions
95 are replaced with true/false values, while for gswitch we mark the
96 corresponding edges with a pass-defined unreachable flag.
97 6) Every time we unswitch a loop, we save unswitch_predicate to a vector
98 together with information if true or false edge was taken. Doing that
99 we have a so called PREDICATE_PATH that is utilized for simplification
100 of the cloned loop.
101 7) The process is repeated until we reach a growth threshold or all
102 unswitching opportunities are taken. */
103
104 /* A tuple that holds a GENERIC condition and value range for an unswitching
105 predicate. */
106
107 struct unswitch_predicate
108 {
109 /* CTOR for a switch edge predicate. */
110 unswitch_predicate (tree cond, tree lhs_, int edge_index_, edge e,
111 const int_range_max& edge_range)
112 : condition (cond), lhs (lhs_),
113 true_range (edge_range), edge_index (edge_index_), switch_p (true)
114 {
115 gcc_assert (!(e->flags & (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE))
116 && irange::supports_p (TREE_TYPE (lhs)));
117 false_range = true_range;
118 if (!false_range.varying_p ()
119 && !false_range.undefined_p ())
120 false_range.invert ();
121 count = e->count ();
122 num = predicates->length ();
123 predicates->safe_push (this);
124 }
125
126 /* CTOR for a GIMPLE condition statement. */
127 unswitch_predicate (gcond *stmt)
128 : switch_p (false)
129 {
130 basic_block bb = gimple_bb (stmt);
131 if (EDGE_SUCC (bb, 0)->flags & EDGE_TRUE_VALUE)
132 edge_index = 0;
133 else
134 edge_index = 1;
135 lhs = gimple_cond_lhs (stmt);
136 tree rhs = gimple_cond_rhs (stmt);
137 enum tree_code code = gimple_cond_code (stmt);
138 condition = build2 (code, boolean_type_node, lhs, rhs);
139 count = EDGE_SUCC (bb, 0)->count ().max (EDGE_SUCC (bb, 1)->count ());
140 if (irange::supports_p (TREE_TYPE (lhs)))
141 {
142 auto range_op = range_op_handler (code);
143 int_range<2> rhs_range (TREE_TYPE (rhs));
144 if (CONSTANT_CLASS_P (rhs))
145 {
146 wide_int w = wi::to_wide (rhs);
147 rhs_range.set (TREE_TYPE (rhs), w, w);
148 }
149 if (!range_op.op1_range (true_range, TREE_TYPE (lhs),
150 range_true (), rhs_range)
151 || !range_op.op1_range (false_range, TREE_TYPE (lhs),
152 range_false (), rhs_range))
153 {
154 true_range.set_varying (TREE_TYPE (lhs));
155 false_range.set_varying (TREE_TYPE (lhs));
156 }
157 }
158 num = predicates->length ();
159 predicates->safe_push (this);
160 }
161
162 /* Copy ranges for purpose of usage in predicate path. */
163
164 inline void
165 copy_merged_ranges ()
166 {
167 merged_true_range = true_range;
168 merged_false_range = false_range;
169 }
170
171 /* GENERIC unswitching expression testing LHS against CONSTANT. */
172 tree condition;
173
174 /* LHS of the expression. */
175 tree lhs;
176
177 /* Initial ranges (when the expression is true/false) for the expression. */
178 int_range_max true_range = {}, false_range = {};
179
180 /* Modified range that is part of a predicate path. */
181 int_range_max merged_true_range = {}, merged_false_range = {};
182
183 /* Index of the edge the predicate belongs to in the successor vector. */
184 int edge_index;
185
186 /* The profile count of this predicate. */
187 profile_count count;
188
189 /* Whether the predicate was created from a switch statement. */
190 bool switch_p;
191
192 /* The number of the predicate in the predicates vector below. */
193 unsigned num;
194
195 /* Vector of all used predicates, used for assigning a unique id that
196 can be used for bitmap operations. */
197 static vec<unswitch_predicate *> *predicates;
198 };
199
200 vec<unswitch_predicate *> *unswitch_predicate::predicates;
201
202 /* Ranger instance used in the pass. */
203 static gimple_ranger *ranger = NULL;
204
205 /* Cache storage for unswitch_predicate belonging to a basic block. */
206 static vec<vec<unswitch_predicate *>> *bb_predicates;
207
208 /* The type represents a predicate path leading to a basic block. */
209 typedef vec<std::pair<unswitch_predicate *, bool>> predicate_vector;
210
211 static class loop *tree_unswitch_loop (class loop *, edge, tree);
212 static bool tree_unswitch_single_loop (class loop *, dump_user_location_t,
213 predicate_vector &predicate_path,
214 unsigned loop_size, unsigned &budget,
215 int ignored_edge_flag, bitmap,
216 unswitch_predicate * = NULL,
217 basic_block = NULL);
218 static void
219 find_unswitching_predicates_for_bb (basic_block bb, class loop *loop,
220 class loop *&outer_loop,
221 vec<unswitch_predicate *> &candidates,
222 unswitch_predicate *&hottest,
223 basic_block &hottest_bb);
224 static bool tree_unswitch_outer_loop (class loop *);
225 static edge find_loop_guard (class loop *, vec<gimple *>&);
226 static bool empty_bb_without_guard_p (class loop *, basic_block,
227 vec<gimple *>&);
228 static bool used_outside_loop_p (class loop *, tree, vec<gimple *>&);
229 static void hoist_guard (class loop *, edge);
230 static bool check_exit_phi (class loop *);
231 static tree get_vop_from_header (class loop *);
232 static void clean_up_after_unswitching (int);
233
234 /* Return vector of predicates that belong to a basic block. */
235
236 static vec<unswitch_predicate *> &
237 get_predicates_for_bb (basic_block bb)
238 {
239 gimple *last = last_nondebug_stmt (bb);
240 return (*bb_predicates)[last == NULL ? 0 : gimple_uid (last)];
241 }
242
243 /* Save predicates that belong to a basic block. */
244
245 static void
246 set_predicates_for_bb (basic_block bb, vec<unswitch_predicate *> predicates)
247 {
248 gimple_set_uid (last_nondebug_stmt (bb), bb_predicates->length ());
249 bb_predicates->safe_push (predicates);
250 }
251
252 /* Initialize LOOP information reused during the unswitching pass.
253 Return total number of instructions in the loop. Adjusts LOOP to
254 the outermost loop all candidates are invariant in. */
255
256 static unsigned
257 init_loop_unswitch_info (class loop *&loop, unswitch_predicate *&hottest,
258 basic_block &hottest_bb)
259 {
260 unsigned total_insns = 0;
261
262 basic_block *bbs = get_loop_body (loop);
263
264 /* Unswitch only nests with no sibling loops. */
265 class loop *outer_loop = loop;
266 unsigned max_depth = param_max_unswitch_depth;
267 while (loop_outer (outer_loop)->num != 0
268 && !loop_outer (outer_loop)->inner->next
269 && --max_depth != 0)
270 outer_loop = loop_outer (outer_loop);
271 hottest = NULL;
272 hottest_bb = NULL;
273 /* Find all unswitching candidates in the innermost loop. */
274 for (unsigned i = 0; i != loop->num_nodes; i++)
275 {
276 /* Find a bb to unswitch on. */
277 vec<unswitch_predicate *> candidates;
278 candidates.create (1);
279 find_unswitching_predicates_for_bb (bbs[i], loop, outer_loop, candidates,
280 hottest, hottest_bb);
281 if (!candidates.is_empty ())
282 set_predicates_for_bb (bbs[i], candidates);
283 else
284 {
285 candidates.release ();
286 gimple *last = last_nondebug_stmt (bbs[i]);
287 if (last != NULL)
288 gimple_set_uid (last, 0);
289 }
290 }
291
292 if (outer_loop != loop)
293 {
294 free (bbs);
295 bbs = get_loop_body (outer_loop);
296 }
297
298 /* Calculate instruction count. */
299 for (unsigned i = 0; i < outer_loop->num_nodes; i++)
300 {
301 unsigned insns = 0;
302 for (gimple_stmt_iterator gsi = gsi_start_bb (bbs[i]); !gsi_end_p (gsi);
303 gsi_next (&gsi))
304 insns += estimate_num_insns (gsi_stmt (gsi), &eni_size_weights);
305 /* No predicates to unswitch on in the outer loops. */
306 if (!flow_bb_inside_loop_p (loop, bbs[i]))
307 {
308 gimple *last = last_nondebug_stmt (bbs[i]);
309 if (last != NULL)
310 gimple_set_uid (last, 0);
311 }
312
313 bbs[i]->aux = (void *)(uintptr_t)insns;
314 total_insns += insns;
315 }
316
317 free (bbs);
318
319 loop = outer_loop;
320 return total_insns;
321 }
322
323 /* Main entry point. Perform loop unswitching on all suitable loops. */
324
325 unsigned int
326 tree_ssa_unswitch_loops (function *fun)
327 {
328 bool changed_unswitch = false;
329 bool changed_hoist = false;
330 auto_edge_flag ignored_edge_flag (fun);
331 mark_ssa_maybe_undefs ();
332
333 ranger = enable_ranger (fun);
334
335 /* Go through all loops starting from innermost, hoisting guards. */
336 for (auto loop : loops_list (fun, LI_FROM_INNERMOST))
337 {
338 if (loop->inner)
339 changed_hoist |= tree_unswitch_outer_loop (loop);
340 }
341
342 /* Go through innermost loops, unswitching on invariant predicates
343 within those. */
344 for (auto loop : loops_list (fun, LI_ONLY_INNERMOST))
345 {
346 /* Perform initial tests if unswitch is eligible. */
347 dump_user_location_t loc = find_loop_location (loop);
348
349 /* Do not unswitch in cold regions. */
350 if (optimize_loop_for_size_p (loop))
351 {
352 if (dump_enabled_p ())
353 dump_printf_loc (MSG_NOTE, loc,
354 "Not unswitching cold loops\n");
355 continue;
356 }
357
358 /* If the loop is not expected to iterate, there is no need
359 for unswitching. */
360 HOST_WIDE_INT iterations = estimated_loop_iterations_int (loop);
361 if (iterations < 0)
362 iterations = likely_max_loop_iterations_int (loop);
363 if (iterations >= 0 && iterations <= 1)
364 {
365 if (dump_enabled_p ())
366 dump_printf_loc (MSG_NOTE, loc,
367 "Not unswitching, loop is not expected"
368 " to iterate\n");
369 continue;
370 }
371
372 bb_predicates = new vec<vec<unswitch_predicate *>> ();
373 bb_predicates->safe_push (vec<unswitch_predicate *> ());
374 unswitch_predicate::predicates = new vec<unswitch_predicate *> ();
375
376 /* Unswitch loop. */
377 unswitch_predicate *hottest;
378 basic_block hottest_bb;
379 unsigned int loop_size = init_loop_unswitch_info (loop, hottest,
380 hottest_bb);
381 unsigned int budget = loop_size + param_max_unswitch_insns;
382
383 predicate_vector predicate_path;
384 predicate_path.create (8);
385 auto_bitmap handled;
386 changed_unswitch |= tree_unswitch_single_loop (loop, loc, predicate_path,
387 loop_size, budget,
388 ignored_edge_flag, handled,
389 hottest, hottest_bb);
390 predicate_path.release ();
391
392 for (auto predlist : bb_predicates)
393 predlist.release ();
394 bb_predicates->release ();
395 delete bb_predicates;
396 bb_predicates = NULL;
397
398 for (auto pred : unswitch_predicate::predicates)
399 delete pred;
400 unswitch_predicate::predicates->release ();
401 delete unswitch_predicate::predicates;
402 unswitch_predicate::predicates = NULL;
403 }
404
405 disable_ranger (fun);
406 clear_aux_for_blocks ();
407
408 if (changed_unswitch)
409 clean_up_after_unswitching (ignored_edge_flag);
410
411 if (changed_unswitch || changed_hoist)
412 return TODO_cleanup_cfg;
413
414 return 0;
415 }
416
417 /* Return TRUE if an SSA_NAME maybe undefined and is therefore
418 unsuitable for unswitching. STMT is the statement we are
419 considering for unswitching and LOOP is the loop it appears in. */
420
421 static bool
422 is_maybe_undefined (const tree name, gimple *stmt, class loop *loop)
423 {
424 /* The loop header is the only block we can trivially determine that
425 will always be executed. If the comparison is in the loop
426 header, we know it's OK to unswitch on it. */
427 if (gimple_bb (stmt) == loop->header)
428 return false;
429
430 return ssa_name_maybe_undef_p (name);
431 }
432
433 /* Checks whether we can unswitch LOOP on condition at end of BB -- one of its
434 basic blocks (for what it means see comments below).
435 All candidates all filled to the provided vector CANDIDATES.
436 OUTER_LOOP is updated to the innermost loop all found candidates are
437 invariant in. */
438
439 static void
440 find_unswitching_predicates_for_bb (basic_block bb, class loop *loop,
441 class loop *&outer_loop,
442 vec<unswitch_predicate *> &candidates,
443 unswitch_predicate *&hottest,
444 basic_block &hottest_bb)
445 {
446 gimple *last, *def;
447 tree use;
448 basic_block def_bb;
449 ssa_op_iter iter;
450
451 /* BB must end in a simple conditional jump. */
452 last = *gsi_last_bb (bb);
453 if (!last)
454 return;
455
456 if (gcond *stmt = safe_dyn_cast <gcond *> (last))
457 {
458 /* To keep the things simple, we do not directly remove the conditions,
459 but just replace tests with 0 != 0 resp. 1 != 0. Prevent the infinite
460 loop where we would unswitch again on such a condition. */
461 if (gimple_cond_true_p (stmt) || gimple_cond_false_p (stmt))
462 return;
463
464 /* At least the LHS needs to be symbolic. */
465 if (TREE_CODE (gimple_cond_lhs (stmt)) != SSA_NAME)
466 return;
467
468 /* Condition must be invariant. */
469 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
470 {
471 def = SSA_NAME_DEF_STMT (use);
472 def_bb = gimple_bb (def);
473 if (def_bb
474 && flow_bb_inside_loop_p (loop, def_bb))
475 return;
476 /* Unswitching on undefined values would introduce undefined
477 behavior that the original program might never exercise. */
478 if (is_maybe_undefined (use, stmt, loop))
479 return;
480 }
481 /* Narrow OUTER_LOOP. */
482 if (outer_loop != loop)
483 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
484 {
485 def = SSA_NAME_DEF_STMT (use);
486 def_bb = gimple_bb (def);
487 while (outer_loop != loop
488 && ((def_bb && flow_bb_inside_loop_p (outer_loop, def_bb))
489 || is_maybe_undefined (use, stmt, outer_loop)))
490 outer_loop = superloop_at_depth (loop,
491 loop_depth (outer_loop) + 1);
492 }
493
494 unswitch_predicate *predicate = new unswitch_predicate (stmt);
495 candidates.safe_push (predicate);
496 /* If we unswitch on this predicate we isolate both paths, so
497 pick the highest count for updating of the hottest predicate
498 to unswitch on first. */
499 if (!hottest || predicate->count > hottest->count)
500 {
501 hottest = predicate;
502 hottest_bb = bb;
503 }
504 }
505 else if (gswitch *stmt = safe_dyn_cast <gswitch *> (last))
506 {
507 unsigned nlabels = gimple_switch_num_labels (stmt);
508 tree idx = gimple_switch_index (stmt);
509 tree idx_type = TREE_TYPE (idx);
510 if (!gimple_range_ssa_p (idx) || nlabels < 1)
511 return;
512 /* Index must be invariant. */
513 def = SSA_NAME_DEF_STMT (idx);
514 def_bb = gimple_bb (def);
515 if (def_bb
516 && flow_bb_inside_loop_p (loop, def_bb))
517 return;
518 /* Unswitching on undefined values would introduce undefined
519 behavior that the original program might never exercise. */
520 if (is_maybe_undefined (idx, stmt, loop))
521 return;
522 /* Narrow OUTER_LOOP. */
523 while (outer_loop != loop
524 && ((def_bb && flow_bb_inside_loop_p (outer_loop, def_bb))
525 || is_maybe_undefined (idx, stmt, outer_loop)))
526 outer_loop = superloop_at_depth (loop,
527 loop_depth (outer_loop) + 1);
528
529 /* Build compound expression for all outgoing edges of the switch. */
530 auto_vec<tree, 16> preds;
531 auto_vec<int_range_max> edge_range;
532 preds.safe_grow_cleared (EDGE_COUNT (gimple_bb (stmt)->succs), true);
533 edge_range.safe_grow_cleared (EDGE_COUNT (gimple_bb (stmt)->succs), true);
534 edge e;
535 edge_iterator ei;
536 unsigned edge_index = 0;
537 FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
538 e->aux = (void *)(uintptr_t)edge_index++;
539 for (unsigned i = 1; i < gimple_switch_num_labels (stmt); ++i)
540 {
541 tree lab = gimple_switch_label (stmt, i);
542 tree cmp;
543 int_range<2> lab_range;
544 tree low = fold_convert (idx_type, CASE_LOW (lab));
545 if (CASE_HIGH (lab) != NULL_TREE)
546 {
547 tree high = fold_convert (idx_type, CASE_HIGH (lab));
548 tree cmp1 = fold_build2 (GE_EXPR, boolean_type_node, idx, low);
549 tree cmp2 = fold_build2 (LE_EXPR, boolean_type_node, idx, high);
550 cmp = fold_build2 (BIT_AND_EXPR, boolean_type_node, cmp1, cmp2);
551 lab_range.set (idx_type, wi::to_wide (low), wi::to_wide (high));
552 }
553 else
554 {
555 cmp = fold_build2 (EQ_EXPR, boolean_type_node, idx, low);
556 wide_int w = wi::to_wide (low);
557 lab_range.set (idx_type, w, w);
558 }
559
560 /* Combine the expression with the existing one. */
561 basic_block dest = label_to_block (cfun, CASE_LABEL (lab));
562 e = find_edge (gimple_bb (stmt), dest);
563 tree &expr = preds[(uintptr_t)e->aux];
564 if (expr == NULL_TREE)
565 expr = cmp;
566 else
567 expr = fold_build2 (BIT_IOR_EXPR, boolean_type_node, expr, cmp);
568 edge_range[(uintptr_t)e->aux].union_ (lab_range);
569 }
570
571 /* Now register the predicates. */
572 for (edge_index = 0; edge_index < preds.length (); ++edge_index)
573 {
574 edge e = EDGE_SUCC (gimple_bb (stmt), edge_index);
575 e->aux = NULL;
576 if (preds[edge_index] != NULL_TREE)
577 {
578 unswitch_predicate *predicate
579 = new unswitch_predicate (preds[edge_index], idx,
580 edge_index, e,
581 edge_range[edge_index]);
582 candidates.safe_push (predicate);
583 if (!hottest || predicate->count > hottest->count)
584 {
585 hottest = predicate;
586 hottest_bb = bb;
587 }
588 }
589 }
590 }
591 }
592
593 /* Merge ranges for the last item of PREDICATE_PATH with a predicate
594 that shared the same LHS. */
595
596 static void
597 merge_last (predicate_vector &predicate_path)
598 {
599 unswitch_predicate *last_predicate = predicate_path.last ().first;
600
601 for (int i = predicate_path.length () - 2; i >= 0; i--)
602 {
603 unswitch_predicate *predicate = predicate_path[i].first;
604 bool true_edge = predicate_path[i].second;
605
606 if (operand_equal_p (predicate->lhs, last_predicate->lhs, 0))
607 {
608 irange &other = (true_edge ? predicate->merged_true_range
609 : predicate->merged_false_range);
610 last_predicate->merged_true_range.intersect (other);
611 last_predicate->merged_false_range.intersect (other);
612 return;
613 }
614 }
615 }
616
617 /* Add PREDICATE to PREDICATE_PATH on TRUE_EDGE. */
618
619 static void
620 add_predicate_to_path (predicate_vector &predicate_path,
621 unswitch_predicate *predicate, bool true_edge)
622 {
623 predicate->copy_merged_ranges ();
624 predicate_path.safe_push (std::make_pair (predicate, true_edge));
625 merge_last (predicate_path);
626 }
627
628 static bool
629 find_range_for_lhs (predicate_vector &predicate_path, tree lhs,
630 int_range_max &range)
631 {
632 for (int i = predicate_path.length () - 1; i >= 0; i--)
633 {
634 unswitch_predicate *predicate = predicate_path[i].first;
635 bool true_edge = predicate_path[i].second;
636
637 if (operand_equal_p (predicate->lhs, lhs, 0))
638 {
639 range = (true_edge ? predicate->merged_true_range
640 : predicate->merged_false_range);
641 return !range.undefined_p ();
642 }
643 }
644
645 return false;
646 }
647
648 /* Simplifies STMT using the predicate we unswitched on which is the last
649 in PREDICATE_PATH. For switch statements add newly unreachable edges
650 to IGNORED_EDGES (but do not set IGNORED_EDGE_FLAG on them). */
651
652 static tree
653 evaluate_control_stmt_using_entry_checks (gimple *stmt,
654 predicate_vector &predicate_path,
655 int ignored_edge_flag,
656 hash_set<edge> *ignored_edges)
657 {
658 unswitch_predicate *last_predicate = predicate_path.last ().first;
659 bool true_edge = predicate_path.last ().second;
660
661 if (gcond *cond = dyn_cast<gcond *> (stmt))
662 {
663 tree lhs = gimple_cond_lhs (cond);
664 if (!operand_equal_p (lhs, last_predicate->lhs))
665 return NULL_TREE;
666 /* Try a symbolic match which works for floating point and fully
667 symbolic conditions. */
668 if (gimple_cond_code (cond) == TREE_CODE (last_predicate->condition)
669 && operand_equal_p (gimple_cond_rhs (cond),
670 TREE_OPERAND (last_predicate->condition, 1)))
671 return true_edge ? boolean_true_node : boolean_false_node;
672 /* Else try ranger if it supports LHS. */
673 else if (irange::supports_p (TREE_TYPE (lhs)))
674 {
675 int_range<2> r;
676 int_range_max path_range;
677
678 if (find_range_for_lhs (predicate_path, lhs, path_range)
679 && fold_range (r, cond, path_range)
680 && r.singleton_p ())
681 return r.zero_p () ? boolean_false_node : boolean_true_node;
682 }
683 }
684 else if (gswitch *swtch = dyn_cast<gswitch *> (stmt))
685 {
686 unsigned nlabels = gimple_switch_num_labels (swtch);
687
688 tree idx = gimple_switch_index (swtch);
689
690 /* Already folded switch. */
691 if (TREE_CONSTANT (idx))
692 return NULL_TREE;
693
694 int_range_max path_range;
695 if (!find_range_for_lhs (predicate_path, idx, path_range))
696 return NULL_TREE;
697
698 tree result = NULL_TREE;
699 edge single_edge = NULL;
700 for (unsigned i = 0; i < nlabels; ++i)
701 {
702 tree lab = gimple_switch_label (swtch, i);
703 basic_block dest = label_to_block (cfun, CASE_LABEL (lab));
704 edge e = find_edge (gimple_bb (stmt), dest);
705 if (e->flags & ignored_edge_flag)
706 continue;
707
708 int_range_max r;
709 if (!ranger->gori ().edge_range_p (r, e, idx,
710 *get_global_range_query ()))
711 continue;
712 r.intersect (path_range);
713 if (r.undefined_p ())
714 ignored_edges->add (e);
715 else
716 {
717 if (!single_edge)
718 {
719 single_edge = e;
720 result = CASE_LOW (lab);
721 }
722 else if (single_edge != e)
723 result = NULL;
724 }
725 }
726
727 /* Only one edge from the switch is alive. */
728 if (single_edge && result)
729 return result;
730 }
731
732 return NULL_TREE;
733 }
734
735 /* Simplify LOOP based on PREDICATE_PATH where dead edges are properly
736 marked. */
737
738 static bool
739 simplify_loop_version (class loop *loop, predicate_vector &predicate_path,
740 int ignored_edge_flag, bitmap handled)
741 {
742 bool changed = false;
743 basic_block *bbs = get_loop_body (loop);
744
745 hash_set<edge> ignored_edges;
746 for (unsigned i = 0; i != loop->num_nodes; i++)
747 {
748 vec<unswitch_predicate *> &predicates = get_predicates_for_bb (bbs[i]);
749 if (predicates.is_empty ())
750 continue;
751
752 gimple *stmt = *gsi_last_bb (bbs[i]);
753 tree folded = evaluate_control_stmt_using_entry_checks (stmt,
754 predicate_path,
755 ignored_edge_flag,
756 &ignored_edges);
757
758 if (gcond *cond = dyn_cast<gcond *> (stmt))
759 {
760 if (folded)
761 {
762 /* Remove path. */
763 if (integer_nonzerop (folded))
764 gimple_cond_set_condition_from_tree (cond, boolean_true_node);
765 else
766 gimple_cond_set_condition_from_tree (cond, boolean_false_node);
767
768 gcc_assert (predicates.length () == 1);
769 bitmap_set_bit (handled, predicates[0]->num);
770
771 update_stmt (cond);
772 changed = true;
773 }
774 }
775 else if (gswitch *swtch = dyn_cast<gswitch *> (stmt))
776 {
777 edge e;
778 edge_iterator ei;
779 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
780 if (ignored_edges.contains (e))
781 e->flags |= ignored_edge_flag;
782
783 for (unsigned j = 0; j < predicates.length (); j++)
784 {
785 edge e = EDGE_SUCC (bbs[i], predicates[j]->edge_index);
786 if (ignored_edges.contains (e))
787 bitmap_set_bit (handled, predicates[j]->num);
788 }
789
790 if (folded)
791 {
792 gimple_switch_set_index (swtch, folded);
793 update_stmt (swtch);
794 changed = true;
795 }
796 }
797 }
798
799 free (bbs);
800 return changed;
801 }
802
803 /* Evaluate reachable blocks in LOOP and call VISIT on them, aborting the
804 DFS walk if VISIT returns true. When PREDICATE_PATH is specified then
805 take into account that when computing reachability, otherwise just
806 look at the simplified state and IGNORED_EDGE_FLAG. */
807
808 template <typename VisitOp>
809 static void
810 evaluate_bbs (class loop *loop, predicate_vector *predicate_path,
811 int ignored_edge_flag, VisitOp visit)
812 {
813 auto_bb_flag reachable_flag (cfun);
814 auto_vec<basic_block, 10> worklist (loop->num_nodes);
815 auto_vec<basic_block, 10> reachable (loop->num_nodes);
816 hash_set<edge> ignored_edges;
817
818 loop->header->flags |= reachable_flag;
819 worklist.quick_push (loop->header);
820 reachable.safe_push (loop->header);
821
822 while (!worklist.is_empty ())
823 {
824 edge e;
825 edge_iterator ei;
826 int flags = ignored_edge_flag;
827 basic_block bb = worklist.pop ();
828
829 if (visit (bb))
830 break;
831
832 gimple *last = *gsi_last_bb (bb);
833 if (gcond *cond = safe_dyn_cast <gcond *> (last))
834 {
835 if (gimple_cond_true_p (cond))
836 flags = EDGE_FALSE_VALUE;
837 else if (gimple_cond_false_p (cond))
838 flags = EDGE_TRUE_VALUE;
839 else if (predicate_path)
840 {
841 tree res;
842 if (!get_predicates_for_bb (bb).is_empty ()
843 && (res = evaluate_control_stmt_using_entry_checks
844 (cond, *predicate_path, ignored_edge_flag,
845 &ignored_edges)))
846 flags = (integer_nonzerop (res)
847 ? EDGE_FALSE_VALUE : EDGE_TRUE_VALUE);
848 }
849 }
850 else if (gswitch *swtch = safe_dyn_cast<gswitch *> (last))
851 if (predicate_path
852 && !get_predicates_for_bb (bb).is_empty ())
853 evaluate_control_stmt_using_entry_checks (swtch, *predicate_path,
854 ignored_edge_flag,
855 &ignored_edges);
856
857 /* Note that for the moment we do not account reachable conditions
858 which are simplified to take a known edge as zero size nor
859 are we accounting for the required addition of the versioning
860 condition. Those should cancel out conservatively. */
861
862 FOR_EACH_EDGE (e, ei, bb->succs)
863 {
864 basic_block dest = e->dest;
865
866 if (flow_bb_inside_loop_p (loop, dest)
867 && !(dest->flags & reachable_flag)
868 && !(e->flags & flags)
869 && !ignored_edges.contains (e))
870 {
871 dest->flags |= reachable_flag;
872 worklist.safe_push (dest);
873 reachable.safe_push (dest);
874 }
875 }
876 }
877
878 /* Clear the flag from basic blocks. */
879 while (!reachable.is_empty ())
880 reachable.pop ()->flags &= ~reachable_flag;
881 }
882
883 /* Evaluate how many instruction will we have if we unswitch LOOP (with BBS)
884 based on PREDICATE predicate (using PREDICATE_PATH). Store the
885 result in TRUE_SIZE and FALSE_SIZE. */
886
887 static void
888 evaluate_loop_insns_for_predicate (class loop *loop,
889 predicate_vector &predicate_path,
890 unswitch_predicate *predicate,
891 int ignored_edge_flag,
892 unsigned *true_size, unsigned *false_size)
893 {
894 unsigned size = 0;
895 auto sum_size = [&](basic_block bb) -> bool
896 { size += (uintptr_t)bb->aux; return false; };
897
898 add_predicate_to_path (predicate_path, predicate, true);
899 evaluate_bbs (loop, &predicate_path, ignored_edge_flag, sum_size);
900 predicate_path.pop ();
901 unsigned true_loop_cost = size;
902
903 size = 0;
904 add_predicate_to_path (predicate_path, predicate, false);
905 evaluate_bbs (loop, &predicate_path, ignored_edge_flag, sum_size);
906 predicate_path.pop ();
907 unsigned false_loop_cost = size;
908
909 *true_size = true_loop_cost;
910 *false_size = false_loop_cost;
911 }
912
913 /* Unswitch single LOOP. PREDICATE_PATH contains so far used predicates
914 for unswitching. BUDGET is number of instruction for which we can increase
915 the loop and is updated when unswitching occurs. If HOTTEST is not
916 NULL then pick this candidate as the one to unswitch on. */
917
918 static bool
919 tree_unswitch_single_loop (class loop *loop, dump_user_location_t loc,
920 predicate_vector &predicate_path,
921 unsigned loop_size, unsigned &budget,
922 int ignored_edge_flag, bitmap handled,
923 unswitch_predicate *hottest, basic_block hottest_bb)
924 {
925 class loop *nloop;
926 bool changed = false;
927 unswitch_predicate *predicate = NULL;
928 basic_block predicate_bb = NULL;
929 unsigned true_size = 0, false_size = 0;
930
931 auto check_predicates = [&](basic_block bb) -> bool
932 {
933 for (auto pred : get_predicates_for_bb (bb))
934 {
935 if (bitmap_bit_p (handled, pred->num))
936 continue;
937
938 evaluate_loop_insns_for_predicate (loop, predicate_path,
939 pred, ignored_edge_flag,
940 &true_size, &false_size);
941
942 /* We'll get LOOP replaced with a simplified version according
943 to PRED estimated to TRUE_SIZE and a copy simplified
944 according to the inverted PRED estimated to FALSE_SIZE. */
945 if (true_size + false_size < budget + loop_size)
946 {
947 predicate = pred;
948 predicate_bb = bb;
949
950 /* There are cases where true_size and false_size add up to
951 less than the original loop_size. We do not want to
952 grow the remaining budget because of that. */
953 if (true_size + false_size > loop_size)
954 budget -= (true_size + false_size - loop_size);
955
956 /* FIXME: right now we select first candidate, but we can
957 choose the cheapest or hottest one. */
958 return true;
959 }
960 else if (dump_enabled_p ())
961 dump_printf_loc (MSG_NOTE, loc,
962 "not unswitching condition, cost too big "
963 "(%u insns copied to %u and %u)\n", loop_size,
964 true_size, false_size);
965 }
966 return false;
967 };
968
969 if (hottest)
970 {
971 predicate = hottest;
972 predicate_bb = hottest_bb;
973 }
974 else
975 /* Check predicates of reachable blocks. */
976 evaluate_bbs (loop, NULL, ignored_edge_flag, check_predicates);
977
978 if (predicate != NULL)
979 {
980 if (!dbg_cnt (loop_unswitch))
981 goto exit;
982
983 if (dump_enabled_p ())
984 {
985 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
986 "unswitching %sloop %d on %qs with condition: %T\n",
987 loop->inner ? "outer " : "",
988 loop->num, predicate->switch_p ? "switch" : "if",
989 predicate->condition);
990 dump_printf_loc (MSG_NOTE, loc,
991 "optimized sizes estimated to %u (true) "
992 "and %u (false) from original size %u\n",
993 true_size, false_size, loop_size);
994 }
995
996 bitmap_set_bit (handled, predicate->num);
997 initialize_original_copy_tables ();
998 /* Unswitch the loop on this condition. */
999 nloop = tree_unswitch_loop (loop, EDGE_SUCC (predicate_bb,
1000 predicate->edge_index),
1001 predicate->condition);
1002 if (!nloop)
1003 {
1004 free_original_copy_tables ();
1005 goto exit;
1006 }
1007
1008 /* Copy BB costs. */
1009 basic_block *bbs2 = get_loop_body (nloop);
1010 for (unsigned i = 0; i < nloop->num_nodes; i++)
1011 bbs2[i]->aux = get_bb_original (bbs2[i])->aux;
1012 free (bbs2);
1013
1014 free_original_copy_tables ();
1015
1016 /* Update the SSA form after unswitching. */
1017 update_ssa (TODO_update_ssa_no_phi);
1018
1019 /* Invoke itself on modified loops. */
1020 bitmap handled_copy = BITMAP_ALLOC (NULL);
1021 bitmap_copy (handled_copy, handled);
1022 add_predicate_to_path (predicate_path, predicate, false);
1023 changed |= simplify_loop_version (nloop, predicate_path,
1024 ignored_edge_flag, handled_copy);
1025 tree_unswitch_single_loop (nloop, loc, predicate_path,
1026 false_size, budget,
1027 ignored_edge_flag, handled_copy);
1028 predicate_path.pop ();
1029 BITMAP_FREE (handled_copy);
1030
1031 /* FIXME: After unwinding above we have to reset all ->handled
1032 flags as otherwise we fail to realize unswitching opportunities
1033 in the below recursion. See gcc.dg/loop-unswitch-16.c */
1034 add_predicate_to_path (predicate_path, predicate, true);
1035 changed |= simplify_loop_version (loop, predicate_path,
1036 ignored_edge_flag, handled);
1037 tree_unswitch_single_loop (loop, loc, predicate_path,
1038 true_size, budget,
1039 ignored_edge_flag, handled);
1040 predicate_path.pop ();
1041 changed = true;
1042 }
1043
1044 exit:
1045 return changed;
1046 }
1047
1048 /* Unswitch a LOOP w.r. to given EDGE_TRUE. We only support unswitching of
1049 innermost loops. COND is the condition determining which loop is entered;
1050 the new loop is entered if COND is true. Returns NULL if impossible, new
1051 loop otherwise. */
1052
1053 static class loop *
1054 tree_unswitch_loop (class loop *loop, edge edge_true, tree cond)
1055 {
1056 /* Some sanity checking. */
1057 gcc_assert (flow_bb_inside_loop_p (loop, edge_true->src));
1058 gcc_assert (EDGE_COUNT (edge_true->src->succs) >= 2);
1059
1060 profile_probability prob_true = edge_true->probability;
1061 return loop_version (loop, unshare_expr (cond),
1062 NULL, prob_true,
1063 prob_true.invert (),
1064 prob_true, prob_true.invert (),
1065 false);
1066 }
1067
1068 /* Unswitch outer loops by hoisting invariant guard on
1069 inner loop without code duplication. */
1070 static bool
1071 tree_unswitch_outer_loop (class loop *loop)
1072 {
1073 edge exit, guard;
1074 HOST_WIDE_INT iterations;
1075
1076 gcc_assert (loop->inner);
1077 if (loop->inner->next)
1078 return false;
1079 /* Accept loops with single exit only which is not from inner loop. */
1080 exit = single_exit (loop);
1081 if (!exit || exit->src->loop_father != loop)
1082 return false;
1083 /* Check that phi argument of exit edge is not defined inside loop. */
1084 if (!check_exit_phi (loop))
1085 return false;
1086 /* If the loop is not expected to iterate, there is no need
1087 for unswitching. */
1088 iterations = estimated_loop_iterations_int (loop);
1089 if (iterations < 0)
1090 iterations = likely_max_loop_iterations_int (loop);
1091 if (iterations >= 0 && iterations <= 1)
1092 {
1093 if (dump_enabled_p ())
1094 dump_printf_loc (MSG_MISSED_OPTIMIZATION, find_loop_location (loop),
1095 "Not unswitching, loop is not expected"
1096 " to iterate\n");
1097 return false;
1098 }
1099
1100 bool changed = false;
1101 auto_vec<gimple *> dbg_to_reset;
1102 while ((guard = find_loop_guard (loop, dbg_to_reset)))
1103 {
1104 hoist_guard (loop, guard);
1105 for (gimple *debug_stmt : dbg_to_reset)
1106 {
1107 gimple_debug_bind_reset_value (debug_stmt);
1108 update_stmt (debug_stmt);
1109 }
1110 dbg_to_reset.truncate (0);
1111 changed = true;
1112 }
1113 return changed;
1114 }
1115
1116 /* Checks if the body of the LOOP is within an invariant guard. If this
1117 is the case, returns the edge that jumps over the real body of the loop,
1118 otherwise returns NULL. */
1119
1120 static edge
1121 find_loop_guard (class loop *loop, vec<gimple *> &dbg_to_reset)
1122 {
1123 basic_block header = loop->header;
1124 edge guard_edge, te, fe;
1125 basic_block *body = NULL;
1126 unsigned i;
1127 tree use;
1128 ssa_op_iter iter;
1129
1130 /* We check for the following situation:
1131
1132 while (1)
1133 {
1134 [header]]
1135 loop_phi_nodes;
1136 something1;
1137 if (cond1)
1138 body;
1139 nvar = phi(orig, bvar) ... for all variables changed in body;
1140 [guard_end]
1141 something2;
1142 if (cond2)
1143 break;
1144 something3;
1145 }
1146
1147 where:
1148
1149 1) cond1 is loop invariant
1150 2) If cond1 is false, then the loop is essentially empty; i.e.,
1151 a) nothing in something1, something2 and something3 has side
1152 effects
1153 b) anything defined in something1, something2 and something3
1154 is not used outside of the loop. */
1155
1156 gcond *cond;
1157 do
1158 {
1159 basic_block next = NULL;
1160 if (single_succ_p (header))
1161 next = single_succ (header);
1162 else
1163 {
1164 cond = safe_dyn_cast <gcond *> (*gsi_last_bb (header));
1165 if (! cond)
1166 return NULL;
1167 extract_true_false_edges_from_block (header, &te, &fe);
1168 /* Make sure to skip earlier hoisted guards that are left
1169 in place as if (true). */
1170 if (gimple_cond_true_p (cond))
1171 next = te->dest;
1172 else if (gimple_cond_false_p (cond))
1173 next = fe->dest;
1174 else
1175 break;
1176 }
1177 /* Never traverse a backedge. */
1178 if (header->loop_father->header == next)
1179 return NULL;
1180 header = next;
1181 }
1182 while (1);
1183 if (!flow_bb_inside_loop_p (loop, te->dest)
1184 || !flow_bb_inside_loop_p (loop, fe->dest))
1185 return NULL;
1186
1187 if (just_once_each_iteration_p (loop, te->dest)
1188 || (single_succ_p (te->dest)
1189 && just_once_each_iteration_p (loop, single_succ (te->dest))))
1190 {
1191 if (just_once_each_iteration_p (loop, fe->dest))
1192 return NULL;
1193 guard_edge = te;
1194 }
1195 else if (just_once_each_iteration_p (loop, fe->dest)
1196 || (single_succ_p (fe->dest)
1197 && just_once_each_iteration_p (loop, single_succ (fe->dest))))
1198 guard_edge = fe;
1199 else
1200 return NULL;
1201
1202 dump_user_location_t loc = find_loop_location (loop);
1203
1204 /* Guard edge must skip inner loop. */
1205 if (!dominated_by_p (CDI_DOMINATORS, loop->inner->header,
1206 guard_edge == fe ? te->dest : fe->dest))
1207 {
1208 if (dump_enabled_p ())
1209 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1210 "Guard edge %d --> %d is not around the loop!\n",
1211 guard_edge->src->index, guard_edge->dest->index);
1212 return NULL;
1213 }
1214 if (guard_edge->dest == loop->latch)
1215 {
1216 if (dump_enabled_p ())
1217 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1218 "Guard edge destination is loop latch.\n");
1219 return NULL;
1220 }
1221
1222 if (dump_enabled_p ())
1223 dump_printf_loc (MSG_NOTE, loc,
1224 "Considering guard %d -> %d in loop %d\n",
1225 guard_edge->src->index, guard_edge->dest->index,
1226 loop->num);
1227 /* Check if condition operands do not have definitions inside loop since
1228 any bb copying is not performed. */
1229 FOR_EACH_SSA_TREE_OPERAND (use, cond, iter, SSA_OP_USE)
1230 {
1231 gimple *def = SSA_NAME_DEF_STMT (use);
1232 basic_block def_bb = gimple_bb (def);
1233 if (def_bb
1234 && flow_bb_inside_loop_p (loop, def_bb))
1235 {
1236 if (dump_enabled_p ())
1237 dump_printf_loc (MSG_NOTE, loc, "guard operands have definitions"
1238 " inside loop\n");
1239 return NULL;
1240 }
1241 }
1242
1243 body = get_loop_body (loop);
1244 for (i = 0; i < loop->num_nodes; i++)
1245 {
1246 basic_block bb = body[i];
1247 if (bb->loop_father != loop)
1248 continue;
1249 if (bb->flags & BB_IRREDUCIBLE_LOOP)
1250 {
1251 if (dump_enabled_p ())
1252 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1253 "Block %d is marked as irreducible in loop\n",
1254 bb->index);
1255 guard_edge = NULL;
1256 goto end;
1257 }
1258 /* If any of the not skipped blocks has side-effects or defs with
1259 uses outside of the loop we cannot hoist the guard. */
1260 if (!dominated_by_p (CDI_DOMINATORS,
1261 bb, guard_edge == te ? fe->dest : te->dest)
1262 && !empty_bb_without_guard_p (loop, bb, dbg_to_reset))
1263 {
1264 if (dump_enabled_p ())
1265 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1266 "Block %d has side effects\n", bb->index);
1267 guard_edge = NULL;
1268 goto end;
1269 }
1270 }
1271
1272 if (dump_enabled_p ())
1273 dump_printf_loc (MSG_NOTE, loc,
1274 "suitable to hoist\n");
1275 end:
1276 if (body)
1277 free (body);
1278 return guard_edge;
1279 }
1280
1281 /* Returns true if
1282 1) no statement in BB has side effects
1283 2) assuming that edge GUARD is always taken, all definitions in BB
1284 are noy used outside of the loop.
1285 KNOWN_INVARIANTS is a set of ssa names we know to be invariant, and
1286 PROCESSED is a set of ssa names for that we already tested whether they
1287 are invariant or not. Uses in debug stmts outside of the loop are
1288 pushed to DBG_TO_RESET. */
1289
1290 static bool
1291 empty_bb_without_guard_p (class loop *loop, basic_block bb,
1292 vec<gimple *> &dbg_to_reset)
1293 {
1294 basic_block exit_bb = single_exit (loop)->src;
1295 bool may_be_used_outside = (bb == exit_bb
1296 || !dominated_by_p (CDI_DOMINATORS, bb, exit_bb));
1297 tree name;
1298 ssa_op_iter op_iter;
1299
1300 /* Phi nodes do not have side effects, but their results might be used
1301 outside of the loop. */
1302 if (may_be_used_outside)
1303 {
1304 for (gphi_iterator gsi = gsi_start_phis (bb);
1305 !gsi_end_p (gsi); gsi_next (&gsi))
1306 {
1307 gphi *phi = gsi.phi ();
1308 name = PHI_RESULT (phi);
1309 if (virtual_operand_p (name))
1310 continue;
1311
1312 if (used_outside_loop_p (loop, name, dbg_to_reset))
1313 return false;
1314 }
1315 }
1316
1317 for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
1318 !gsi_end_p (gsi); gsi_next (&gsi))
1319 {
1320 gimple *stmt = gsi_stmt (gsi);
1321 if (is_gimple_debug (stmt))
1322 continue;
1323
1324 if (gimple_has_side_effects (stmt))
1325 return false;
1326
1327 if (gimple_vdef(stmt))
1328 return false;
1329
1330 FOR_EACH_SSA_TREE_OPERAND (name, stmt, op_iter, SSA_OP_DEF)
1331 {
1332 if (may_be_used_outside
1333 && used_outside_loop_p (loop, name, dbg_to_reset))
1334 return false;
1335 }
1336 }
1337 return true;
1338 }
1339
1340 /* Return true if NAME is used outside of LOOP. Pushes debug stmts that
1341 have such uses to DBG_TO_RESET but do not consider such uses. */
1342
1343 static bool
1344 used_outside_loop_p (class loop *loop, tree name, vec<gimple *> &dbg_to_reset)
1345 {
1346 imm_use_iterator it;
1347 use_operand_p use;
1348
1349 FOR_EACH_IMM_USE_FAST (use, it, name)
1350 {
1351 gimple *stmt = USE_STMT (use);
1352 if (!flow_bb_inside_loop_p (loop, gimple_bb (stmt)))
1353 {
1354 if (!is_gimple_debug (stmt))
1355 return true;
1356 dbg_to_reset.safe_push (stmt);
1357 }
1358 }
1359
1360 return false;
1361 }
1362
1363 /* Return argument for loop preheader edge in header virtual phi if any. */
1364
1365 static tree
1366 get_vop_from_header (class loop *loop)
1367 {
1368 for (gphi_iterator gsi = gsi_start_phis (loop->header);
1369 !gsi_end_p (gsi); gsi_next (&gsi))
1370 {
1371 gphi *phi = gsi.phi ();
1372 if (!virtual_operand_p (gimple_phi_result (phi)))
1373 continue;
1374 return PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
1375 }
1376 return NULL_TREE;
1377 }
1378
1379 /* Move the check of GUARD outside of LOOP. */
1380
1381 static void
1382 hoist_guard (class loop *loop, edge guard)
1383 {
1384 edge exit = single_exit (loop);
1385 edge preh = loop_preheader_edge (loop);
1386 basic_block pre_header = preh->src;
1387 basic_block bb;
1388 edge te, fe, e, new_edge;
1389 gimple *stmt;
1390 basic_block guard_bb = guard->src;
1391 edge not_guard;
1392 gimple_stmt_iterator gsi;
1393 int flags = 0;
1394 bool fix_dom_of_exit;
1395 gcond *cond_stmt, *new_cond_stmt;
1396
1397 bb = get_immediate_dominator (CDI_DOMINATORS, exit->dest);
1398 fix_dom_of_exit = flow_bb_inside_loop_p (loop, bb);
1399 gsi = gsi_last_bb (guard_bb);
1400 stmt = gsi_stmt (gsi);
1401 gcc_assert (gimple_code (stmt) == GIMPLE_COND);
1402 cond_stmt = as_a <gcond *> (stmt);
1403 extract_true_false_edges_from_block (guard_bb, &te, &fe);
1404 /* Insert guard to PRE_HEADER. */
1405 gsi = gsi_last_bb (pre_header);
1406 /* Create copy of COND_STMT. */
1407 new_cond_stmt = gimple_build_cond (gimple_cond_code (cond_stmt),
1408 gimple_cond_lhs (cond_stmt),
1409 gimple_cond_rhs (cond_stmt),
1410 NULL_TREE, NULL_TREE);
1411 gsi_insert_after (&gsi, new_cond_stmt, GSI_NEW_STMT);
1412 /* Convert COND_STMT to true/false conditional. */
1413 if (guard == te)
1414 gimple_cond_make_false (cond_stmt);
1415 else
1416 gimple_cond_make_true (cond_stmt);
1417 update_stmt (cond_stmt);
1418 /* Create new loop pre-header. */
1419 e = split_block (pre_header, last_nondebug_stmt (pre_header));
1420
1421 dump_user_location_t loc = find_loop_location (loop);
1422
1423 if (dump_enabled_p ())
1424 {
1425 char buffer[64];
1426 guard->probability.dump (buffer);
1427
1428 dump_printf_loc (MSG_NOTE, loc,
1429 "Moving guard %i->%i (prob %s) to bb %i, "
1430 "new preheader is %i\n",
1431 guard->src->index, guard->dest->index,
1432 buffer, e->src->index, e->dest->index);
1433 }
1434
1435 gcc_assert (loop_preheader_edge (loop)->src == e->dest);
1436
1437 if (guard == fe)
1438 {
1439 e->flags = EDGE_TRUE_VALUE;
1440 flags |= EDGE_FALSE_VALUE;
1441 not_guard = te;
1442 }
1443 else
1444 {
1445 e->flags = EDGE_FALSE_VALUE;
1446 flags |= EDGE_TRUE_VALUE;
1447 not_guard = fe;
1448 }
1449 new_edge = make_edge (pre_header, exit->dest, flags);
1450
1451 /* Determine the probability that we skip the loop. Assume that loop has
1452 same average number of iterations regardless outcome of guard. */
1453 new_edge->probability = guard->probability;
1454 profile_count skip_count = guard->src->count.nonzero_p ()
1455 ? guard->count ().apply_scale (pre_header->count,
1456 guard->src->count)
1457 : guard->count ().apply_probability (new_edge->probability);
1458
1459 if (skip_count > e->count ())
1460 {
1461 fprintf (dump_file, " Capping count; expect profile inconsistency\n");
1462 skip_count = e->count ();
1463 }
1464 if (dump_enabled_p ())
1465 {
1466 char buffer[64];
1467 new_edge->probability.dump (buffer);
1468
1469 dump_printf_loc (MSG_NOTE, loc,
1470 "Estimated probability of skipping loop is %s\n",
1471 buffer);
1472 }
1473
1474 /* Update profile after the transform:
1475
1476 First decrease count of path from newly hoisted loop guard
1477 to loop header... */
1478 e->probability = new_edge->probability.invert ();
1479 e->dest->count = e->count ();
1480
1481 /* ... now update profile to represent that original guard will be optimized
1482 away ... */
1483 guard->probability = profile_probability::never ();
1484 not_guard->probability = profile_probability::always ();
1485
1486 /* ... finally scale everything in the loop except for guarded basic blocks
1487 where profile does not change. */
1488 basic_block *body = get_loop_body (loop);
1489
1490 for (unsigned int i = 0; i < loop->num_nodes; i++)
1491 {
1492 basic_block bb = body[i];
1493 if (!dominated_by_p (CDI_DOMINATORS, bb, not_guard->dest))
1494 {
1495 if (dump_enabled_p ())
1496 dump_printf_loc (MSG_NOTE, loc,
1497 "Scaling nonguarded BBs in loop: %i\n",
1498 bb->index);
1499 if (e->probability.initialized_p ())
1500 scale_bbs_frequencies (&bb, 1, e->probability);
1501 }
1502 }
1503
1504 if (fix_dom_of_exit)
1505 set_immediate_dominator (CDI_DOMINATORS, exit->dest, pre_header);
1506 /* Add NEW_ADGE argument for all phi in post-header block. */
1507 bb = exit->dest;
1508 for (gphi_iterator gsi = gsi_start_phis (bb);
1509 !gsi_end_p (gsi); gsi_next (&gsi))
1510 {
1511 gphi *phi = gsi.phi ();
1512 tree arg;
1513 if (virtual_operand_p (gimple_phi_result (phi)))
1514 {
1515 arg = get_vop_from_header (loop);
1516 if (arg == NULL_TREE)
1517 /* Use exit edge argument. */
1518 arg = PHI_ARG_DEF_FROM_EDGE (phi, exit);
1519 add_phi_arg (phi, arg, new_edge, UNKNOWN_LOCATION);
1520 }
1521 else
1522 {
1523 /* Use exit edge argument. */
1524 arg = PHI_ARG_DEF_FROM_EDGE (phi, exit);
1525 add_phi_arg (phi, arg, new_edge, UNKNOWN_LOCATION);
1526 }
1527 }
1528
1529 if (dump_enabled_p ())
1530 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
1531 "Guard hoisted\n");
1532
1533 free (body);
1534 }
1535
1536 /* Return true if phi argument for exit edge can be used
1537 for edge around loop. */
1538
1539 static bool
1540 check_exit_phi (class loop *loop)
1541 {
1542 edge exit = single_exit (loop);
1543 basic_block pre_header = loop_preheader_edge (loop)->src;
1544
1545 for (gphi_iterator gsi = gsi_start_phis (exit->dest);
1546 !gsi_end_p (gsi); gsi_next (&gsi))
1547 {
1548 gphi *phi = gsi.phi ();
1549 tree arg;
1550 gimple *def;
1551 basic_block def_bb;
1552 if (virtual_operand_p (gimple_phi_result (phi)))
1553 continue;
1554 arg = PHI_ARG_DEF_FROM_EDGE (phi, exit);
1555 if (TREE_CODE (arg) != SSA_NAME)
1556 continue;
1557 def = SSA_NAME_DEF_STMT (arg);
1558 if (!def)
1559 continue;
1560 def_bb = gimple_bb (def);
1561 if (!def_bb)
1562 continue;
1563 if (!dominated_by_p (CDI_DOMINATORS, pre_header, def_bb))
1564 /* Definition inside loop! */
1565 return false;
1566 /* Check loop closed phi invariant. */
1567 if (!flow_bb_inside_loop_p (def_bb->loop_father, pre_header))
1568 return false;
1569 }
1570 return true;
1571 }
1572
1573 /* Remove all dead cases from switches that are unswitched. */
1574
1575 static void
1576 clean_up_after_unswitching (int ignored_edge_flag)
1577 {
1578 basic_block bb;
1579 edge e;
1580 edge_iterator ei;
1581 bool removed_edge = false;
1582
1583 FOR_EACH_BB_FN (bb, cfun)
1584 {
1585 gswitch *stmt= safe_dyn_cast <gswitch *> (*gsi_last_bb (bb));
1586 if (stmt && !CONSTANT_CLASS_P (gimple_switch_index (stmt)))
1587 {
1588 unsigned nlabels = gimple_switch_num_labels (stmt);
1589 unsigned index = 1;
1590 tree lab = gimple_switch_default_label (stmt);
1591 edge default_e = find_edge (gimple_bb (stmt),
1592 label_to_block (cfun, CASE_LABEL (lab)));
1593 for (unsigned i = 1; i < nlabels; ++i)
1594 {
1595 tree lab = gimple_switch_label (stmt, i);
1596 basic_block dest = label_to_block (cfun, CASE_LABEL (lab));
1597 edge e = find_edge (gimple_bb (stmt), dest);
1598 if (e == NULL)
1599 ; /* The edge is already removed. */
1600 else if (e->flags & ignored_edge_flag)
1601 {
1602 /* We may not remove the default label so we also have
1603 to preserve its edge. But we can remove the
1604 non-default CASE sharing the edge. */
1605 if (e != default_e)
1606 {
1607 remove_edge (e);
1608 removed_edge = true;
1609 }
1610 }
1611 else
1612 {
1613 gimple_switch_set_label (stmt, index, lab);
1614 ++index;
1615 }
1616 }
1617
1618 if (index != nlabels)
1619 gimple_switch_set_num_labels (stmt, index);
1620 }
1621
1622 /* Clean up the ignored_edge_flag from edges. */
1623 FOR_EACH_EDGE (e, ei, bb->succs)
1624 e->flags &= ~ignored_edge_flag;
1625 }
1626
1627 /* If we removed an edge we possibly have to recompute dominators. */
1628 if (removed_edge)
1629 free_dominance_info (CDI_DOMINATORS);
1630 }
1631
1632 /* Loop unswitching pass. */
1633
1634 namespace {
1635
1636 const pass_data pass_data_tree_unswitch =
1637 {
1638 GIMPLE_PASS, /* type */
1639 "unswitch", /* name */
1640 OPTGROUP_LOOP, /* optinfo_flags */
1641 TV_TREE_LOOP_UNSWITCH, /* tv_id */
1642 PROP_cfg, /* properties_required */
1643 0, /* properties_provided */
1644 0, /* properties_destroyed */
1645 0, /* todo_flags_start */
1646 0, /* todo_flags_finish */
1647 };
1648
1649 class pass_tree_unswitch : public gimple_opt_pass
1650 {
1651 public:
1652 pass_tree_unswitch (gcc::context *ctxt)
1653 : gimple_opt_pass (pass_data_tree_unswitch, ctxt)
1654 {}
1655
1656 /* opt_pass methods: */
1657 bool gate (function *) final override { return flag_unswitch_loops != 0; }
1658 unsigned int execute (function *) final override;
1659
1660 }; // class pass_tree_unswitch
1661
1662 unsigned int
1663 pass_tree_unswitch::execute (function *fun)
1664 {
1665 if (number_of_loops (fun) <= 1)
1666 return 0;
1667
1668 return tree_ssa_unswitch_loops (fun);
1669 }
1670
1671 } // anon namespace
1672
1673 gimple_opt_pass *
1674 make_pass_tree_unswitch (gcc::context *ctxt)
1675 {
1676 return new pass_tree_unswitch (ctxt);
1677 }
1678
1679