2 Copyright (C) 2004-2025 Free Software Foundation, Inc.
4 This file is part of GCC.
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
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
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/>. */
22 #include "coretypes.h"
26 #include "tree-pass.h"
28 #include "fold-const.h"
32 #include "tree-ssa-loop-niter.h"
33 #include "tree-ssa-loop.h"
34 #include "tree-into-ssa.h"
36 #include "tree-inline.h"
37 #include "gimple-iterator.h"
39 #include "tree-ssa-loop-manip.h"
40 #include "tree-vectorizer.h"
41 #include "tree-pretty-print.h"
42 #include "gimple-range.h"
46 /* This file implements the loop unswitching, i.e. transformation of loops like
59 where inv is the loop invariant, into
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
82 /* Loop unswitching algorithm for innermost loops works in the following steps:
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
101 7) The process is repeated until we reach a growth threshold or all
102 unswitching opportunities are taken. */
104 /* A tuple that holds a GENERIC condition and value range for an unswitching
107 struct unswitch_predicate
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)
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 ();
122 num
= predicates
->length ();
123 predicates
->safe_push (this);
126 /* CTOR for a GIMPLE condition statement. */
127 unswitch_predicate (gcond
*stmt
)
130 basic_block bb
= gimple_bb (stmt
);
131 if (EDGE_SUCC (bb
, 0)->flags
& EDGE_TRUE_VALUE
)
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
)))
142 auto range_op
= range_op_handler (code
);
143 int_range
<2> rhs_range (TREE_TYPE (rhs
));
144 if (CONSTANT_CLASS_P (rhs
))
146 wide_int w
= wi::to_wide (rhs
);
147 rhs_range
.set (TREE_TYPE (rhs
), w
, w
);
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
))
154 true_range
.set_varying (TREE_TYPE (lhs
));
155 false_range
.set_varying (TREE_TYPE (lhs
));
158 num
= predicates
->length ();
159 predicates
->safe_push (this);
162 /* Copy ranges for purpose of usage in predicate path. */
165 copy_merged_ranges ()
167 merged_true_range
= true_range
;
168 merged_false_range
= false_range
;
171 /* GENERIC unswitching expression testing LHS against CONSTANT. */
174 /* LHS of the expression. */
177 /* Initial ranges (when the expression is true/false) for the expression. */
178 int_range_max true_range
= {}, false_range
= {};
180 /* Modified range that is part of a predicate path. */
181 int_range_max merged_true_range
= {}, merged_false_range
= {};
183 /* Index of the edge the predicate belongs to in the successor vector. */
186 /* The profile count of this predicate. */
189 /* Whether the predicate was created from a switch statement. */
192 /* The number of the predicate in the predicates vector below. */
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
;
200 vec
<unswitch_predicate
*> *unswitch_predicate::predicates
;
202 /* Ranger instance used in the pass. */
203 static gimple_ranger
*ranger
= NULL
;
205 /* Cache storage for unswitch_predicate belonging to a basic block. */
206 static vec
<vec
<unswitch_predicate
*>> *bb_predicates
;
208 /* The type represents a predicate path leading to a basic block. */
209 typedef vec
<std::pair
<unswitch_predicate
*, bool>> predicate_vector
;
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
,
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
,
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);
234 /* Return vector of predicates that belong to a basic block. */
236 static vec
<unswitch_predicate
*> &
237 get_predicates_for_bb (basic_block bb
)
239 gimple
*last
= last_nondebug_stmt (bb
);
240 return (*bb_predicates
)[last
== NULL
? 0 : gimple_uid (last
)];
243 /* Save predicates that belong to a basic block. */
246 set_predicates_for_bb (basic_block bb
, vec
<unswitch_predicate
*> predicates
)
248 gimple_set_uid (last_nondebug_stmt (bb
), bb_predicates
->length ());
249 bb_predicates
->safe_push (predicates
);
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. */
257 init_loop_unswitch_info (class loop
*&loop
, unswitch_predicate
*&hottest
,
258 basic_block
&hottest_bb
)
260 unsigned total_insns
= 0;
262 basic_block
*bbs
= get_loop_body (loop
);
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
270 outer_loop
= loop_outer (outer_loop
);
273 /* Find all unswitching candidates in the innermost loop. */
274 for (unsigned i
= 0; i
!= loop
->num_nodes
; i
++)
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
);
285 candidates
.release ();
286 gimple
*last
= last_nondebug_stmt (bbs
[i
]);
288 gimple_set_uid (last
, 0);
292 if (outer_loop
!= loop
)
295 bbs
= get_loop_body (outer_loop
);
298 /* Calculate instruction count. */
299 for (unsigned i
= 0; i
< outer_loop
->num_nodes
; i
++)
302 for (gimple_stmt_iterator gsi
= gsi_start_bb (bbs
[i
]); !gsi_end_p (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
]))
308 gimple
*last
= last_nondebug_stmt (bbs
[i
]);
310 gimple_set_uid (last
, 0);
313 bbs
[i
]->aux
= (void *)(uintptr_t)insns
;
314 total_insns
+= insns
;
323 /* Main entry point. Perform loop unswitching on all suitable loops. */
326 tree_ssa_unswitch_loops (function
*fun
)
328 bool changed_unswitch
= false;
329 bool changed_hoist
= false;
330 auto_edge_flag
ignored_edge_flag (fun
);
331 mark_ssa_maybe_undefs ();
333 ranger
= enable_ranger (fun
);
335 /* Go through all loops starting from innermost, hoisting guards. */
336 for (auto loop
: loops_list (fun
, LI_FROM_INNERMOST
))
339 changed_hoist
|= tree_unswitch_outer_loop (loop
);
342 /* Go through innermost loops, unswitching on invariant predicates
344 for (auto loop
: loops_list (fun
, LI_ONLY_INNERMOST
))
346 /* Perform initial tests if unswitch is eligible. */
347 dump_user_location_t loc
= find_loop_location (loop
);
349 /* Do not unswitch in cold regions. */
350 if (optimize_loop_for_size_p (loop
))
352 if (dump_enabled_p ())
353 dump_printf_loc (MSG_NOTE
, loc
,
354 "Not unswitching cold loops\n");
358 /* If the loop is not expected to iterate, there is no need
360 HOST_WIDE_INT iterations
= estimated_loop_iterations_int (loop
);
362 iterations
= likely_max_loop_iterations_int (loop
);
363 if (iterations
>= 0 && iterations
<= 1)
365 if (dump_enabled_p ())
366 dump_printf_loc (MSG_NOTE
, loc
,
367 "Not unswitching, loop is not expected"
372 bb_predicates
= new vec
<vec
<unswitch_predicate
*>> ();
373 bb_predicates
->safe_push (vec
<unswitch_predicate
*> ());
374 unswitch_predicate::predicates
= new vec
<unswitch_predicate
*> ();
377 unswitch_predicate
*hottest
;
378 basic_block hottest_bb
;
379 unsigned int loop_size
= init_loop_unswitch_info (loop
, hottest
,
381 unsigned int budget
= loop_size
+ param_max_unswitch_insns
;
383 predicate_vector predicate_path
;
384 predicate_path
.create (8);
386 changed_unswitch
|= tree_unswitch_single_loop (loop
, loc
, predicate_path
,
388 ignored_edge_flag
, handled
,
389 hottest
, hottest_bb
);
390 predicate_path
.release ();
392 for (auto predlist
: bb_predicates
)
394 bb_predicates
->release ();
395 delete bb_predicates
;
396 bb_predicates
= NULL
;
398 for (auto pred
: unswitch_predicate::predicates
)
400 unswitch_predicate::predicates
->release ();
401 delete unswitch_predicate::predicates
;
402 unswitch_predicate::predicates
= NULL
;
405 disable_ranger (fun
);
406 clear_aux_for_blocks ();
408 if (changed_unswitch
)
409 clean_up_after_unswitching (ignored_edge_flag
);
411 if (changed_unswitch
|| changed_hoist
)
412 return TODO_cleanup_cfg
;
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. */
422 is_maybe_undefined (const tree name
, gimple
*stmt
, class loop
*loop
)
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
)
430 return ssa_name_maybe_undef_p (name
);
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
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
)
451 /* BB must end in a simple conditional jump. */
452 last
= *gsi_last_bb (bb
);
456 if (gcond
*stmt
= safe_dyn_cast
<gcond
*> (last
))
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
))
464 /* At least the LHS needs to be symbolic. */
465 if (TREE_CODE (gimple_cond_lhs (stmt
)) != SSA_NAME
)
468 /* Condition must be invariant. */
469 FOR_EACH_SSA_TREE_OPERAND (use
, stmt
, iter
, SSA_OP_USE
)
471 def
= SSA_NAME_DEF_STMT (use
);
472 def_bb
= gimple_bb (def
);
474 && flow_bb_inside_loop_p (loop
, def_bb
))
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
))
481 /* Narrow OUTER_LOOP. */
482 if (outer_loop
!= loop
)
483 FOR_EACH_SSA_TREE_OPERAND (use
, stmt
, iter
, SSA_OP_USE
)
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);
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
)
505 else if (gswitch
*stmt
= safe_dyn_cast
<gswitch
*> (last
))
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)
512 /* Index must be invariant. */
513 def
= SSA_NAME_DEF_STMT (idx
);
514 def_bb
= gimple_bb (def
);
516 && flow_bb_inside_loop_p (loop
, def_bb
))
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
))
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);
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);
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
)
541 tree lab
= gimple_switch_label (stmt
, i
);
543 int_range
<2> lab_range
;
544 tree low
= fold_convert (idx_type
, CASE_LOW (lab
));
545 if (CASE_HIGH (lab
) != NULL_TREE
)
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
));
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
);
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
)
567 expr
= fold_build2 (BIT_IOR_EXPR
, boolean_type_node
, expr
, cmp
);
568 edge_range
[(uintptr_t)e
->aux
].union_ (lab_range
);
571 /* Now register the predicates. */
572 for (edge_index
= 0; edge_index
< preds
.length (); ++edge_index
)
574 edge e
= EDGE_SUCC (gimple_bb (stmt
), edge_index
);
576 if (preds
[edge_index
] != NULL_TREE
)
578 unswitch_predicate
*predicate
579 = new unswitch_predicate (preds
[edge_index
], idx
,
581 edge_range
[edge_index
]);
582 candidates
.safe_push (predicate
);
583 if (!hottest
|| predicate
->count
> hottest
->count
)
593 /* Merge ranges for the last item of PREDICATE_PATH with a predicate
594 that shared the same LHS. */
597 merge_last (predicate_vector
&predicate_path
)
599 unswitch_predicate
*last_predicate
= predicate_path
.last ().first
;
601 for (int i
= predicate_path
.length () - 2; i
>= 0; i
--)
603 unswitch_predicate
*predicate
= predicate_path
[i
].first
;
604 bool true_edge
= predicate_path
[i
].second
;
606 if (operand_equal_p (predicate
->lhs
, last_predicate
->lhs
, 0))
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
);
617 /* Add PREDICATE to PREDICATE_PATH on TRUE_EDGE. */
620 add_predicate_to_path (predicate_vector
&predicate_path
,
621 unswitch_predicate
*predicate
, bool true_edge
)
623 predicate
->copy_merged_ranges ();
624 predicate_path
.safe_push (std::make_pair (predicate
, true_edge
));
625 merge_last (predicate_path
);
629 find_range_for_lhs (predicate_vector
&predicate_path
, tree lhs
,
630 int_range_max
&range
)
632 for (int i
= predicate_path
.length () - 1; i
>= 0; i
--)
634 unswitch_predicate
*predicate
= predicate_path
[i
].first
;
635 bool true_edge
= predicate_path
[i
].second
;
637 if (operand_equal_p (predicate
->lhs
, lhs
, 0))
639 range
= (true_edge
? predicate
->merged_true_range
640 : predicate
->merged_false_range
);
641 return !range
.undefined_p ();
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). */
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
)
658 unswitch_predicate
*last_predicate
= predicate_path
.last ().first
;
659 bool true_edge
= predicate_path
.last ().second
;
661 if (gcond
*cond
= dyn_cast
<gcond
*> (stmt
))
663 tree lhs
= gimple_cond_lhs (cond
);
664 if (!operand_equal_p (lhs
, last_predicate
->lhs
))
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
)))
676 int_range_max path_range
;
678 if (find_range_for_lhs (predicate_path
, lhs
, path_range
)
679 && fold_range (r
, cond
, path_range
)
681 return r
.zero_p () ? boolean_false_node
: boolean_true_node
;
684 else if (gswitch
*swtch
= dyn_cast
<gswitch
*> (stmt
))
686 unsigned nlabels
= gimple_switch_num_labels (swtch
);
688 tree idx
= gimple_switch_index (swtch
);
690 /* Already folded switch. */
691 if (TREE_CONSTANT (idx
))
694 int_range_max path_range
;
695 if (!find_range_for_lhs (predicate_path
, idx
, path_range
))
698 tree result
= NULL_TREE
;
699 edge single_edge
= NULL
;
700 for (unsigned i
= 0; i
< nlabels
; ++i
)
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
)
709 if (!ranger
->gori ().edge_range_p (r
, e
, idx
,
710 *get_global_range_query ()))
712 r
.intersect (path_range
);
713 if (r
.undefined_p ())
714 ignored_edges
->add (e
);
720 result
= CASE_LOW (lab
);
722 else if (single_edge
!= e
)
727 /* Only one edge from the switch is alive. */
728 if (single_edge
&& result
)
735 /* Simplify LOOP based on PREDICATE_PATH where dead edges are properly
739 simplify_loop_version (class loop
*loop
, predicate_vector
&predicate_path
,
740 int ignored_edge_flag
, bitmap handled
)
742 bool changed
= false;
743 basic_block
*bbs
= get_loop_body (loop
);
745 hash_set
<edge
> ignored_edges
;
746 for (unsigned i
= 0; i
!= loop
->num_nodes
; i
++)
748 vec
<unswitch_predicate
*> &predicates
= get_predicates_for_bb (bbs
[i
]);
749 if (predicates
.is_empty ())
752 gimple
*stmt
= *gsi_last_bb (bbs
[i
]);
753 tree folded
= evaluate_control_stmt_using_entry_checks (stmt
,
758 if (gcond
*cond
= dyn_cast
<gcond
*> (stmt
))
763 if (integer_nonzerop (folded
))
764 gimple_cond_set_condition_from_tree (cond
, boolean_true_node
);
766 gimple_cond_set_condition_from_tree (cond
, boolean_false_node
);
768 gcc_assert (predicates
.length () == 1);
769 bitmap_set_bit (handled
, predicates
[0]->num
);
775 else if (gswitch
*swtch
= dyn_cast
<gswitch
*> (stmt
))
779 FOR_EACH_EDGE (e
, ei
, bbs
[i
]->succs
)
780 if (ignored_edges
.contains (e
))
781 e
->flags
|= ignored_edge_flag
;
783 for (unsigned j
= 0; j
< predicates
.length (); j
++)
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
);
792 gimple_switch_set_index (swtch
, folded
);
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. */
808 template <typename VisitOp
>
810 evaluate_bbs (class loop
*loop
, predicate_vector
*predicate_path
,
811 int ignored_edge_flag
, VisitOp visit
)
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
;
818 loop
->header
->flags
|= reachable_flag
;
819 worklist
.quick_push (loop
->header
);
820 reachable
.safe_push (loop
->header
);
822 while (!worklist
.is_empty ())
826 int flags
= ignored_edge_flag
;
827 basic_block bb
= worklist
.pop ();
832 gimple
*last
= *gsi_last_bb (bb
);
833 if (gcond
*cond
= safe_dyn_cast
<gcond
*> (last
))
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
)
842 if (!get_predicates_for_bb (bb
).is_empty ()
843 && (res
= evaluate_control_stmt_using_entry_checks
844 (cond
, *predicate_path
, ignored_edge_flag
,
846 flags
= (integer_nonzerop (res
)
847 ? EDGE_FALSE_VALUE
: EDGE_TRUE_VALUE
);
850 else if (gswitch
*swtch
= safe_dyn_cast
<gswitch
*> (last
))
852 && !get_predicates_for_bb (bb
).is_empty ())
853 evaluate_control_stmt_using_entry_checks (swtch
, *predicate_path
,
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. */
862 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
864 basic_block dest
= e
->dest
;
866 if (flow_bb_inside_loop_p (loop
, dest
)
867 && !(dest
->flags
& reachable_flag
)
868 && !(e
->flags
& flags
)
869 && !ignored_edges
.contains (e
))
871 dest
->flags
|= reachable_flag
;
872 worklist
.safe_push (dest
);
873 reachable
.safe_push (dest
);
878 /* Clear the flag from basic blocks. */
879 while (!reachable
.is_empty ())
880 reachable
.pop ()->flags
&= ~reachable_flag
;
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. */
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
)
895 auto sum_size
= [&](basic_block bb
) -> bool
896 { size
+= (uintptr_t)bb
->aux
; return false; };
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
;
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
;
909 *true_size
= true_loop_cost
;
910 *false_size
= false_loop_cost
;
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. */
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
)
926 bool changed
= false;
927 unswitch_predicate
*predicate
= NULL
;
928 basic_block predicate_bb
= NULL
;
929 unsigned true_size
= 0, false_size
= 0;
931 auto check_predicates
= [&](basic_block bb
) -> bool
933 for (auto pred
: get_predicates_for_bb (bb
))
935 if (bitmap_bit_p (handled
, pred
->num
))
938 evaluate_loop_insns_for_predicate (loop
, predicate_path
,
939 pred
, ignored_edge_flag
,
940 &true_size
, &false_size
);
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
)
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
);
956 /* FIXME: right now we select first candidate, but we can
957 choose the cheapest or hottest one. */
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
);
972 predicate_bb
= hottest_bb
;
975 /* Check predicates of reachable blocks. */
976 evaluate_bbs (loop
, NULL
, ignored_edge_flag
, check_predicates
);
978 if (predicate
!= NULL
)
980 if (!dbg_cnt (loop_unswitch
))
983 if (dump_enabled_p ())
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
);
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
);
1004 free_original_copy_tables ();
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
;
1014 free_original_copy_tables ();
1016 /* Update the SSA form after unswitching. */
1017 update_ssa (TODO_update_ssa_no_phi
);
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
,
1027 ignored_edge_flag
, handled_copy
);
1028 predicate_path
.pop ();
1029 BITMAP_FREE (handled_copy
);
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
,
1039 ignored_edge_flag
, handled
);
1040 predicate_path
.pop ();
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
1054 tree_unswitch_loop (class loop
*loop
, edge edge_true
, tree cond
)
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);
1060 profile_probability prob_true
= edge_true
->probability
;
1061 return loop_version (loop
, unshare_expr (cond
),
1063 prob_true
.invert (),
1064 prob_true
, prob_true
.invert (),
1068 /* Unswitch outer loops by hoisting invariant guard on
1069 inner loop without code duplication. */
1071 tree_unswitch_outer_loop (class loop
*loop
)
1074 HOST_WIDE_INT iterations
;
1076 gcc_assert (loop
->inner
);
1077 if (loop
->inner
->next
)
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
)
1083 /* Check that phi argument of exit edge is not defined inside loop. */
1084 if (!check_exit_phi (loop
))
1086 /* If the loop is not expected to iterate, there is no need
1088 iterations
= estimated_loop_iterations_int (loop
);
1090 iterations
= likely_max_loop_iterations_int (loop
);
1091 if (iterations
>= 0 && iterations
<= 1)
1093 if (dump_enabled_p ())
1094 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, find_loop_location (loop
),
1095 "Not unswitching, loop is not expected"
1100 bool changed
= false;
1101 auto_vec
<gimple
*> dbg_to_reset
;
1102 while ((guard
= find_loop_guard (loop
, dbg_to_reset
)))
1104 hoist_guard (loop
, guard
);
1105 for (gimple
*debug_stmt
: dbg_to_reset
)
1107 gimple_debug_bind_reset_value (debug_stmt
);
1108 update_stmt (debug_stmt
);
1110 dbg_to_reset
.truncate (0);
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. */
1121 find_loop_guard (class loop
*loop
, vec
<gimple
*> &dbg_to_reset
)
1123 basic_block header
= loop
->header
;
1124 edge guard_edge
, te
, fe
;
1125 basic_block
*body
= NULL
;
1130 /* We check for the following situation:
1139 nvar = phi(orig, bvar) ... for all variables changed in body;
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
1153 b) anything defined in something1, something2 and something3
1154 is not used outside of the loop. */
1159 basic_block next
= NULL
;
1160 if (single_succ_p (header
))
1161 next
= single_succ (header
);
1164 cond
= safe_dyn_cast
<gcond
*> (*gsi_last_bb (header
));
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
))
1172 else if (gimple_cond_false_p (cond
))
1177 /* Never traverse a backedge. */
1178 if (header
->loop_father
->header
== next
)
1183 if (!flow_bb_inside_loop_p (loop
, te
->dest
)
1184 || !flow_bb_inside_loop_p (loop
, fe
->dest
))
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
))))
1191 if (just_once_each_iteration_p (loop
, fe
->dest
))
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
))))
1202 dump_user_location_t loc
= find_loop_location (loop
);
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
))
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
);
1214 if (guard_edge
->dest
== loop
->latch
)
1216 if (dump_enabled_p ())
1217 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, loc
,
1218 "Guard edge destination is loop latch.\n");
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
,
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
)
1231 gimple
*def
= SSA_NAME_DEF_STMT (use
);
1232 basic_block def_bb
= gimple_bb (def
);
1234 && flow_bb_inside_loop_p (loop
, def_bb
))
1236 if (dump_enabled_p ())
1237 dump_printf_loc (MSG_NOTE
, loc
, "guard operands have definitions"
1243 body
= get_loop_body (loop
);
1244 for (i
= 0; i
< loop
->num_nodes
; i
++)
1246 basic_block bb
= body
[i
];
1247 if (bb
->loop_father
!= loop
)
1249 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1251 if (dump_enabled_p ())
1252 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, loc
,
1253 "Block %d is marked as irreducible in loop\n",
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
))
1264 if (dump_enabled_p ())
1265 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, loc
,
1266 "Block %d has side effects\n", bb
->index
);
1272 if (dump_enabled_p ())
1273 dump_printf_loc (MSG_NOTE
, loc
,
1274 "suitable to hoist\n");
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. */
1291 empty_bb_without_guard_p (class loop
*loop
, basic_block bb
,
1292 vec
<gimple
*> &dbg_to_reset
)
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
));
1298 ssa_op_iter op_iter
;
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
)
1304 for (gphi_iterator gsi
= gsi_start_phis (bb
);
1305 !gsi_end_p (gsi
); gsi_next (&gsi
))
1307 gphi
*phi
= gsi
.phi ();
1308 name
= PHI_RESULT (phi
);
1309 if (virtual_operand_p (name
))
1312 if (used_outside_loop_p (loop
, name
, dbg_to_reset
))
1317 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
);
1318 !gsi_end_p (gsi
); gsi_next (&gsi
))
1320 gimple
*stmt
= gsi_stmt (gsi
);
1321 if (is_gimple_debug (stmt
))
1324 if (gimple_has_side_effects (stmt
))
1327 if (gimple_vdef(stmt
))
1330 FOR_EACH_SSA_TREE_OPERAND (name
, stmt
, op_iter
, SSA_OP_DEF
)
1332 if (may_be_used_outside
1333 && used_outside_loop_p (loop
, name
, dbg_to_reset
))
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. */
1344 used_outside_loop_p (class loop
*loop
, tree name
, vec
<gimple
*> &dbg_to_reset
)
1346 imm_use_iterator it
;
1349 FOR_EACH_IMM_USE_FAST (use
, it
, name
)
1351 gimple
*stmt
= USE_STMT (use
);
1352 if (!flow_bb_inside_loop_p (loop
, gimple_bb (stmt
)))
1354 if (!is_gimple_debug (stmt
))
1356 dbg_to_reset
.safe_push (stmt
);
1363 /* Return argument for loop preheader edge in header virtual phi if any. */
1366 get_vop_from_header (class loop
*loop
)
1368 for (gphi_iterator gsi
= gsi_start_phis (loop
->header
);
1369 !gsi_end_p (gsi
); gsi_next (&gsi
))
1371 gphi
*phi
= gsi
.phi ();
1372 if (!virtual_operand_p (gimple_phi_result (phi
)))
1374 return PHI_ARG_DEF_FROM_EDGE (phi
, loop_preheader_edge (loop
));
1379 /* Move the check of GUARD outside of LOOP. */
1382 hoist_guard (class loop
*loop
, edge guard
)
1384 edge exit
= single_exit (loop
);
1385 edge preh
= loop_preheader_edge (loop
);
1386 basic_block pre_header
= preh
->src
;
1388 edge te
, fe
, e
, new_edge
;
1390 basic_block guard_bb
= guard
->src
;
1392 gimple_stmt_iterator gsi
;
1394 bool fix_dom_of_exit
;
1395 gcond
*cond_stmt
, *new_cond_stmt
;
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. */
1414 gimple_cond_make_false (cond_stmt
);
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
));
1421 dump_user_location_t loc
= find_loop_location (loop
);
1423 if (dump_enabled_p ())
1426 guard
->probability
.dump (buffer
);
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
);
1435 gcc_assert (loop_preheader_edge (loop
)->src
== e
->dest
);
1439 e
->flags
= EDGE_TRUE_VALUE
;
1440 flags
|= EDGE_FALSE_VALUE
;
1445 e
->flags
= EDGE_FALSE_VALUE
;
1446 flags
|= EDGE_TRUE_VALUE
;
1449 new_edge
= make_edge (pre_header
, exit
->dest
, flags
);
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
,
1457 : guard
->count ().apply_probability (new_edge
->probability
);
1459 if (skip_count
> e
->count ())
1461 fprintf (dump_file
, " Capping count; expect profile inconsistency\n");
1462 skip_count
= e
->count ();
1464 if (dump_enabled_p ())
1467 new_edge
->probability
.dump (buffer
);
1469 dump_printf_loc (MSG_NOTE
, loc
,
1470 "Estimated probability of skipping loop is %s\n",
1474 /* Update profile after the transform:
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 ();
1481 /* ... now update profile to represent that original guard will be optimized
1483 guard
->probability
= profile_probability::never ();
1484 not_guard
->probability
= profile_probability::always ();
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
);
1490 for (unsigned int i
= 0; i
< loop
->num_nodes
; i
++)
1492 basic_block bb
= body
[i
];
1493 if (!dominated_by_p (CDI_DOMINATORS
, bb
, not_guard
->dest
))
1495 if (dump_enabled_p ())
1496 dump_printf_loc (MSG_NOTE
, loc
,
1497 "Scaling nonguarded BBs in loop: %i\n",
1499 if (e
->probability
.initialized_p ())
1500 scale_bbs_frequencies (&bb
, 1, e
->probability
);
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. */
1508 for (gphi_iterator gsi
= gsi_start_phis (bb
);
1509 !gsi_end_p (gsi
); gsi_next (&gsi
))
1511 gphi
*phi
= gsi
.phi ();
1513 if (virtual_operand_p (gimple_phi_result (phi
)))
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
);
1523 /* Use exit edge argument. */
1524 arg
= PHI_ARG_DEF_FROM_EDGE (phi
, exit
);
1525 add_phi_arg (phi
, arg
, new_edge
, UNKNOWN_LOCATION
);
1529 if (dump_enabled_p ())
1530 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
1536 /* Return true if phi argument for exit edge can be used
1537 for edge around loop. */
1540 check_exit_phi (class loop
*loop
)
1542 edge exit
= single_exit (loop
);
1543 basic_block pre_header
= loop_preheader_edge (loop
)->src
;
1545 for (gphi_iterator gsi
= gsi_start_phis (exit
->dest
);
1546 !gsi_end_p (gsi
); gsi_next (&gsi
))
1548 gphi
*phi
= gsi
.phi ();
1552 if (virtual_operand_p (gimple_phi_result (phi
)))
1554 arg
= PHI_ARG_DEF_FROM_EDGE (phi
, exit
);
1555 if (TREE_CODE (arg
) != SSA_NAME
)
1557 def
= SSA_NAME_DEF_STMT (arg
);
1560 def_bb
= gimple_bb (def
);
1563 if (!dominated_by_p (CDI_DOMINATORS
, pre_header
, def_bb
))
1564 /* Definition inside loop! */
1566 /* Check loop closed phi invariant. */
1567 if (!flow_bb_inside_loop_p (def_bb
->loop_father
, pre_header
))
1573 /* Remove all dead cases from switches that are unswitched. */
1576 clean_up_after_unswitching (int ignored_edge_flag
)
1581 bool removed_edge
= false;
1583 FOR_EACH_BB_FN (bb
, cfun
)
1585 gswitch
*stmt
= safe_dyn_cast
<gswitch
*> (*gsi_last_bb (bb
));
1586 if (stmt
&& !CONSTANT_CLASS_P (gimple_switch_index (stmt
)))
1588 unsigned nlabels
= gimple_switch_num_labels (stmt
);
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
)
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
);
1599 ; /* The edge is already removed. */
1600 else if (e
->flags
& ignored_edge_flag
)
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. */
1608 removed_edge
= true;
1613 gimple_switch_set_label (stmt
, index
, lab
);
1618 if (index
!= nlabels
)
1619 gimple_switch_set_num_labels (stmt
, index
);
1622 /* Clean up the ignored_edge_flag from edges. */
1623 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1624 e
->flags
&= ~ignored_edge_flag
;
1627 /* If we removed an edge we possibly have to recompute dominators. */
1629 free_dominance_info (CDI_DOMINATORS
);
1632 /* Loop unswitching pass. */
1636 const pass_data pass_data_tree_unswitch
=
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 */
1649 class pass_tree_unswitch
: public gimple_opt_pass
1652 pass_tree_unswitch (gcc::context
*ctxt
)
1653 : gimple_opt_pass (pass_data_tree_unswitch
, ctxt
)
1656 /* opt_pass methods: */
1657 bool gate (function
*) final override
{ return flag_unswitch_loops
!= 0; }
1658 unsigned int execute (function
*) final override
;
1660 }; // class pass_tree_unswitch
1663 pass_tree_unswitch::execute (function
*fun
)
1665 if (number_of_loops (fun
) <= 1)
1668 return tree_ssa_unswitch_loops (fun
);
1674 make_pass_tree_unswitch (gcc::context
*ctxt
)
1676 return new pass_tree_unswitch (ctxt
);