Lines Matching refs:chain

297 typedef struct chain  struct
306 struct chain *ch1, *ch2; argument
423 dump_chain (FILE *file, chain_p chain) in dump_chain() argument
430 switch (chain->type) in dump_chain()
456 fprintf (file, "%s chain %p%s\n", chain_type, (void *) chain, in dump_chain()
457 chain->combined ? " (combined)" : ""); in dump_chain()
458 if (chain->type != CT_INVARIANT) in dump_chain()
459 fprintf (file, " max distance %u%s\n", chain->length, in dump_chain()
460 chain->has_max_use_after ? "" : ", may reuse first"); in dump_chain()
462 if (chain->type == CT_COMBINATION) in dump_chain()
465 (void *) chain->ch1, op_symbol_code (chain->op), in dump_chain()
466 (void *) chain->ch2); in dump_chain()
467 print_generic_expr (file, chain->rslt_type, TDF_SLIM); in dump_chain()
471 if (chain->vars.exists ()) in dump_chain()
474 FOR_EACH_VEC_ELT (chain->vars, i, var) in dump_chain()
482 if (chain->inits.exists ()) in dump_chain()
485 FOR_EACH_VEC_ELT (chain->inits, i, var) in dump_chain()
494 FOR_EACH_VEC_ELT (chain->refs, i, a) in dump_chain()
506 chain_p chain; in dump_chains() local
509 FOR_EACH_VEC_ELT (chains, i, chain) in dump_chains()
510 dump_chain (file, chain); in dump_chains()
544 release_chain (chain_p chain) in release_chain() argument
549 if (chain == NULL) in release_chain()
552 FOR_EACH_VEC_ELT (chain->refs, i, ref) in release_chain()
555 chain->refs.release (); in release_chain()
556 chain->vars.release (); in release_chain()
557 chain->inits.release (); in release_chain()
558 if (chain->init_seq) in release_chain()
559 gimple_seq_discard (chain->init_seq); in release_chain()
561 chain->finis.release (); in release_chain()
562 if (chain->fini_seq) in release_chain()
563 gimple_seq_discard (chain->fini_seq); in release_chain()
565 free (chain); in release_chain()
574 chain_p chain; in release_chains() local
576 FOR_EACH_VEC_ELT (chains, i, chain) in release_chains()
577 release_chain (chain); in release_chains()
1063 get_chain_root (chain_p chain) in get_chain_root() argument
1065 return chain->refs[0]; in get_chain_root()
1072 get_chain_last_write_at (chain_p chain, unsigned distance) in get_chain_last_write_at() argument
1074 for (unsigned i = chain->refs.length (); i > 0; i--) in get_chain_last_write_at()
1075 if (DR_IS_WRITE (chain->refs[i - 1]->ref) in get_chain_last_write_at()
1076 && distance == chain->refs[i - 1]->distance) in get_chain_last_write_at()
1077 return chain->refs[i - 1]; in get_chain_last_write_at()
1086 get_chain_last_write_before_load (chain_p chain, unsigned load_idx) in get_chain_last_write_before_load() argument
1088 gcc_assert (load_idx < chain->refs.length ()); in get_chain_last_write_before_load()
1090 unsigned distance = chain->refs[load_idx]->distance; in get_chain_last_write_before_load()
1093 if (DR_IS_WRITE (chain->refs[i - 1]->ref) in get_chain_last_write_before_load()
1094 && distance == chain->refs[i - 1]->distance) in get_chain_last_write_before_load()
1095 return chain->refs[i - 1]; in get_chain_last_write_before_load()
1103 add_ref_to_chain (chain_p chain, dref ref) in add_ref_to_chain() argument
1105 dref root = get_chain_root (chain); in add_ref_to_chain()
1111 chain->refs.safe_push (ref); in add_ref_to_chain()
1115 if (ref->distance >= chain->length) in add_ref_to_chain()
1117 chain->length = ref->distance; in add_ref_to_chain()
1118 chain->has_max_use_after = false; in add_ref_to_chain()
1123 chain->type = CT_STORE_STORE; in add_ref_to_chain()
1126 if (chain->type != CT_STORE_STORE in add_ref_to_chain()
1127 && ref->distance == chain->length in add_ref_to_chain()
1129 chain->has_max_use_after = true; in add_ref_to_chain()
1131 chain->all_always_accessed &= ref->always_accessed; in add_ref_to_chain()
1139 chain_p chain = XCNEW (struct chain); in make_invariant_chain() local
1143 chain->type = CT_INVARIANT; in make_invariant_chain()
1145 chain->all_always_accessed = true; in make_invariant_chain()
1149 chain->refs.safe_push (ref); in make_invariant_chain()
1150 chain->all_always_accessed &= ref->always_accessed; in make_invariant_chain()
1153 chain->inits = vNULL; in make_invariant_chain()
1154 chain->finis = vNULL; in make_invariant_chain()
1156 return chain; in make_invariant_chain()
1164 chain_p chain = XCNEW (struct chain); in make_rooted_chain() local
1166 chain->type = type; in make_rooted_chain()
1167 chain->refs.safe_push (ref); in make_rooted_chain()
1168 chain->all_always_accessed = ref->always_accessed; in make_rooted_chain()
1171 chain->inits = vNULL; in make_rooted_chain()
1172 chain->finis = vNULL; in make_rooted_chain()
1174 return chain; in make_rooted_chain()
1180 nontrivial_chain_p (chain_p chain) in nontrivial_chain_p() argument
1182 return chain != NULL && chain->refs.length () > 1; in nontrivial_chain_p()
1344 insert_looparound_copy (chain_p chain, dref ref, gphi *phi) in insert_looparound_copy() argument
1353 FOR_EACH_VEC_ELT (chain->refs, i, aref) in insert_looparound_copy()
1356 chain->refs.safe_insert (i, nw); in insert_looparound_copy()
1358 if (nw->distance > chain->length) in insert_looparound_copy()
1360 chain->length = nw->distance; in insert_looparound_copy()
1361 chain->has_max_use_after = false; in insert_looparound_copy()
1371 add_looparound_copies (class loop *loop, chain_p chain) in add_looparound_copies() argument
1374 dref ref, root = get_chain_root (chain); in add_looparound_copies()
1377 if (chain->type == CT_STORE_STORE) in add_looparound_copies()
1380 FOR_EACH_VEC_ELT (chain->refs, i, ref) in add_looparound_copies()
1387 insert_looparound_copy (chain, ref, phi); in add_looparound_copies()
1402 chain_p chain = NULL; in determine_roots_comp() local
1409 chain = make_invariant_chain (comp); in determine_roots_comp()
1410 chains->safe_push (chain); in determine_roots_comp()
1447 if (!chain in determine_roots_comp()
1448 || (chain->type == CT_LOAD && DR_IS_WRITE (a->ref)) in determine_roots_comp()
1452 if (nontrivial_chain_p (chain)) in determine_roots_comp()
1454 add_looparound_copies (loop, chain); in determine_roots_comp()
1455 chains->safe_push (chain); in determine_roots_comp()
1458 release_chain (chain); in determine_roots_comp()
1465 chain = make_rooted_chain (a, type); in determine_roots_comp()
1470 add_ref_to_chain (chain, a); in determine_roots_comp()
1473 if (nontrivial_chain_p (chain)) in determine_roots_comp()
1475 add_looparound_copies (loop, chain); in determine_roots_comp()
1476 chains->safe_push (chain); in determine_roots_comp()
1479 release_chain (chain); in determine_roots_comp()
1671 get_init_expr (chain_p chain, unsigned index) in get_init_expr() argument
1673 if (chain->type == CT_COMBINATION) in get_init_expr()
1675 tree e1 = get_init_expr (chain->ch1, index); in get_init_expr()
1676 tree e2 = get_init_expr (chain->ch2, index); in get_init_expr()
1678 return fold_build2 (chain->op, chain->rslt_type, e1, e2); in get_init_expr()
1681 return chain->inits[index]; in get_init_expr()
1703 initialize_root_vars (class loop *loop, chain_p chain, bitmap tmp_vars) in initialize_root_vars() argument
1706 unsigned n = chain->length; in initialize_root_vars()
1707 dref root = get_chain_root (chain); in initialize_root_vars()
1708 bool reuse_first = !chain->has_max_use_after; in initialize_root_vars()
1718 chain->vars.create (n + 1); in initialize_root_vars()
1720 if (chain->type == CT_COMBINATION) in initialize_root_vars()
1728 chain->vars.quick_push (var); in initialize_root_vars()
1731 chain->vars.quick_push (chain->vars[0]); in initialize_root_vars()
1733 FOR_EACH_VEC_ELT (chain->vars, i, var) in initialize_root_vars()
1734 chain->vars[i] = make_ssa_name (var); in initialize_root_vars()
1738 var = chain->vars[i]; in initialize_root_vars()
1739 next = chain->vars[i + 1]; in initialize_root_vars()
1740 init = get_init_expr (chain, i); in initialize_root_vars()
1757 is_inv_store_elimination_chain (class loop *loop, chain_p chain) in is_inv_store_elimination_chain() argument
1759 if (chain->length == 0 || chain->type != CT_STORE_STORE) in is_inv_store_elimination_chain()
1762 gcc_assert (!chain->has_max_use_after); in is_inv_store_elimination_chain()
1768 || wi::leu_p (wi::to_wide (niters), chain->length)) in is_inv_store_elimination_chain()
1773 for (unsigned i = 0; i < chain->length; i++) in is_inv_store_elimination_chain()
1775 dref a = get_chain_last_write_at (chain, i); in is_inv_store_elimination_chain()
1808 initialize_root_vars_store_elim_1 (chain_p chain) in initialize_root_vars_store_elim_1() argument
1811 unsigned i, n = chain->length; in initialize_root_vars_store_elim_1()
1813 chain->vars.create (n); in initialize_root_vars_store_elim_1()
1814 chain->vars.safe_grow_cleared (n); in initialize_root_vars_store_elim_1()
1819 dref a = get_chain_last_write_at (chain, i); in initialize_root_vars_store_elim_1()
1824 chain->vars[a->distance] = var; in initialize_root_vars_store_elim_1()
1829 var = chain->vars[0]; in initialize_root_vars_store_elim_1()
1832 if (chain->vars[i] != NULL_TREE) in initialize_root_vars_store_elim_1()
1834 var = chain->vars[i]; in initialize_root_vars_store_elim_1()
1837 chain->vars[i] = var; in initialize_root_vars_store_elim_1()
1842 std::swap (chain->vars[i], chain->vars[n - i - 1]); in initialize_root_vars_store_elim_1()
1852 chain_p chain, bitmap tmp_vars) in initialize_root_vars_store_elim_2() argument
1854 unsigned i, n = chain->length; in initialize_root_vars_store_elim_2()
1859 chain->vars.create (n); in initialize_root_vars_store_elim_2()
1861 ref = DR_REF (get_chain_root (chain)->ref); in initialize_root_vars_store_elim_2()
1865 chain->vars.quick_push (var); in initialize_root_vars_store_elim_2()
1868 FOR_EACH_VEC_ELT (chain->vars, i, var) in initialize_root_vars_store_elim_2()
1869 chain->vars[i] = make_ssa_name (var); in initialize_root_vars_store_elim_2()
1877 init = get_init_expr (chain, i); in initialize_root_vars_store_elim_2()
1882 dref a = get_chain_last_write_at (chain, i); in initialize_root_vars_store_elim_2()
1903 next = chain->vars[n - i]; in initialize_root_vars_store_elim_2()
1913 dref last = get_chain_root (chain); in initialize_root_vars_store_elim_2()
1914 for (i = 0; i < chain->refs.length (); i++) in initialize_root_vars_store_elim_2()
1916 if (chain->refs[i]->pos > last->pos) in initialize_root_vars_store_elim_2()
1917 last = chain->refs[i]; in initialize_root_vars_store_elim_2()
1925 var = chain->vars[i]; in initialize_root_vars_store_elim_2()
1936 finalize_eliminated_stores (class loop *loop, chain_p chain) in finalize_eliminated_stores() argument
1938 unsigned i, n = chain->length; in finalize_eliminated_stores()
1942 tree var = chain->vars[i]; in finalize_eliminated_stores()
1943 tree fini = chain->finis[n - i - 1]; in finalize_eliminated_stores()
1946 gimple_seq_add_stmt_without_update (&chain->fini_seq, stmt); in finalize_eliminated_stores()
1949 if (chain->fini_seq) in finalize_eliminated_stores()
1951 gsi_insert_seq_on_edge_immediate (single_exit (loop), chain->fini_seq); in finalize_eliminated_stores()
1952 chain->fini_seq = NULL; in finalize_eliminated_stores()
2012 execute_load_motion (class loop *loop, chain_p chain, bitmap tmp_vars) in execute_load_motion() argument
2019 gcc_assert (chain->type == CT_INVARIANT); in execute_load_motion()
2020 gcc_assert (!chain->combined); in execute_load_motion()
2021 FOR_EACH_VEC_ELT (chain->refs, i, a) in execute_load_motion()
2026 if (n_writes == chain->refs.length ()) in execute_load_motion()
2029 initialize_root_vars_lm (loop, get_chain_root (chain), n_writes > 0, in execute_load_motion()
2030 &vars, chain->inits, tmp_vars); in execute_load_motion()
2033 FOR_EACH_VEC_ELT (chain->refs, i, a) in execute_load_motion()
2153 execute_pred_commoning_chain (class loop *loop, chain_p chain, in execute_pred_commoning_chain() argument
2161 if (chain->combined) in execute_pred_commoning_chain()
2167 else if (chain->type == CT_STORE_STORE) in execute_pred_commoning_chain()
2169 if (chain->length > 0) in execute_pred_commoning_chain()
2171 if (chain->inv_store_elimination) in execute_pred_commoning_chain()
2176 initialize_root_vars_store_elim_1 (chain); in execute_pred_commoning_chain()
2183 initialize_root_vars_store_elim_2 (loop, chain, tmp_vars); in execute_pred_commoning_chain()
2190 finalize_eliminated_stores (loop, chain); in execute_pred_commoning_chain()
2194 for (i = chain->refs.length (); i > 0; i--) in execute_pred_commoning_chain()
2196 a = chain->refs[i - 1]; in execute_pred_commoning_chain()
2211 dref b = get_chain_last_write_before_load (chain, i - 1); in execute_pred_commoning_chain()
2220 initialize_root_vars (loop, chain, tmp_vars); in execute_pred_commoning_chain()
2221 a = get_chain_root (chain); in execute_pred_commoning_chain()
2222 in_lhs = (chain->type == CT_STORE_LOAD in execute_pred_commoning_chain()
2223 || chain->type == CT_COMBINATION); in execute_pred_commoning_chain()
2224 replace_ref_with (a->stmt, chain->vars[chain->length], true, in_lhs); in execute_pred_commoning_chain()
2227 for (i = 1; chain->refs.iterate (i, &a); i++) in execute_pred_commoning_chain()
2229 var = chain->vars[chain->length - a->distance]; in execute_pred_commoning_chain()
2242 chain_p chain; in determine_unroll_factor() local
2246 FOR_EACH_VEC_ELT (chains, i, chain) in determine_unroll_factor()
2248 if (chain->type == CT_INVARIANT) in determine_unroll_factor()
2251 else if (chain->type == CT_STORE_STORE) in determine_unroll_factor()
2254 if (chain->combined) in determine_unroll_factor()
2260 for (j = 1; chain->refs.iterate (j, &a); j++) in determine_unroll_factor()
2268 af = chain->length; in determine_unroll_factor()
2269 if (chain->has_max_use_after) in determine_unroll_factor()
2287 chain_p chain; in execute_pred_commoning() local
2290 FOR_EACH_VEC_ELT (chains, i, chain) in execute_pred_commoning()
2292 if (chain->type == CT_INVARIANT) in execute_pred_commoning()
2293 execute_load_motion (loop, chain, tmp_vars); in execute_pred_commoning()
2295 execute_pred_commoning_chain (loop, chain, tmp_vars); in execute_pred_commoning()
2298 FOR_EACH_VEC_ELT (chains, i, chain) in execute_pred_commoning()
2300 if (chain->type == CT_INVARIANT) in execute_pred_commoning()
2302 else if (chain->combined) in execute_pred_commoning()
2308 for (j = 1; chain->refs.iterate (j, &a); j++) in execute_pred_commoning()
2322 chain_p chain; in replace_phis_by_defined_names() local
2326 FOR_EACH_VEC_ELT (chains, i, chain) in replace_phis_by_defined_names()
2327 FOR_EACH_VEC_ELT (chain->refs, j, a) in replace_phis_by_defined_names()
2343 chain_p chain; in replace_names_by_phis() local
2347 FOR_EACH_VEC_ELT (chains, i, chain) in replace_names_by_phis()
2348 FOR_EACH_VEC_ELT (chain->refs, j, a) in replace_names_by_phis()
2457 chain_can_be_combined_p (chain_p chain) in chain_can_be_combined_p() argument
2459 return (!chain->combined in chain_can_be_combined_p()
2460 && (chain->type == CT_LOAD || chain->type == CT_COMBINATION)); in chain_can_be_combined_p()
2790 new_chain = XCNEW (struct chain); in combine_chains()
2961 prepare_initializers_chain_store_elim (class loop *loop, chain_p chain) in prepare_initializers_chain_store_elim() argument
2963 unsigned i, n = chain->length; in prepare_initializers_chain_store_elim()
2967 if (!chain->all_always_accessed) in prepare_initializers_chain_store_elim()
2971 if (n == 0 && chain->type == CT_STORE_STORE) in prepare_initializers_chain_store_elim()
2976 if (chain->type == CT_STORE_STORE in prepare_initializers_chain_store_elim()
2977 && is_inv_store_elimination_chain (loop, chain)) in prepare_initializers_chain_store_elim()
2979 chain->inv_store_elimination = true; in prepare_initializers_chain_store_elim()
2983 chain->inits.create (n); in prepare_initializers_chain_store_elim()
2984 chain->inits.safe_grow_cleared (n); in prepare_initializers_chain_store_elim()
3003 for (i = 0; i < chain->refs.length (); i++) in prepare_initializers_chain_store_elim()
3004 bubbles[chain->refs[i]->distance] = true; in prepare_initializers_chain_store_elim()
3006 struct data_reference *dr = get_chain_root (chain)->ref; in prepare_initializers_chain_store_elim()
3016 gimple_seq_add_seq_without_update (&chain->init_seq, stmts); in prepare_initializers_chain_store_elim()
3018 chain->inits[i] = init; in prepare_initializers_chain_store_elim()
3028 prepare_initializers_chain (class loop *loop, chain_p chain) in prepare_initializers_chain() argument
3030 unsigned i, n = (chain->type == CT_INVARIANT) ? 1 : chain->length; in prepare_initializers_chain()
3031 struct data_reference *dr = get_chain_root (chain)->ref; in prepare_initializers_chain()
3036 if (chain->type == CT_STORE_STORE) in prepare_initializers_chain()
3037 return prepare_initializers_chain_store_elim (loop, chain); in prepare_initializers_chain()
3041 chain->inits.create (n); in prepare_initializers_chain()
3043 chain->inits.quick_push (NULL_TREE); in prepare_initializers_chain()
3047 FOR_EACH_VEC_ELT (chain->refs, i, laref) in prepare_initializers_chain()
3053 chain->inits[n - laref->distance] in prepare_initializers_chain()
3061 if (chain->inits[i] != NULL_TREE) in prepare_initializers_chain()
3065 if (!chain->all_always_accessed && tree_could_trap_p (init)) in prepare_initializers_chain()
3072 gimple_seq_add_seq_without_update (&chain->init_seq, stmts); in prepare_initializers_chain()
3074 chain->inits[i] = init; in prepare_initializers_chain()
3086 chain_p chain; in prepare_initializers() local
3091 chain = chains[i]; in prepare_initializers()
3092 if (prepare_initializers_chain (loop, chain)) in prepare_initializers()
3096 release_chain (chain); in prepare_initializers()
3106 prepare_finalizers_chain (class loop *loop, chain_p chain) in prepare_finalizers_chain() argument
3108 unsigned i, n = chain->length; in prepare_finalizers_chain()
3109 struct data_reference *dr = get_chain_root (chain)->ref; in prepare_finalizers_chain()
3114 if (!chain->all_always_accessed) in prepare_finalizers_chain()
3117 chain->finis.create (n); in prepare_finalizers_chain()
3119 chain->finis.quick_push (NULL_TREE); in prepare_finalizers_chain()
3128 gcc_assert (chain->finis[i] == NULL_TREE); in prepare_finalizers_chain()
3136 gimple_seq_add_seq_without_update (&chain->fini_seq, stmts); in prepare_finalizers_chain()
3142 gimple_seq_add_seq_without_update (&chain->fini_seq, stmts); in prepare_finalizers_chain()
3144 chain->finis[i] = fini; in prepare_finalizers_chain()
3156 chain_p chain; in prepare_finalizers() local
3162 chain = chains[i]; in prepare_finalizers()
3166 if (chain->length == 0 || chain->type != CT_STORE_STORE) in prepare_finalizers()
3172 if (prepare_finalizers_chain (loop, chain)) in prepare_finalizers()
3183 release_chain (chain); in prepare_finalizers()