Lines Matching refs:loop

35 static void copy_loops_to (class loop **, int,
36 class loop *);
41 static void fix_loop_placements (class loop *, bool *);
92 class loop *loop = current_loops->tree_root, *act; in fix_bb_placement() local
103 if (flow_loop_nested_p (loop, act)) in fix_bb_placement()
104 loop = act; in fix_bb_placement()
107 if (loop == bb->loop_father) in fix_bb_placement()
111 add_bb_to_loop (bb, loop); in fix_bb_placement()
125 fix_loop_placement (class loop *loop, bool *irred_invalidated) in fix_loop_placement() argument
129 vec<edge> exits = get_loop_exit_edges (loop); in fix_loop_placement()
130 class loop *father = current_loops->tree_root, *act; in fix_loop_placement()
135 act = find_common_loop (loop, e->dest->loop_father); in fix_loop_placement()
140 if (father != loop_outer (loop)) in fix_loop_placement()
142 for (act = loop_outer (loop); act != father; act = loop_outer (act)) in fix_loop_placement()
143 act->num_nodes -= loop->num_nodes; in fix_loop_placement()
144 flow_loop_tree_node_remove (loop); in fix_loop_placement()
145 flow_loop_tree_node_add (father, loop); in fix_loop_placement()
185 class loop *base_loop, *target_loop; in fix_bb_placements()
258 class loop *nca; in fix_bb_placements()
310 class loop *l, *f; in remove_path()
430 place_new_loop (struct function *fn, class loop *loop) in place_new_loop() argument
432 loop->num = number_of_loops (fn); in place_new_loop()
433 vec_safe_push (loops_for_fn (fn)->larray, loop); in place_new_loop()
441 add_loop (class loop *loop, class loop *outer) in add_loop() argument
445 class loop *subloop; in add_loop()
450 place_new_loop (cfun, loop); in add_loop()
451 flow_loop_tree_node_add (outer, loop); in add_loop()
455 n = get_loop_body_with_size (loop, bbs, n_basic_blocks_for_fn (cfun)); in add_loop()
462 add_bb_to_loop (bbs[i], loop); in add_loop()
466 loop->num_nodes++; in add_loop()
474 flow_loop_tree_node_add (loop, subloop); in add_loop()
493 scale_loop_frequencies (class loop *loop, profile_probability p) in scale_loop_frequencies() argument
497 bbs = get_loop_body (loop); in scale_loop_frequencies()
498 scale_bbs_frequencies (bbs, loop->num_nodes, p); in scale_loop_frequencies()
511 scale_loop_profile (class loop *loop, profile_probability p, in scale_loop_profile() argument
520 loop->num); in scale_loop_profile()
527 scale_loop_frequencies (loop, p); in scale_loop_profile()
532 gcov_type iterations = expected_loop_iterations_unbounded (loop, NULL, true); in scale_loop_profile()
544 preheader_e = loop_preheader_edge (loop); in scale_loop_profile()
552 && loop->header->count.initialized_p ()) in scale_loop_profile()
556 e = single_exit (loop); in scale_loop_profile()
572 if (other_e->dest != loop->header in scale_loop_profile()
573 && other_e->dest != loop->latch in scale_loop_profile()
591 p = count_in.probability_in (loop->header->count); in scale_loop_profile()
602 if (loop->latch && loop->latch != e->src) in scale_loop_profile()
603 loop->latch->count += count_delta; in scale_loop_profile()
606 scale_loop_frequencies (loop, p); in scale_loop_profile()
609 if (loop->latch && loop->latch != e->src) in scale_loop_profile()
610 loop->latch->count -= count_delta; in scale_loop_profile()
614 (int)expected_loop_iterations_unbounded (loop, NULL, true)); in scale_loop_profile()
621 update_dominators_in_loop (class loop *loop) in update_dominators_in_loop() argument
629 body = get_loop_body (loop); in update_dominators_in_loop()
631 for (i = 0; i < loop->num_nodes; i++) in update_dominators_in_loop()
634 for (i = 0; i < loop->num_nodes; i++) in update_dominators_in_loop()
766 class loop *
773 class loop *outer) in create_empty_loop_on_edge()
776 class loop *loop; in create_empty_loop_on_edge() local
799 loop = alloc_loop (); in create_empty_loop_on_edge()
800 loop->header = loop_header; in create_empty_loop_on_edge()
801 loop->latch = loop_latch; in create_empty_loop_on_edge()
802 add_loop (loop, outer); in create_empty_loop_on_edge()
805 scale_loop_frequencies (loop, profile_probability::even ()); in create_empty_loop_on_edge()
808 update_dominators_in_loop (loop); in create_empty_loop_on_edge()
811 exit_e = single_exit (loop); in create_empty_loop_on_edge()
819 gsi_insert_seq_on_edge (loop_preheader_edge (loop), stmts); in create_empty_loop_on_edge()
826 gsi_insert_seq_on_edge (loop_preheader_edge (loop), stmts); in create_empty_loop_on_edge()
831 create_iv (initial_value, stride, iv, loop, &gsi, false, in create_empty_loop_on_edge()
847 return loop; in create_empty_loop_on_edge()
860 class loop *
868 class loop *loop = alloc_loop (); in loopify() local
869 class loop *outer = loop_outer (succ_bb->loop_father); in loopify()
872 loop->header = header_edge->dest; in loopify()
873 loop->latch = latch_edge->src; in loopify()
878 loop_redirect_edge (latch_edge, loop->header); in loopify()
886 loop_redirect_edge (false_edge, loop->header); in loopify()
890 set_immediate_dominator (CDI_DOMINATORS, loop->header, switch_bb); in loopify()
896 add_loop (loop, outer); in loopify()
908 scale_loop_frequencies (loop, false_scale); in loopify()
910 update_dominators_in_loop (loop); in loopify()
912 return loop; in loopify()
926 unloop (class loop *loop, bool *irred_invalidated, in unloop() argument
930 class loop *ploop; in unloop()
932 basic_block latch = loop->latch; in unloop()
935 if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP) in unloop()
944 body = get_loop_body (loop); in unloop()
945 n = loop->num_nodes; in unloop()
947 if (body[i]->loop_father == loop) in unloop()
950 add_bb_to_loop (body[i], loop_outer (loop)); in unloop()
954 while (loop->inner) in unloop()
956 ploop = loop->inner; in unloop()
958 flow_loop_tree_node_add (loop_outer (loop), ploop); in unloop()
962 delete_loop (loop); in unloop()
981 fix_loop_placements (class loop *loop, bool *irred_invalidated) in fix_loop_placements() argument
983 class loop *outer; in fix_loop_placements()
985 while (loop_outer (loop)) in fix_loop_placements()
987 outer = loop_outer (loop); in fix_loop_placements()
988 if (!fix_loop_placement (loop, irred_invalidated)) in fix_loop_placements()
996 fix_bb_placements (loop_preheader_edge (loop)->src, in fix_loop_placements()
998 loop = outer; in fix_loop_placements()
1006 copy_loop_info (class loop *loop, class loop *target) in copy_loop_info() argument
1009 target->any_upper_bound = loop->any_upper_bound; in copy_loop_info()
1010 target->nb_iterations_upper_bound = loop->nb_iterations_upper_bound; in copy_loop_info()
1011 target->any_likely_upper_bound = loop->any_likely_upper_bound; in copy_loop_info()
1013 = loop->nb_iterations_likely_upper_bound; in copy_loop_info()
1014 target->any_estimate = loop->any_estimate; in copy_loop_info()
1015 target->nb_iterations_estimate = loop->nb_iterations_estimate; in copy_loop_info()
1016 target->estimate_state = loop->estimate_state; in copy_loop_info()
1017 target->safelen = loop->safelen; in copy_loop_info()
1018 target->simdlen = loop->simdlen; in copy_loop_info()
1019 target->constraints = loop->constraints; in copy_loop_info()
1020 target->can_be_parallel = loop->can_be_parallel; in copy_loop_info()
1022 |= loop->warned_aggressive_loop_optimizations; in copy_loop_info()
1023 target->dont_vectorize = loop->dont_vectorize; in copy_loop_info()
1024 target->force_vectorize = loop->force_vectorize; in copy_loop_info()
1025 target->in_oacc_kernels_region = loop->in_oacc_kernels_region; in copy_loop_info()
1026 target->finite_p = loop->finite_p; in copy_loop_info()
1027 target->unroll = loop->unroll; in copy_loop_info()
1028 target->owned_clique = loop->owned_clique; in copy_loop_info()
1035 class loop *
1036 duplicate_loop (class loop *loop, class loop *target, class loop *after) in duplicate_loop() argument
1038 class loop *cloop; in duplicate_loop()
1042 copy_loop_info (loop, cloop); in duplicate_loop()
1045 set_loop_copy (loop, cloop); in duplicate_loop()
1057 duplicate_subloops (class loop *loop, class loop *target) in duplicate_subloops() argument
1059 class loop *aloop, *cloop, *tail; in duplicate_subloops()
1063 for (aloop = loop->inner; aloop; aloop = aloop->next) in duplicate_subloops()
1076 copy_loops_to (class loop **copied_loops, int n, class loop *target) in copy_loops_to()
1078 class loop *aloop, *tail; in copy_loops_to()
1104 can_duplicate_loop_p (const class loop *loop) in can_duplicate_loop_p() argument
1107 basic_block *bbs = get_loop_body (loop); in can_duplicate_loop_p()
1109 ret = can_copy_bbs_p (bbs, loop->num_nodes); in can_duplicate_loop_p()
1128 duplicate_loop_to_header_edge (class loop *loop, edge e, in duplicate_loop_to_header_edge() argument
1133 class loop *target, *aloop; in duplicate_loop_to_header_edge()
1134 class loop **orig_loops; in duplicate_loop_to_header_edge()
1136 basic_block header = loop->header, latch = loop->latch; in duplicate_loop_to_header_edge()
1156 gcc_assert (e->dest == loop->header); in duplicate_loop_to_header_edge()
1162 gcc_assert (flow_bb_inside_loop_p (loop, orig->src)); in duplicate_loop_to_header_edge()
1163 gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest)); in duplicate_loop_to_header_edge()
1166 n = loop->num_nodes; in duplicate_loop_to_header_edge()
1167 bbs = get_loop_body_in_dom_order (loop); in duplicate_loop_to_header_edge()
1168 gcc_assert (bbs[0] == loop->header); in duplicate_loop_to_header_edge()
1169 gcc_assert (bbs[n - 1] == loop->latch); in duplicate_loop_to_header_edge()
1172 if (!can_copy_bbs_p (bbs, loop->num_nodes)) in duplicate_loop_to_header_edge()
1177 new_bbs = XNEWVEC (basic_block, loop->num_nodes); in duplicate_loop_to_header_edge()
1185 latch_edge = loop_latch_edge (loop); in duplicate_loop_to_header_edge()
1278 for (aloop = loop->inner; aloop; aloop = aloop->next) in duplicate_loop_to_header_edge()
1280 orig_loops = XNEWVEC (class loop *, n_orig_loops); in duplicate_loop_to_header_edge()
1281 for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++) in duplicate_loop_to_header_edge()
1284 set_loop_copy (loop, target); in duplicate_loop_to_header_edge()
1303 copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop, in duplicate_loop_to_header_edge()
1341 loop->header); in duplicate_loop_to_header_edge()
1343 latch = loop->latch = new_bbs[n - 1]; in duplicate_loop_to_header_edge()
1349 loop->header); in duplicate_loop_to_header_edge()
1427 if (flow_bb_inside_loop_p (loop, dominated)) in duplicate_loop_to_header_edge()
1457 has_preds_from_loop (basic_block block, class loop *loop) in has_preds_from_loop() argument
1463 if (e->src->loop_father == loop) in has_preds_from_loop()
1477 create_preheader (class loop *loop, int flags) in create_preheader() argument
1487 FOR_EACH_EDGE (e, ei, loop->header->preds) in create_preheader()
1489 if (e->src == loop->latch) in create_preheader()
1518 || has_preds_from_loop (single_entry->src, loop))) in create_preheader()
1525 mfb_kj_edge = loop_latch_edge (loop); in create_preheader()
1533 edge fallthru = make_forwarder_block (loop->header, mfb_keep_just, NULL); in create_preheader()
1535 loop->header = fallthru->dest; in create_preheader()
1564 loop->num); in create_preheader()
1578 class loop *loop; in create_preheaders() local
1583 FOR_EACH_LOOP (loop, 0) in create_preheaders()
1584 create_preheader (loop, flags); in create_preheaders()
1593 class loop *loop; in force_single_succ_latches() local
1596 FOR_EACH_LOOP (loop, 0) in force_single_succ_latches()
1598 if (loop->latch != loop->header && single_succ_p (loop->latch)) in force_single_succ_latches()
1601 e = find_edge (loop->latch, loop->header); in force_single_succ_latches()
1682 class loop *
1683 loop_version (class loop *loop, in loop_version() argument
1692 class loop *nloop; in loop_version()
1696 entry = loop_preheader_edge (loop); in loop_version()
1704 if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1, in loop_version()
1727 latch_edge = single_succ_edge (get_bb_copy (loop->latch)); in loop_version()
1731 single_pred_edge (get_bb_copy (loop->header)), in loop_version()
1736 copy_loop_info (loop, nloop); in loop_version()
1737 set_loop_copy (loop, nloop); in loop_version()
1749 loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP; in loop_version()
1759 after = loop->latch; in loop_version()
1772 split_edge (loop_preheader_edge (loop)); in loop_version()