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 auto_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()
184 class loop *base_loop, *target_loop; in fix_bb_placements()
257 class loop *nca; in fix_bb_placements()
309 class loop *l, *f; in remove_path()
429 place_new_loop (struct function *fn, class loop *loop) in place_new_loop() argument
431 loop->num = number_of_loops (fn); in place_new_loop()
432 vec_safe_push (loops_for_fn (fn)->larray, loop); in place_new_loop()
440 add_loop (class loop *loop, class loop *outer) in add_loop() argument
444 class loop *subloop; in add_loop()
449 place_new_loop (cfun, loop); in add_loop()
450 flow_loop_tree_node_add (outer, loop); in add_loop()
454 n = get_loop_body_with_size (loop, bbs, n_basic_blocks_for_fn (cfun)); in add_loop()
461 add_bb_to_loop (bbs[i], loop); in add_loop()
465 loop->num_nodes++; in add_loop()
473 flow_loop_tree_node_add (loop, subloop); in add_loop()
492 scale_loop_frequencies (class loop *loop, profile_probability p) in scale_loop_frequencies() argument
496 bbs = get_loop_body (loop); in scale_loop_frequencies()
497 scale_bbs_frequencies (bbs, loop->num_nodes, p); in scale_loop_frequencies()
510 scale_loop_profile (class loop *loop, profile_probability p, in scale_loop_profile() argument
519 loop->num); in scale_loop_profile()
526 scale_loop_frequencies (loop, p); in scale_loop_profile()
531 gcov_type iterations = expected_loop_iterations_unbounded (loop, NULL, true); in scale_loop_profile()
543 preheader_e = loop_preheader_edge (loop); in scale_loop_profile()
551 && loop->header->count.initialized_p ()) in scale_loop_profile()
555 e = single_exit (loop); in scale_loop_profile()
571 if (other_e->dest != loop->header in scale_loop_profile()
572 && other_e->dest != loop->latch in scale_loop_profile()
590 p = count_in.probability_in (loop->header->count); in scale_loop_profile()
601 if (loop->latch && loop->latch != e->src) in scale_loop_profile()
602 loop->latch->count += count_delta; in scale_loop_profile()
605 scale_loop_frequencies (loop, p); in scale_loop_profile()
608 if (loop->latch && loop->latch != e->src) in scale_loop_profile()
609 loop->latch->count -= count_delta; in scale_loop_profile()
613 (int)expected_loop_iterations_unbounded (loop, NULL, true)); in scale_loop_profile()
620 update_dominators_in_loop (class loop *loop) in update_dominators_in_loop() argument
628 body = get_loop_body (loop); in update_dominators_in_loop()
630 for (i = 0; i < loop->num_nodes; i++) in update_dominators_in_loop()
633 for (i = 0; i < loop->num_nodes; i++) in update_dominators_in_loop()
765 class loop *
772 class loop *outer) in create_empty_loop_on_edge()
775 class loop *loop; in create_empty_loop_on_edge() local
798 loop = alloc_loop (); in create_empty_loop_on_edge()
799 loop->header = loop_header; in create_empty_loop_on_edge()
800 loop->latch = loop_latch; in create_empty_loop_on_edge()
801 add_loop (loop, outer); in create_empty_loop_on_edge()
804 scale_loop_frequencies (loop, profile_probability::even ()); in create_empty_loop_on_edge()
807 update_dominators_in_loop (loop); in create_empty_loop_on_edge()
810 exit_e = single_exit (loop); in create_empty_loop_on_edge()
818 gsi_insert_seq_on_edge (loop_preheader_edge (loop), stmts); in create_empty_loop_on_edge()
825 gsi_insert_seq_on_edge (loop_preheader_edge (loop), stmts); in create_empty_loop_on_edge()
830 create_iv (initial_value, stride, iv, loop, &gsi, false, in create_empty_loop_on_edge()
846 return loop; in create_empty_loop_on_edge()
860 unloop (class loop *loop, bool *irred_invalidated, in unloop() argument
864 class loop *ploop; in unloop()
866 basic_block latch = loop->latch; in unloop()
869 if (loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP) in unloop()
878 body = get_loop_body (loop); in unloop()
879 n = loop->num_nodes; in unloop()
881 if (body[i]->loop_father == loop) in unloop()
884 add_bb_to_loop (body[i], loop_outer (loop)); in unloop()
888 while (loop->inner) in unloop()
890 ploop = loop->inner; in unloop()
892 flow_loop_tree_node_add (loop_outer (loop), ploop); in unloop()
896 delete_loop (loop); in unloop()
915 fix_loop_placements (class loop *loop, bool *irred_invalidated) in fix_loop_placements() argument
917 class loop *outer; in fix_loop_placements()
919 while (loop_outer (loop)) in fix_loop_placements()
921 outer = loop_outer (loop); in fix_loop_placements()
922 if (!fix_loop_placement (loop, irred_invalidated)) in fix_loop_placements()
930 fix_bb_placements (loop_preheader_edge (loop)->src, in fix_loop_placements()
932 loop = outer; in fix_loop_placements()
940 copy_loop_info (class loop *loop, class loop *target) in copy_loop_info() argument
943 target->any_upper_bound = loop->any_upper_bound; in copy_loop_info()
944 target->nb_iterations_upper_bound = loop->nb_iterations_upper_bound; in copy_loop_info()
945 target->any_likely_upper_bound = loop->any_likely_upper_bound; in copy_loop_info()
947 = loop->nb_iterations_likely_upper_bound; in copy_loop_info()
948 target->any_estimate = loop->any_estimate; in copy_loop_info()
949 target->nb_iterations_estimate = loop->nb_iterations_estimate; in copy_loop_info()
950 target->estimate_state = loop->estimate_state; in copy_loop_info()
951 target->safelen = loop->safelen; in copy_loop_info()
952 target->simdlen = loop->simdlen; in copy_loop_info()
953 target->constraints = loop->constraints; in copy_loop_info()
954 target->can_be_parallel = loop->can_be_parallel; in copy_loop_info()
956 |= loop->warned_aggressive_loop_optimizations; in copy_loop_info()
957 target->dont_vectorize = loop->dont_vectorize; in copy_loop_info()
958 target->force_vectorize = loop->force_vectorize; in copy_loop_info()
959 target->in_oacc_kernels_region = loop->in_oacc_kernels_region; in copy_loop_info()
960 target->finite_p = loop->finite_p; in copy_loop_info()
961 target->unroll = loop->unroll; in copy_loop_info()
962 target->owned_clique = loop->owned_clique; in copy_loop_info()
969 class loop *
970 duplicate_loop (class loop *loop, class loop *target, class loop *after) in duplicate_loop() argument
972 class loop *cloop; in duplicate_loop()
976 copy_loop_info (loop, cloop); in duplicate_loop()
979 set_loop_copy (loop, cloop); in duplicate_loop()
991 duplicate_subloops (class loop *loop, class loop *target) in duplicate_subloops() argument
993 class loop *aloop, *cloop, *tail; in duplicate_subloops()
997 for (aloop = loop->inner; aloop; aloop = aloop->next) in duplicate_subloops()
1010 copy_loops_to (class loop **copied_loops, int n, class loop *target) in copy_loops_to()
1012 class loop *aloop, *tail; in copy_loops_to()
1038 can_duplicate_loop_p (const class loop *loop) in can_duplicate_loop_p() argument
1041 basic_block *bbs = get_loop_body (loop); in can_duplicate_loop_p()
1043 ret = can_copy_bbs_p (bbs, loop->num_nodes); in can_duplicate_loop_p()
1062 duplicate_loop_body_to_header_edge (class loop *loop, edge e, in duplicate_loop_body_to_header_edge() argument
1066 class loop *target, *aloop; in duplicate_loop_body_to_header_edge()
1067 class loop **orig_loops; in duplicate_loop_body_to_header_edge()
1069 basic_block header = loop->header, latch = loop->latch; in duplicate_loop_body_to_header_edge()
1089 gcc_assert (e->dest == loop->header); in duplicate_loop_body_to_header_edge()
1095 gcc_assert (flow_bb_inside_loop_p (loop, orig->src)); in duplicate_loop_body_to_header_edge()
1096 gcc_assert (!flow_bb_inside_loop_p (loop, orig->dest)); in duplicate_loop_body_to_header_edge()
1099 n = loop->num_nodes; in duplicate_loop_body_to_header_edge()
1100 bbs = get_loop_body_in_dom_order (loop); in duplicate_loop_body_to_header_edge()
1101 gcc_assert (bbs[0] == loop->header); in duplicate_loop_body_to_header_edge()
1102 gcc_assert (bbs[n - 1] == loop->latch); in duplicate_loop_body_to_header_edge()
1105 if (!can_copy_bbs_p (bbs, loop->num_nodes)) in duplicate_loop_body_to_header_edge()
1110 new_bbs = XNEWVEC (basic_block, loop->num_nodes); in duplicate_loop_body_to_header_edge()
1118 latch_edge = loop_latch_edge (loop); in duplicate_loop_body_to_header_edge()
1211 for (aloop = loop->inner; aloop; aloop = aloop->next) in duplicate_loop_body_to_header_edge()
1213 orig_loops = XNEWVEC (class loop *, n_orig_loops); in duplicate_loop_body_to_header_edge()
1214 for (aloop = loop->inner, i = 0; aloop; aloop = aloop->next, i++) in duplicate_loop_body_to_header_edge()
1217 set_loop_copy (loop, target); in duplicate_loop_body_to_header_edge()
1236 copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop, in duplicate_loop_body_to_header_edge()
1274 loop->header); in duplicate_loop_body_to_header_edge()
1276 latch = loop->latch = new_bbs[n - 1]; in duplicate_loop_body_to_header_edge()
1282 loop->header); in duplicate_loop_body_to_header_edge()
1359 if (flow_bb_inside_loop_p (loop, dominated)) in duplicate_loop_body_to_header_edge()
1388 has_preds_from_loop (basic_block block, class loop *loop) in has_preds_from_loop() argument
1394 if (e->src->loop_father == loop) in has_preds_from_loop()
1408 create_preheader (class loop *loop, int flags) in create_preheader() argument
1418 FOR_EACH_EDGE (e, ei, loop->header->preds) in create_preheader()
1420 if (e->src == loop->latch) in create_preheader()
1449 || has_preds_from_loop (single_entry->src, loop))) in create_preheader()
1456 mfb_kj_edge = loop_latch_edge (loop); in create_preheader()
1464 edge fallthru = make_forwarder_block (loop->header, mfb_keep_just, NULL); in create_preheader()
1466 loop->header = fallthru->dest; in create_preheader()
1495 loop->num); in create_preheader()
1512 for (auto loop : loops_list (cfun, 0)) in create_preheaders() local
1513 create_preheader (loop, flags); in create_preheaders()
1524 for (auto loop : loops_list (cfun, 0)) in force_single_succ_latches() local
1526 if (loop->latch != loop->header && single_succ_p (loop->latch)) in force_single_succ_latches()
1529 e = find_edge (loop->latch, loop->header); in force_single_succ_latches()
1610 class loop *
1611 loop_version (class loop *loop, in loop_version() argument
1620 class loop *nloop; in loop_version()
1624 entry = loop_preheader_edge (loop); in loop_version()
1632 if (!cfg_hook_duplicate_loop_body_to_header_edge (loop, entry, 1, NULL, NULL, in loop_version()
1640 latch_edge = single_succ_edge (get_bb_copy (loop->latch)); in loop_version()
1642 class loop *outer = loop_outer (latch_edge->dest->loop_father); in loop_version()
1643 edge new_header_edge = single_pred_edge (get_bb_copy (loop->header)); in loop_version()
1650 copy_loop_info (loop, nloop); in loop_version()
1651 set_loop_copy (loop, nloop); in loop_version()
1678 scale_loop_frequencies (loop, then_scale); in loop_version()
1680 update_dominators_in_loop (loop); in loop_version()
1687 loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP; in loop_version()
1697 after = loop->latch; in loop_version()
1710 split_edge (loop_preheader_edge (loop)); in loop_version()