sched-int.h (struct _dep): Rename field 'kind' to 'type'.
* sched-int.h (struct _dep): Rename field 'kind' to 'type'. (DEP_KIND): Rename to DEP_TYPE. Update all uses. (dep_def): New typedef. (init_dep_1, sd_debug_dep): Declare functions. (DEP_LINK_KIND): Rename to DEP_LINK_TYPE. (debug_dep_links): Remove. (struct _deps_list): New field 'n_links'. (DEPS_LIST_N_LINKS): New macro. (FOR_EACH_DEP_LINK): Remove. (create_deps_list, free_deps_list, delete_deps_list): Remove declaration. (deps_list_empty_p, debug_deps_list, add_back_dep_to_deps_list): Ditto. (find_link_by_pro_in_deps_list, find_link_by_con_in_deps_list): Ditto. (copy_deps_list_change_con, move_dep_link): Ditto. (struct haifa_insn_data): Split field 'back_deps' into 'hard_back_deps' and 'spec_back_deps'. New field 'resolved_forw_deps'. Remove field 'dep_count'. (INSN_BACK_DEPS): Remove. (INSN_HARD_BACK_DEPS, INSN_SPEC_BACK_DEPS, INSN_RESOLVED_FORW_DEPS): New macros. (INSN_DEP_COUNT): Remove. (enum DEPS_ADJUST_RESULT): Add new constant DEP_NODEP. Fix comments. (spec_info, haifa_recovery_block_was_added_during_scheduling_p): Declare global variables. (deps_pools_are_empty_p, sched_free_deps): Declare functions. (add_forw_dep, compute_forward_dependences): Remove declarations. (add_or_update_back_dep, add_or_update_back_forw_dep): Ditto. (add_back_forw_dep, delete_back_forw_dep): Ditto. (debug_ds, sched_insn_is_legitimate_for_speculation_p): Declare functions. (SD_LIST_NONE, SD_LIST_HARD_BACK, SD_LIST_SPEC_BACK, SD_LIST_FORW): New constants. (SD_LIST_RES_BACK, SD_LIST_RES_FORW, SD_LIST_BACK): Ditto. (sd_list_types_def): New typedef. (sd_next_list): Declare function. (struct _sd_iterator): New type. (sd_iterator_def): New typedef. (sd_iterator_start, sd_iterator_cond, sd_iterator_next): New inline functions. (FOR_EACH_DEP): New cycle wrapper. (sd_lists_size, sd_lists_empty_p, sd_init_insn, sd_finish_insn): Declare functions. (sd_find_dep_between, sd_add_dep, sd_add_or_update_dep): Ditto. (sd_resolve_dep, sd_copy_back_deps, sd_delete_dep, sd_debug_lists): Ditto. * sched-deps.c (init_dep_1): Make global. (DUMP_DEP_PRO, DUMP_DEP_CON, DUMP_DEP_STATUS, DUMP_DEP_ALL): New constants. (dump_dep): New static function. (dump_dep_flags): New static variable. (sd_debug_dep): New function. (add_to_deps_list, remove_from_deps_list): Update 'n_links' field of the list. (move_dep_link): Use remove_from_deps_list (), instead of detach_dep_link (). (dep_links_consistent_p, dump_dep_links, debug_dep_links): Remove. (dep_link_is_detached_p): New static function. (deps_obstack, dl_obstack, dn_obstack): Remove. Use dn_pool, dl_pool instead. (dn_pool, dl_pool): New alloc_pools. (dn_pool_diff, dl_pool_diff): New static variables. (create_dep_node, delete_dep_node): New static function. (create_deps_list): Make it static. Use alloc_pool 'dl_pool'. (deps_list_empty_p): Make it static. Use 'n_links' field. (deps_pools_are_empty_p): New static function. (alloc_deps_list, delete_deps_list): Remove. (dump_deps_list, debug_deps_list, add_back_dep_to_deps_list): Remove. (find_link_by_pro_in_deps_list, find_link_by_con_in_deps_list): Ditto. (copy_deps_list_change_con): Remove. Use sd_copy_back_deps () instead. (forward_dependency_cache): Remove. (maybe_add_or_update_back_dep_1, add_or_update_back_dep_1): Remove 'back' from the names. Change signature to use dep_t instead of equivalent quad. (add_back_dep): Ditto. Make global. (check_dep_status): Rename to check_dep (). (sd_next_list, sd_lists_size, sd_lists_empty_p, sd_init_insn): New functions. (sd_finish_insn): Ditto. (sd_find_dep_between_no_cache): New static function. (sd_find_dep_between): New function. (ask_dependency_caches, set_dependency_caches): New static functions. (update_dependency_caches, change_spec_dep_to_hard, update_dep): Ditto. (add_or_update_dep_1): Separate pieces of functionality into ask_dependency_caches (), update_dependency_caches (), change_spec_dep_to_hard (), update_dep (). (get_back_and_forw_lists): New static function. (sd_add_dep): Separate setting of dependency caches into set_dependency_caches (). (sd_add_or_update_dep, sd_resolve_dep, sd_copy_back_deps): New functions. (sd_delete_dep): Ditto. (DUMP_LISTS_SIZE, DUMP_LISTS_DEPS, DUMP_LISTS_ALL): New constants. (dump_lists): New static function. (sd_debug_lists): New debug function. (delete_all_dependences, fixup_sched_groups): Update to use sd_* infrastructure. (sched_analyze_2): Create data-speculative dependency only if data-speculation is enabled. (sched_analyze_insn): If insn cannot be speculative, make all its dependencies non-speculative. (sched_analyze): Use sd_init_insn (). (add_forw_dep, compute_forward_dependencies): Remove. (delete_dep_nodes_in_back_deps): New static function. (sched_free_deps): New function. (init_dependency_caches): Init alloc_pools. (extend_depedency_caches): Update after removing of forward_dependency_cache. (free_dependency_caches): Ditto. Free alloc_pools. (adjust_add_sorted_back_dep, adjust_back_add_forw_dep): Remove. (delete_forw_dep, add_or_update_back_dep, add_or_update_back_forw_dep): Ditto. (add_back_forw_dep, delete_back_forw_dep): Ditto. (add_dependence): Use init_dep (). (get_dep_weak_1): New static function. (get_dep_weak): Move logic to get_dep_weak_1 (). (dump_ds): New static function moved from haifa-sched.c: debug_spec_status (). (debug_ds): New debug function. (check_dep_status): Rename to check_dep (). Update to check whole dependencies. * haifa-sched.c (spec_info): Make global. (added_recovery_block_p): Rename to 'haifa_recovery_block_was_added_during_current_schedule_block_p'. (haifa_recovery_block_was_added_during_scheduling_p): New variable. (dep_cost, priority, rank_for_schedule, schedule_insn): Update to use new interfaces. (ok_for_early_queue_removal): Ditto. (schedule_block): Initialize logical uids of insns emitted by the target. (sched_init): Initialize new variable. (fix_inter_tick, try_ready, fix_tick_ready): Update to use new interfaces. (extend_global): Initialize insn data. (init_h_i_d): Remove code that is now handled in sd_init_insn (). (process_insn_forw_deps_be_in_spec): Change signature. Update to use new interfaces. (add_to_speculative_block): Update to use new interfaces. (create_recovery_block): Set new variables. (create_check_block_twin, fix_recovery_deps): Update to use new interfaces. (sched_insn_is_legitimate_for_speculation_p): New function. (speculate_insn): Move checking logic to sched_insn_is_legitimate_for_speculation_p (). (sched_remove_insn): Finalize sched-deps information of instruction. (clear_priorities, add_jump_dependencies): Update to use new interfaces. (debug_spec_status): Rename to dump_ds () and move to sched-deps.c. * sched-rgn.c (set_spec_fed, find_conditional_protection): Update to use new interfaces. (is_conditionally_protected, is_pfree, is_prisky) Ditto. (new_ready): Try to use control speculation only if it is available. (add_branch_dependences): Update to use new interfaces. (compute_block_backward_dependences): Rename to compute_block_dependences (). Call targetm.sched.dependencies_evaluation_hook (). (free_block_dependencies): New static function. (debug_dependencies): Update to use new interfaces. (schedule_region): Remove separate computation of forward dependencies. Move call of targetm.sched.dependencies_evaluation_hook () to compute_block_dependences (). Free dependencies at the end of scheduling the region. * sched-ebb.c (earliest_block_with_similiar_load): Update to use new interfaces. (add_deps_for_risky_insns): Ditto. (schedule_ebb): Remove separate computation of forward dependencies. Free dependencies at the end of scheduling the ebb. * ddg.c (create_ddg_dependence): Update to use new interfaces. (build_intra_loop_deps): Ditto. Remove separate computation of forward dependencies. Free sched-deps dependencies. * config/ia64/ia64.c (ia64_dependencies_evaluation_hook): Update to use new interfaces. (ia64_dfa_new_cycle, ia64_gen_check): Ditto. * config/rs6000/rs6000.c (rs6000_is_costly_dependence): Update to use new interfaces. (is_costly_group): Ditto. From-SVN: r127405
This commit is contained in:
parent
ed7a4b4b30
commit
e2f6ff946a
9 changed files with 1872 additions and 1209 deletions
185
gcc/ChangeLog
185
gcc/ChangeLog
|
@ -1,3 +1,188 @@
|
|||
2007-08-14 Maxim Kuvyrkov <maxim@codesourcery.com>
|
||||
|
||||
* sched-int.h (struct _dep): Rename field 'kind' to 'type'.
|
||||
(DEP_KIND): Rename to DEP_TYPE. Update all uses.
|
||||
(dep_def): New typedef.
|
||||
(init_dep_1, sd_debug_dep): Declare functions.
|
||||
(DEP_LINK_KIND): Rename to DEP_LINK_TYPE.
|
||||
(debug_dep_links): Remove.
|
||||
(struct _deps_list): New field 'n_links'.
|
||||
(DEPS_LIST_N_LINKS): New macro.
|
||||
(FOR_EACH_DEP_LINK): Remove.
|
||||
(create_deps_list, free_deps_list, delete_deps_list): Remove
|
||||
declaration.
|
||||
(deps_list_empty_p, debug_deps_list, add_back_dep_to_deps_list): Ditto.
|
||||
(find_link_by_pro_in_deps_list, find_link_by_con_in_deps_list): Ditto.
|
||||
(copy_deps_list_change_con, move_dep_link): Ditto.
|
||||
(struct haifa_insn_data): Split field 'back_deps' into 'hard_back_deps'
|
||||
and 'spec_back_deps'. New field 'resolved_forw_deps'. Remove field
|
||||
'dep_count'.
|
||||
(INSN_BACK_DEPS): Remove.
|
||||
(INSN_HARD_BACK_DEPS, INSN_SPEC_BACK_DEPS, INSN_RESOLVED_FORW_DEPS):
|
||||
New macros.
|
||||
(INSN_DEP_COUNT): Remove.
|
||||
(enum DEPS_ADJUST_RESULT): Add new constant DEP_NODEP. Fix comments.
|
||||
(spec_info, haifa_recovery_block_was_added_during_scheduling_p):
|
||||
Declare global variables.
|
||||
(deps_pools_are_empty_p, sched_free_deps): Declare functions.
|
||||
(add_forw_dep, compute_forward_dependences): Remove declarations.
|
||||
(add_or_update_back_dep, add_or_update_back_forw_dep): Ditto.
|
||||
(add_back_forw_dep, delete_back_forw_dep): Ditto.
|
||||
(debug_ds, sched_insn_is_legitimate_for_speculation_p): Declare
|
||||
functions.
|
||||
(SD_LIST_NONE, SD_LIST_HARD_BACK, SD_LIST_SPEC_BACK, SD_LIST_FORW): New
|
||||
constants.
|
||||
(SD_LIST_RES_BACK, SD_LIST_RES_FORW, SD_LIST_BACK): Ditto.
|
||||
(sd_list_types_def): New typedef.
|
||||
(sd_next_list): Declare function.
|
||||
(struct _sd_iterator): New type.
|
||||
(sd_iterator_def): New typedef.
|
||||
(sd_iterator_start, sd_iterator_cond, sd_iterator_next): New inline
|
||||
functions.
|
||||
(FOR_EACH_DEP): New cycle wrapper.
|
||||
(sd_lists_size, sd_lists_empty_p, sd_init_insn, sd_finish_insn):
|
||||
Declare functions.
|
||||
(sd_find_dep_between, sd_add_dep, sd_add_or_update_dep): Ditto.
|
||||
(sd_resolve_dep, sd_copy_back_deps, sd_delete_dep, sd_debug_lists):
|
||||
Ditto.
|
||||
|
||||
* sched-deps.c (init_dep_1): Make global.
|
||||
(DUMP_DEP_PRO, DUMP_DEP_CON, DUMP_DEP_STATUS, DUMP_DEP_ALL): New
|
||||
constants.
|
||||
(dump_dep): New static function.
|
||||
(dump_dep_flags): New static variable.
|
||||
(sd_debug_dep): New function.
|
||||
(add_to_deps_list, remove_from_deps_list): Update 'n_links' field of
|
||||
the list.
|
||||
(move_dep_link): Use remove_from_deps_list (), instead of
|
||||
detach_dep_link ().
|
||||
(dep_links_consistent_p, dump_dep_links, debug_dep_links): Remove.
|
||||
(dep_link_is_detached_p): New static function.
|
||||
(deps_obstack, dl_obstack, dn_obstack): Remove. Use dn_pool, dl_pool
|
||||
instead.
|
||||
(dn_pool, dl_pool): New alloc_pools.
|
||||
(dn_pool_diff, dl_pool_diff): New static variables.
|
||||
(create_dep_node, delete_dep_node): New static function.
|
||||
(create_deps_list): Make it static. Use alloc_pool 'dl_pool'.
|
||||
(deps_list_empty_p): Make it static. Use 'n_links' field.
|
||||
(deps_pools_are_empty_p): New static function.
|
||||
(alloc_deps_list, delete_deps_list): Remove.
|
||||
(dump_deps_list, debug_deps_list, add_back_dep_to_deps_list): Remove.
|
||||
(find_link_by_pro_in_deps_list, find_link_by_con_in_deps_list): Ditto.
|
||||
(copy_deps_list_change_con): Remove. Use sd_copy_back_deps () instead.
|
||||
(forward_dependency_cache): Remove.
|
||||
(maybe_add_or_update_back_dep_1, add_or_update_back_dep_1): Remove
|
||||
'back' from the names. Change signature to use dep_t instead of
|
||||
equivalent quad.
|
||||
(add_back_dep): Ditto. Make global.
|
||||
(check_dep_status): Rename to check_dep ().
|
||||
(sd_next_list, sd_lists_size, sd_lists_empty_p, sd_init_insn):
|
||||
New functions.
|
||||
(sd_finish_insn): Ditto.
|
||||
(sd_find_dep_between_no_cache): New static function.
|
||||
(sd_find_dep_between): New function.
|
||||
(ask_dependency_caches, set_dependency_caches): New static functions.
|
||||
(update_dependency_caches, change_spec_dep_to_hard, update_dep): Ditto.
|
||||
(add_or_update_dep_1): Separate pieces of functionality into
|
||||
ask_dependency_caches (), update_dependency_caches (),
|
||||
change_spec_dep_to_hard (), update_dep ().
|
||||
(get_back_and_forw_lists): New static function.
|
||||
(sd_add_dep): Separate setting of dependency caches into
|
||||
set_dependency_caches ().
|
||||
(sd_add_or_update_dep, sd_resolve_dep, sd_copy_back_deps):
|
||||
New functions.
|
||||
(sd_delete_dep): Ditto.
|
||||
(DUMP_LISTS_SIZE, DUMP_LISTS_DEPS, DUMP_LISTS_ALL): New constants.
|
||||
(dump_lists): New static function.
|
||||
(sd_debug_lists): New debug function.
|
||||
(delete_all_dependences, fixup_sched_groups): Update to use
|
||||
sd_* infrastructure.
|
||||
(sched_analyze_2): Create data-speculative dependency only if
|
||||
data-speculation is enabled.
|
||||
(sched_analyze_insn): If insn cannot be speculative, make all its
|
||||
dependencies non-speculative.
|
||||
(sched_analyze): Use sd_init_insn ().
|
||||
(add_forw_dep, compute_forward_dependencies): Remove.
|
||||
(delete_dep_nodes_in_back_deps): New static function.
|
||||
(sched_free_deps): New function.
|
||||
(init_dependency_caches): Init alloc_pools.
|
||||
(extend_depedency_caches): Update after removing of
|
||||
forward_dependency_cache.
|
||||
(free_dependency_caches): Ditto. Free alloc_pools.
|
||||
(adjust_add_sorted_back_dep, adjust_back_add_forw_dep): Remove.
|
||||
(delete_forw_dep, add_or_update_back_dep, add_or_update_back_forw_dep):
|
||||
Ditto.
|
||||
(add_back_forw_dep, delete_back_forw_dep): Ditto.
|
||||
(add_dependence): Use init_dep ().
|
||||
(get_dep_weak_1): New static function.
|
||||
(get_dep_weak): Move logic to get_dep_weak_1 ().
|
||||
(dump_ds): New static function moved from haifa-sched.c:
|
||||
debug_spec_status ().
|
||||
(debug_ds): New debug function.
|
||||
(check_dep_status): Rename to check_dep (). Update to check whole
|
||||
dependencies.
|
||||
|
||||
* haifa-sched.c (spec_info): Make global.
|
||||
(added_recovery_block_p): Rename to
|
||||
'haifa_recovery_block_was_added_during_current_schedule_block_p'.
|
||||
(haifa_recovery_block_was_added_during_scheduling_p): New variable.
|
||||
(dep_cost, priority, rank_for_schedule, schedule_insn): Update
|
||||
to use new interfaces.
|
||||
(ok_for_early_queue_removal): Ditto.
|
||||
(schedule_block): Initialize logical uids of insns emitted by the
|
||||
target.
|
||||
(sched_init): Initialize new variable.
|
||||
(fix_inter_tick, try_ready, fix_tick_ready): Update to use new
|
||||
interfaces.
|
||||
(extend_global): Initialize insn data.
|
||||
(init_h_i_d): Remove code that is now handled in sd_init_insn ().
|
||||
(process_insn_forw_deps_be_in_spec): Change signature. Update to use
|
||||
new interfaces.
|
||||
(add_to_speculative_block): Update to use new interfaces.
|
||||
(create_recovery_block): Set new variables.
|
||||
(create_check_block_twin, fix_recovery_deps): Update to use new
|
||||
interfaces.
|
||||
(sched_insn_is_legitimate_for_speculation_p): New function.
|
||||
(speculate_insn): Move checking logic to
|
||||
sched_insn_is_legitimate_for_speculation_p ().
|
||||
(sched_remove_insn): Finalize sched-deps information of instruction.
|
||||
(clear_priorities, add_jump_dependencies): Update to use new
|
||||
interfaces.
|
||||
(debug_spec_status): Rename to dump_ds () and move to sched-deps.c.
|
||||
|
||||
* sched-rgn.c (set_spec_fed, find_conditional_protection): Update
|
||||
to use new interfaces.
|
||||
(is_conditionally_protected, is_pfree, is_prisky) Ditto.
|
||||
(new_ready): Try to use control speculation only if it is available.
|
||||
(add_branch_dependences): Update to use new interfaces.
|
||||
(compute_block_backward_dependences): Rename to
|
||||
compute_block_dependences (). Call
|
||||
targetm.sched.dependencies_evaluation_hook ().
|
||||
(free_block_dependencies): New static function.
|
||||
(debug_dependencies): Update to use new interfaces.
|
||||
(schedule_region): Remove separate computation of forward dependencies.
|
||||
Move call of targetm.sched.dependencies_evaluation_hook () to
|
||||
compute_block_dependences (). Free dependencies at the end of
|
||||
scheduling the region.
|
||||
|
||||
* sched-ebb.c (earliest_block_with_similiar_load): Update to use
|
||||
new interfaces.
|
||||
(add_deps_for_risky_insns): Ditto.
|
||||
(schedule_ebb): Remove separate computation of forward dependencies.
|
||||
Free dependencies at the end of scheduling the ebb.
|
||||
|
||||
* ddg.c (create_ddg_dependence): Update to use new interfaces.
|
||||
(build_intra_loop_deps): Ditto. Remove separate computation of forward
|
||||
dependencies. Free sched-deps dependencies.
|
||||
|
||||
* config/ia64/ia64.c (ia64_dependencies_evaluation_hook): Update
|
||||
to use new interfaces.
|
||||
(ia64_dfa_new_cycle, ia64_gen_check): Ditto.
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_is_costly_dependence): Update to use
|
||||
new interfaces.
|
||||
(is_costly_group): Ditto.
|
||||
|
||||
2007-08-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
* alias.c (rtx_equal_for_memref_p): Constify.
|
||||
|
|
|
@ -6341,28 +6341,37 @@ ia64_dependencies_evaluation_hook (rtx head, rtx tail)
|
|||
if (INSN_P (insn)
|
||||
&& ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IALU)
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
bool has_mem_op_consumer_p = false;
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_FORW_DEPS (insn))
|
||||
FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
|
||||
{
|
||||
enum attr_itanium_class c;
|
||||
|
||||
if (DEP_LINK_KIND (link) != REG_DEP_TRUE)
|
||||
if (DEP_TYPE (dep) != REG_DEP_TRUE)
|
||||
continue;
|
||||
|
||||
next = DEP_LINK_CON (link);
|
||||
next = DEP_CON (dep);
|
||||
c = ia64_safe_itanium_class (next);
|
||||
if ((c == ITANIUM_CLASS_ST
|
||||
|| c == ITANIUM_CLASS_STF)
|
||||
&& ia64_st_address_bypass_p (insn, next))
|
||||
break;
|
||||
{
|
||||
has_mem_op_consumer_p = true;
|
||||
break;
|
||||
}
|
||||
else if ((c == ITANIUM_CLASS_LD
|
||||
|| c == ITANIUM_CLASS_FLD
|
||||
|| c == ITANIUM_CLASS_FLDP)
|
||||
&& ia64_ld_address_bypass_p (insn, next))
|
||||
break;
|
||||
{
|
||||
has_mem_op_consumer_p = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
insn->call = link != 0;
|
||||
|
||||
insn->call = has_mem_op_consumer_p;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6639,14 +6648,15 @@ ia64_dfa_new_cycle (FILE *dump, int verbose, rtx insn, int last_clock,
|
|||
|
||||
if (c != ITANIUM_CLASS_MMMUL && c != ITANIUM_CLASS_MMSHF)
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
int d = -1;
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_BACK_DEPS (insn))
|
||||
if (DEP_LINK_KIND (link) == REG_DEP_TRUE)
|
||||
FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
|
||||
if (DEP_TYPE (dep) == REG_DEP_TRUE)
|
||||
{
|
||||
enum attr_itanium_class dep_class;
|
||||
rtx dep_insn = DEP_LINK_PRO (link);
|
||||
rtx dep_insn = DEP_PRO (dep);
|
||||
|
||||
dep_class = ia64_safe_itanium_class (dep_insn);
|
||||
if ((dep_class == ITANIUM_CLASS_MMMUL
|
||||
|
@ -7177,13 +7187,14 @@ ia64_gen_check (rtx insn, rtx label, bool mutate_p)
|
|||
As long as patterns are unique for each instruction, this can be
|
||||
accomplished by matching ORIG_PAT fields. */
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
int check_no = 0;
|
||||
rtx orig_pat = ORIG_PAT (insn);
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_RESOLVED_BACK_DEPS (insn))
|
||||
FOR_EACH_DEP (insn, SD_LIST_RES_BACK, sd_it, dep)
|
||||
{
|
||||
rtx x = DEP_LINK_PRO (link);
|
||||
rtx x = DEP_PRO (dep);
|
||||
|
||||
if (ORIG_PAT (x) == orig_pat)
|
||||
check_no = spec_check_no[INSN_UID (x)];
|
||||
|
|
|
@ -17951,7 +17951,7 @@ rs6000_is_costly_dependence (dep_t dep, int cost, int distance)
|
|||
if (rs6000_sched_costly_dep == true_store_to_load_dep_costly
|
||||
&& is_load_insn (next)
|
||||
&& is_store_insn (insn)
|
||||
&& DEP_KIND (dep) == REG_DEP_TRUE)
|
||||
&& DEP_TYPE (dep) == REG_DEP_TRUE)
|
||||
/* Prevent load after store in the same group if it is a true
|
||||
dependence. */
|
||||
return true;
|
||||
|
@ -18427,15 +18427,15 @@ is_costly_group (rtx *group_insns, rtx next_insn)
|
|||
|
||||
for (i = 0; i < issue_rate; i++)
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
rtx insn = group_insns[i];
|
||||
|
||||
if (!insn)
|
||||
continue;
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_FORW_DEPS (insn))
|
||||
FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
|
||||
{
|
||||
dep_t dep = DEP_LINK_DEP (link);
|
||||
rtx next = DEP_CON (dep);
|
||||
|
||||
if (next == next_insn
|
||||
|
|
14
gcc/ddg.c
14
gcc/ddg.c
|
@ -159,9 +159,9 @@ create_ddg_dep_from_intra_loop_link (ddg_ptr g, ddg_node_ptr src_node,
|
|||
gcc_assert (link);
|
||||
|
||||
/* Note: REG_DEP_ANTI applies to MEM ANTI_DEP as well!! */
|
||||
if (DEP_KIND (link) == REG_DEP_ANTI)
|
||||
if (DEP_TYPE (link) == REG_DEP_ANTI)
|
||||
t = ANTI_DEP;
|
||||
else if (DEP_KIND (link) == REG_DEP_OUTPUT)
|
||||
else if (DEP_TYPE (link) == REG_DEP_OUTPUT)
|
||||
t = OUTPUT_DEP;
|
||||
|
||||
/* We currently choose not to create certain anti-deps edges and
|
||||
|
@ -368,7 +368,6 @@ build_intra_loop_deps (ddg_ptr g)
|
|||
/* Hold the dependency analysis state during dependency calculations. */
|
||||
struct deps tmp_deps;
|
||||
rtx head, tail;
|
||||
dep_link_t link;
|
||||
|
||||
/* Build the dependence information, using the sched_analyze function. */
|
||||
init_deps_global ();
|
||||
|
@ -383,19 +382,19 @@ build_intra_loop_deps (ddg_ptr g)
|
|||
for (i = 0; i < g->num_nodes; i++)
|
||||
{
|
||||
ddg_node_ptr dest_node = &g->nodes[i];
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
|
||||
if (! INSN_P (dest_node->insn))
|
||||
continue;
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_BACK_DEPS (dest_node->insn))
|
||||
FOR_EACH_DEP (dest_node->insn, SD_LIST_BACK, sd_it, dep)
|
||||
{
|
||||
dep_t dep = DEP_LINK_DEP (link);
|
||||
ddg_node_ptr src_node = get_node_of_insn (g, DEP_PRO (dep));
|
||||
|
||||
if (!src_node)
|
||||
continue;
|
||||
|
||||
add_forw_dep (link);
|
||||
create_ddg_dep_from_intra_loop_link (g, src_node, dest_node, dep);
|
||||
}
|
||||
|
||||
|
@ -420,6 +419,9 @@ build_intra_loop_deps (ddg_ptr g)
|
|||
/* Free the INSN_LISTs. */
|
||||
finish_deps_global ();
|
||||
free_deps (&tmp_deps);
|
||||
|
||||
/* Free dependencies. */
|
||||
sched_free_deps (head, tail, false);
|
||||
}
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
1814
gcc/sched-deps.c
1814
gcc/sched-deps.c
File diff suppressed because it is too large
Load diff
|
@ -303,24 +303,26 @@ static struct sched_info ebb_sched_info =
|
|||
static basic_block
|
||||
earliest_block_with_similiar_load (basic_block last_block, rtx load_insn)
|
||||
{
|
||||
dep_link_t back_link;
|
||||
sd_iterator_def back_sd_it;
|
||||
dep_t back_dep;
|
||||
basic_block bb, earliest_block = NULL;
|
||||
|
||||
FOR_EACH_DEP_LINK (back_link, INSN_BACK_DEPS (load_insn))
|
||||
FOR_EACH_DEP (load_insn, SD_LIST_BACK, back_sd_it, back_dep)
|
||||
{
|
||||
rtx insn1 = DEP_LINK_PRO (back_link);
|
||||
rtx insn1 = DEP_PRO (back_dep);
|
||||
|
||||
if (DEP_LINK_KIND (back_link) == REG_DEP_TRUE)
|
||||
if (DEP_TYPE (back_dep) == REG_DEP_TRUE)
|
||||
/* Found a DEF-USE dependence (insn1, load_insn). */
|
||||
{
|
||||
/* Found a DEF-USE dependence (insn1, load_insn). */
|
||||
dep_link_t fore_link;
|
||||
sd_iterator_def fore_sd_it;
|
||||
dep_t fore_dep;
|
||||
|
||||
FOR_EACH_DEP_LINK (fore_link, INSN_FORW_DEPS (insn1))
|
||||
FOR_EACH_DEP (insn1, SD_LIST_FORW, fore_sd_it, fore_dep)
|
||||
{
|
||||
rtx insn2 = DEP_LINK_CON (fore_link);
|
||||
rtx insn2 = DEP_CON (fore_dep);
|
||||
basic_block insn2_block = BLOCK_FOR_INSN (insn2);
|
||||
|
||||
if (DEP_LINK_KIND (fore_link) == REG_DEP_TRUE)
|
||||
if (DEP_TYPE (fore_dep) == REG_DEP_TRUE)
|
||||
{
|
||||
if (earliest_block != NULL
|
||||
&& earliest_block->index < insn2_block->index)
|
||||
|
@ -395,23 +397,32 @@ add_deps_for_risky_insns (rtx head, rtx tail)
|
|||
rank. */
|
||||
if (! sched_insns_conditions_mutex_p (insn, prev))
|
||||
{
|
||||
if (!(current_sched_info->flags & DO_SPECULATION))
|
||||
dep_def _dep, *dep = &_dep;
|
||||
|
||||
init_dep (dep, prev, insn, REG_DEP_ANTI);
|
||||
|
||||
if (!(current_sched_info->flags & USE_DEPS_LIST))
|
||||
{
|
||||
enum DEPS_ADJUST_RESULT res;
|
||||
|
||||
res = add_or_update_back_dep (insn, prev,
|
||||
REG_DEP_ANTI, DEP_ANTI);
|
||||
|
||||
if (res == DEP_CREATED)
|
||||
add_forw_dep (DEPS_LIST_FIRST (INSN_BACK_DEPS (insn)));
|
||||
else
|
||||
gcc_assert (res != DEP_CHANGED);
|
||||
res = sd_add_or_update_dep (dep, false);
|
||||
|
||||
/* We can't change an existing dependency with
|
||||
DEP_ANTI. */
|
||||
gcc_assert (res != DEP_CHANGED);
|
||||
}
|
||||
else
|
||||
add_or_update_back_forw_dep (insn, prev, REG_DEP_ANTI,
|
||||
set_dep_weak (DEP_ANTI,
|
||||
BEGIN_CONTROL,
|
||||
MAX_DEP_WEAK));
|
||||
{
|
||||
if ((current_sched_info->flags & DO_SPECULATION)
|
||||
&& (spec_info->mask & BEGIN_CONTROL))
|
||||
DEP_STATUS (dep) = set_dep_weak (DEP_ANTI, BEGIN_CONTROL,
|
||||
MAX_DEP_WEAK);
|
||||
|
||||
sd_add_or_update_dep (dep, false);
|
||||
|
||||
/* Dep_status could have been changed.
|
||||
No assertion here. */
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -450,14 +461,11 @@ schedule_ebb (rtx head, rtx tail)
|
|||
{
|
||||
init_deps_global ();
|
||||
|
||||
/* Compute backward dependencies. */
|
||||
/* Compute dependencies. */
|
||||
init_deps (&tmp_deps);
|
||||
sched_analyze (&tmp_deps, head, tail);
|
||||
free_deps (&tmp_deps);
|
||||
|
||||
/* Compute forward dependencies. */
|
||||
compute_forward_dependences (head, tail);
|
||||
|
||||
add_deps_for_risky_insns (head, tail);
|
||||
|
||||
if (targetm.sched.dependencies_evaluation_hook)
|
||||
|
@ -510,8 +518,12 @@ schedule_ebb (rtx head, rtx tail)
|
|||
|
||||
/* Sanity check: verify that all region insns were scheduled. */
|
||||
gcc_assert (sched_n_insns == n_insns);
|
||||
head = current_sched_info->head;
|
||||
tail = current_sched_info->tail;
|
||||
|
||||
/* Free dependencies. */
|
||||
sched_free_deps (current_sched_info->head, current_sched_info->tail, true);
|
||||
|
||||
gcc_assert (haifa_recovery_bb_ever_added_p
|
||||
|| deps_pools_are_empty_p ());
|
||||
|
||||
if (EDGE_COUNT (last_bb->preds) == 0)
|
||||
/* LAST_BB is unreachable. */
|
||||
|
|
250
gcc/sched-int.h
250
gcc/sched-int.h
|
@ -54,35 +54,40 @@ struct _dep
|
|||
/* Consumer. */
|
||||
rtx con;
|
||||
|
||||
/* Dependency kind (aka dependency major type). This field is superseded
|
||||
by STATUS below. Though, it is still in place because all the backends
|
||||
use it. */
|
||||
enum reg_note kind;
|
||||
/* Dependency major type. This field is superseded by STATUS below.
|
||||
Though, it is still in place because some targets use it. */
|
||||
enum reg_note type;
|
||||
|
||||
/* Dependency status. This field holds all dependency types and additional
|
||||
information for speculative dependencies. */
|
||||
ds_t status;
|
||||
};
|
||||
typedef struct _dep *dep_t;
|
||||
|
||||
typedef struct _dep dep_def;
|
||||
typedef dep_def *dep_t;
|
||||
|
||||
#define DEP_PRO(D) ((D)->pro)
|
||||
#define DEP_CON(D) ((D)->con)
|
||||
#define DEP_KIND(D) ((D)->kind)
|
||||
#define DEP_TYPE(D) ((D)->type)
|
||||
#define DEP_STATUS(D) ((D)->status)
|
||||
|
||||
/* Functions to work with dep. */
|
||||
|
||||
extern void init_dep_1 (dep_t, rtx, rtx, enum reg_note, ds_t);
|
||||
extern void init_dep (dep_t, rtx, rtx, enum reg_note);
|
||||
|
||||
extern void sd_debug_dep (dep_t);
|
||||
|
||||
/* Definition of this struct resides below. */
|
||||
struct _dep_node;
|
||||
typedef struct _dep_node *dep_node_t;
|
||||
|
||||
/* A link in the dependency list. This is essentially an equivalent of a
|
||||
single {INSN, DEPS}_LIST rtx. */
|
||||
struct _dep_link
|
||||
{
|
||||
/* Dep node with all the data. */
|
||||
struct _dep_node *node;
|
||||
dep_node_t node;
|
||||
|
||||
/* Next link in the list. For the last one it is NULL. */
|
||||
struct _dep_link *next;
|
||||
|
@ -107,39 +112,22 @@ typedef struct _dep_link *dep_link_t;
|
|||
#define DEP_LINK_DEP(N) (DEP_NODE_DEP (DEP_LINK_NODE (N)))
|
||||
#define DEP_LINK_PRO(N) (DEP_PRO (DEP_LINK_DEP (N)))
|
||||
#define DEP_LINK_CON(N) (DEP_CON (DEP_LINK_DEP (N)))
|
||||
#define DEP_LINK_KIND(N) (DEP_KIND (DEP_LINK_DEP (N)))
|
||||
#define DEP_LINK_TYPE(N) (DEP_TYPE (DEP_LINK_DEP (N)))
|
||||
#define DEP_LINK_STATUS(N) (DEP_STATUS (DEP_LINK_DEP (N)))
|
||||
|
||||
void debug_dep_links (dep_link_t);
|
||||
|
||||
/* A list of dep_links. */
|
||||
struct _deps_list
|
||||
{
|
||||
/* First element. */
|
||||
dep_link_t first;
|
||||
|
||||
/* Total number of elements in the list. */
|
||||
int n_links;
|
||||
};
|
||||
typedef struct _deps_list *deps_list_t;
|
||||
|
||||
#define DEPS_LIST_FIRST(L) ((L)->first)
|
||||
|
||||
/* Macro to walk through deps_list. */
|
||||
#define FOR_EACH_DEP_LINK(LINK, LIST) \
|
||||
for ((LINK) = DEPS_LIST_FIRST (LIST); \
|
||||
(LINK) != NULL; \
|
||||
(LINK) = DEP_LINK_NEXT (LINK))
|
||||
|
||||
/* Functions to work with deps_list. */
|
||||
|
||||
deps_list_t create_deps_list (bool);
|
||||
void free_deps_list (deps_list_t);
|
||||
void delete_deps_list (deps_list_t);
|
||||
bool deps_list_empty_p (deps_list_t);
|
||||
void debug_deps_list (deps_list_t);
|
||||
void add_back_dep_to_deps_list (deps_list_t, dep_t);
|
||||
dep_link_t find_link_by_pro_in_deps_list (deps_list_t, rtx);
|
||||
dep_link_t find_link_by_con_in_deps_list (deps_list_t, rtx);
|
||||
void copy_deps_list_change_con (deps_list_t, deps_list_t, rtx);
|
||||
|
||||
void move_dep_link (dep_link_t, deps_list_t);
|
||||
#define DEPS_LIST_N_LINKS(L) ((L)->n_links)
|
||||
|
||||
/* Suppose we have a dependence Y between insn pro1 and con1, where pro1 has
|
||||
additional dependents con0 and con2, and con1 is dependent on additional
|
||||
|
@ -247,7 +235,6 @@ struct _dep_node
|
|||
/* Forward link. */
|
||||
struct _dep_link forw;
|
||||
};
|
||||
typedef struct _dep_node *dep_node_t;
|
||||
|
||||
#define DEP_NODE_BACK(N) (&(N)->back)
|
||||
#define DEP_NODE_DEP(N) (&(N)->dep)
|
||||
|
@ -469,15 +456,17 @@ extern struct sched_info *current_sched_info;
|
|||
|
||||
struct haifa_insn_data
|
||||
{
|
||||
/* NB: We can't place 'struct _deps_list' here instead of deps_list_t into
|
||||
h_i_d because when h_i_d extends, addresses of the deps_list->first
|
||||
change without updating deps_list->first->next->prev_nextp. Thus
|
||||
BACK_DEPS and RESOLVED_BACK_DEPS are allocated on the heap and FORW_DEPS
|
||||
list is allocated on the obstack. */
|
||||
/* We can't place 'struct _deps_list' into h_i_d instead of deps_list_t
|
||||
because when h_i_d extends, addresses of the deps_list->first
|
||||
change without updating deps_list->first->next->prev_nextp. */
|
||||
|
||||
/* A list of backward dependencies. The insn is a consumer of all the
|
||||
/* A list of hard backward dependencies. The insn is a consumer of all the
|
||||
deps mentioned here. */
|
||||
deps_list_t back_deps;
|
||||
deps_list_t hard_back_deps;
|
||||
|
||||
/* A list of speculative (weak) dependencies. The insn is a consumer of all
|
||||
the deps mentioned here. */
|
||||
deps_list_t spec_back_deps;
|
||||
|
||||
/* A list of insns which depend on the instruction. Unlike 'back_deps',
|
||||
it represents forward dependencies. */
|
||||
|
@ -486,6 +475,11 @@ struct haifa_insn_data
|
|||
/* A list of scheduled producers of the instruction. Links are being moved
|
||||
from 'back_deps' to 'resolved_back_deps' while scheduling. */
|
||||
deps_list_t resolved_back_deps;
|
||||
|
||||
/* A list of scheduled consumers of the instruction. Links are being moved
|
||||
from 'forw_deps' to 'resolved_forw_deps' while scheduling to fasten the
|
||||
search in 'forw_deps'. */
|
||||
deps_list_t resolved_forw_deps;
|
||||
|
||||
/* Logical uid gives the original ordering of the insns. */
|
||||
int luid;
|
||||
|
@ -493,11 +487,6 @@ struct haifa_insn_data
|
|||
/* A priority for each insn. */
|
||||
int priority;
|
||||
|
||||
/* The number of incoming edges in the forward dependency graph.
|
||||
As scheduling proceeds, counts are decreased. An insn moves to
|
||||
the ready queue when its counter reaches zero. */
|
||||
int dep_count;
|
||||
|
||||
/* Number of instructions referring to this insn. */
|
||||
int ref_count;
|
||||
|
||||
|
@ -553,13 +542,16 @@ extern struct haifa_insn_data *h_i_d;
|
|||
|
||||
/* Accessor macros for h_i_d. There are more in haifa-sched.c and
|
||||
sched-rgn.c. */
|
||||
#define INSN_BACK_DEPS(INSN) (h_i_d[INSN_UID (INSN)].back_deps)
|
||||
|
||||
#define INSN_HARD_BACK_DEPS(INSN) (h_i_d[INSN_UID (INSN)].hard_back_deps)
|
||||
#define INSN_SPEC_BACK_DEPS(INSN) (h_i_d[INSN_UID (INSN)].spec_back_deps)
|
||||
#define INSN_FORW_DEPS(INSN) (h_i_d[INSN_UID (INSN)].forw_deps)
|
||||
#define INSN_RESOLVED_BACK_DEPS(INSN) \
|
||||
(h_i_d[INSN_UID (INSN)].resolved_back_deps)
|
||||
#define INSN_RESOLVED_FORW_DEPS(INSN) \
|
||||
(h_i_d[INSN_UID (INSN)].resolved_forw_deps)
|
||||
#define INSN_LUID(INSN) (h_i_d[INSN_UID (INSN)].luid)
|
||||
#define CANT_MOVE(insn) (h_i_d[INSN_UID (insn)].cant_move)
|
||||
#define INSN_DEP_COUNT(INSN) (h_i_d[INSN_UID (INSN)].dep_count)
|
||||
#define INSN_PRIORITY(INSN) (h_i_d[INSN_UID (INSN)].priority)
|
||||
#define INSN_PRIORITY_STATUS(INSN) (h_i_d[INSN_UID (INSN)].priority_status)
|
||||
#define INSN_PRIORITY_KNOWN(INSN) (INSN_PRIORITY_STATUS (INSN) > 0)
|
||||
|
@ -694,13 +686,16 @@ enum SPEC_TYPES_OFFSETS {
|
|||
#define HARD_DEP (DEP_ANTI << 1)
|
||||
|
||||
/* This represents the results of calling sched-deps.c functions,
|
||||
which modify dependencies. Possible choices are: a dependence
|
||||
is already present and nothing has been changed; a dependence type
|
||||
has been changed; brand new dependence has been created. */
|
||||
which modify dependencies. */
|
||||
enum DEPS_ADJUST_RESULT {
|
||||
DEP_PRESENT = 1,
|
||||
DEP_CHANGED = 2,
|
||||
DEP_CREATED = 3
|
||||
/* No dependence needed (e.g. producer == consumer). */
|
||||
DEP_NODEP,
|
||||
/* Dependence is already present and wasn't modified. */
|
||||
DEP_PRESENT,
|
||||
/* Existing dependence was modified to include additional information. */
|
||||
DEP_CHANGED,
|
||||
/* New dependence has been created. */
|
||||
DEP_CREATED
|
||||
};
|
||||
|
||||
/* Represents the bits that can be set in the flags field of the
|
||||
|
@ -731,6 +726,9 @@ enum SPEC_SCHED_FLAGS {
|
|||
extern FILE *sched_dump;
|
||||
extern int sched_verbose;
|
||||
|
||||
extern spec_info_t spec_info;
|
||||
extern bool haifa_recovery_bb_ever_added_p;
|
||||
|
||||
/* Exception Free Loads:
|
||||
|
||||
We define five classes of speculative loads: IFREE, IRISKY,
|
||||
|
@ -816,23 +814,19 @@ extern void print_insn (char *, rtx, int);
|
|||
extern bool sched_insns_conditions_mutex_p (rtx, rtx);
|
||||
extern void add_dependence (rtx, rtx, enum reg_note);
|
||||
extern void sched_analyze (struct deps *, rtx, rtx);
|
||||
extern bool deps_pools_are_empty_p (void);
|
||||
extern void sched_free_deps (rtx, rtx, bool);
|
||||
extern void init_deps (struct deps *);
|
||||
extern void free_deps (struct deps *);
|
||||
extern void init_deps_global (void);
|
||||
extern void finish_deps_global (void);
|
||||
extern void add_forw_dep (dep_link_t);
|
||||
extern void compute_forward_dependences (rtx, rtx);
|
||||
extern void init_dependency_caches (int);
|
||||
extern void free_dependency_caches (void);
|
||||
extern void extend_dependency_caches (int, bool);
|
||||
extern enum DEPS_ADJUST_RESULT add_or_update_back_dep (rtx, rtx,
|
||||
enum reg_note, ds_t);
|
||||
extern void add_or_update_back_forw_dep (rtx, rtx, enum reg_note, ds_t);
|
||||
extern void add_back_forw_dep (rtx, rtx, enum reg_note, ds_t);
|
||||
extern void delete_back_forw_dep (dep_link_t);
|
||||
extern dw_t get_dep_weak (ds_t, ds_t);
|
||||
extern ds_t set_dep_weak (ds_t, ds_t, dw_t);
|
||||
extern ds_t ds_merge (ds_t, ds_t);
|
||||
extern void debug_ds (ds_t);
|
||||
|
||||
/* Functions in haifa-sched.c. */
|
||||
extern int haifa_classify_insn (rtx);
|
||||
|
@ -851,11 +845,151 @@ extern void sched_finish (void);
|
|||
|
||||
extern int try_ready (rtx);
|
||||
extern void * xrecalloc (void *, size_t, size_t, size_t);
|
||||
extern bool sched_insn_is_legitimate_for_speculation_p (rtx, ds_t);
|
||||
extern void unlink_bb_notes (basic_block, basic_block);
|
||||
extern void add_block (basic_block, basic_block);
|
||||
extern rtx bb_note (basic_block);
|
||||
|
||||
/* Functions in sched-rgn.c. */
|
||||
|
||||
extern void debug_dependencies (rtx, rtx);
|
||||
|
||||
/* sched-deps.c interface to walk, add, search, update, resolve, delete
|
||||
and debug instruction dependencies. */
|
||||
|
||||
/* Constants defining dependences lists. */
|
||||
|
||||
/* No list. */
|
||||
#define SD_LIST_NONE (0)
|
||||
|
||||
/* hard_back_deps. */
|
||||
#define SD_LIST_HARD_BACK (1)
|
||||
|
||||
/* spec_back_deps. */
|
||||
#define SD_LIST_SPEC_BACK (2)
|
||||
|
||||
/* forw_deps. */
|
||||
#define SD_LIST_FORW (4)
|
||||
|
||||
/* resolved_back_deps. */
|
||||
#define SD_LIST_RES_BACK (8)
|
||||
|
||||
/* resolved_forw_deps. */
|
||||
#define SD_LIST_RES_FORW (16)
|
||||
|
||||
#define SD_LIST_BACK (SD_LIST_HARD_BACK | SD_LIST_SPEC_BACK)
|
||||
|
||||
/* A type to hold above flags. */
|
||||
typedef int sd_list_types_def;
|
||||
|
||||
extern void sd_next_list (rtx, sd_list_types_def *, deps_list_t *, bool *);
|
||||
|
||||
/* Iterator to walk through, resolve and delete dependencies. */
|
||||
struct _sd_iterator
|
||||
{
|
||||
/* What lists to walk. Can be any combination of SD_LIST_* flags. */
|
||||
sd_list_types_def types;
|
||||
|
||||
/* Instruction dependencies lists of which will be walked. */
|
||||
rtx insn;
|
||||
|
||||
/* Pointer to the next field of the previous element. This is not
|
||||
simply a pointer to the next element to allow easy deletion from the
|
||||
list. When a dep is being removed from the list the iterator
|
||||
will automatically advance because the value in *linkp will start
|
||||
reffering to the next element. */
|
||||
dep_link_t *linkp;
|
||||
|
||||
/* True if the current list is a resolved one. */
|
||||
bool resolved_p;
|
||||
};
|
||||
|
||||
typedef struct _sd_iterator sd_iterator_def;
|
||||
|
||||
/* ??? We can move some definitions that are used in below inline functions
|
||||
out of sched-int.h to sched-deps.c provided that the below functions will
|
||||
become global externals.
|
||||
These definitions include:
|
||||
* struct _deps_list: opaque pointer is needed at global scope.
|
||||
* struct _dep_link: opaque pointer is needed at scope of sd_iterator_def.
|
||||
* struct _dep_node: opaque pointer is needed at scope of
|
||||
struct _deps_link. */
|
||||
|
||||
/* Return initialized iterator. */
|
||||
static inline sd_iterator_def
|
||||
sd_iterator_start (rtx insn, sd_list_types_def types)
|
||||
{
|
||||
/* Some dep_link a pointer to which will return NULL. */
|
||||
static dep_link_t null_link = NULL;
|
||||
|
||||
sd_iterator_def i;
|
||||
|
||||
i.types = types;
|
||||
i.insn = insn;
|
||||
i.linkp = &null_link;
|
||||
|
||||
/* Avoid 'uninitialized warning'. */
|
||||
i.resolved_p = false;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/* Return the current element. */
|
||||
static inline bool
|
||||
sd_iterator_cond (sd_iterator_def *it_ptr, dep_t *dep_ptr)
|
||||
{
|
||||
dep_link_t link = *it_ptr->linkp;
|
||||
|
||||
if (link != NULL)
|
||||
{
|
||||
*dep_ptr = DEP_LINK_DEP (link);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sd_list_types_def types = it_ptr->types;
|
||||
|
||||
if (types != SD_LIST_NONE)
|
||||
/* Switch to next list. */
|
||||
{
|
||||
deps_list_t list;
|
||||
|
||||
sd_next_list (it_ptr->insn,
|
||||
&it_ptr->types, &list, &it_ptr->resolved_p);
|
||||
|
||||
it_ptr->linkp = &DEPS_LIST_FIRST (list);
|
||||
|
||||
return sd_iterator_cond (it_ptr, dep_ptr);
|
||||
}
|
||||
|
||||
*dep_ptr = NULL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Advance iterator. */
|
||||
static inline void
|
||||
sd_iterator_next (sd_iterator_def *it_ptr)
|
||||
{
|
||||
it_ptr->linkp = &DEP_LINK_NEXT (*it_ptr->linkp);
|
||||
}
|
||||
|
||||
/* A cycle wrapper. */
|
||||
#define FOR_EACH_DEP(INSN, LIST_TYPES, ITER, DEP) \
|
||||
for ((ITER) = sd_iterator_start ((INSN), (LIST_TYPES)); \
|
||||
sd_iterator_cond (&(ITER), &(DEP)); \
|
||||
sd_iterator_next (&(ITER)))
|
||||
|
||||
extern int sd_lists_size (rtx, sd_list_types_def);
|
||||
extern bool sd_lists_empty_p (rtx, sd_list_types_def);
|
||||
extern void sd_init_insn (rtx);
|
||||
extern void sd_finish_insn (rtx);
|
||||
extern dep_t sd_find_dep_between (rtx, rtx, bool);
|
||||
extern void sd_add_dep (dep_t, bool);
|
||||
extern enum DEPS_ADJUST_RESULT sd_add_or_update_dep (dep_t, bool);
|
||||
extern void sd_resolve_dep (sd_iterator_def);
|
||||
extern void sd_copy_back_deps (rtx, rtx, bool);
|
||||
extern void sd_delete_dep (sd_iterator_def);
|
||||
extern void sd_debug_lists (rtx, sd_list_types_def);
|
||||
|
||||
#endif /* GCC_SCHED_INT_H */
|
||||
|
|
119
gcc/sched-rgn.c
119
gcc/sched-rgn.c
|
@ -277,7 +277,7 @@ static int is_exception_free (rtx, int, int);
|
|||
static bool sets_likely_spilled (rtx);
|
||||
static void sets_likely_spilled_1 (rtx, const_rtx, void *);
|
||||
static void add_branch_dependences (rtx, rtx);
|
||||
static void compute_block_backward_dependences (int);
|
||||
static void compute_block_dependences (int);
|
||||
|
||||
static void init_regions (void);
|
||||
static void schedule_region (int);
|
||||
|
@ -1697,11 +1697,12 @@ update_live (rtx insn, int src)
|
|||
static void
|
||||
set_spec_fed (rtx load_insn)
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_FORW_DEPS (load_insn))
|
||||
if (DEP_LINK_KIND (link) == REG_DEP_TRUE)
|
||||
FED_BY_SPEC_LOAD (DEP_LINK_CON (link)) = 1;
|
||||
FOR_EACH_DEP (load_insn, SD_LIST_FORW, sd_it, dep)
|
||||
if (DEP_TYPE (dep) == REG_DEP_TRUE)
|
||||
FED_BY_SPEC_LOAD (DEP_CON (dep)) = 1;
|
||||
}
|
||||
|
||||
/* On the path from the insn to load_insn_bb, find a conditional
|
||||
|
@ -1710,18 +1711,19 @@ branch depending on insn, that guards the speculative load. */
|
|||
static int
|
||||
find_conditional_protection (rtx insn, int load_insn_bb)
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
|
||||
/* Iterate through DEF-USE forward dependences. */
|
||||
FOR_EACH_DEP_LINK (link, INSN_FORW_DEPS (insn))
|
||||
FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
|
||||
{
|
||||
rtx next = DEP_LINK_CON (link);
|
||||
rtx next = DEP_CON (dep);
|
||||
|
||||
if ((CONTAINING_RGN (BLOCK_NUM (next)) ==
|
||||
CONTAINING_RGN (BB_TO_BLOCK (load_insn_bb)))
|
||||
&& IS_REACHABLE (INSN_BB (next), load_insn_bb)
|
||||
&& load_insn_bb != INSN_BB (next)
|
||||
&& DEP_LINK_KIND (link) == REG_DEP_TRUE
|
||||
&& DEP_TYPE (dep) == REG_DEP_TRUE
|
||||
&& (JUMP_P (next)
|
||||
|| find_conditional_protection (next, load_insn_bb)))
|
||||
return 1;
|
||||
|
@ -1746,14 +1748,15 @@ find_conditional_protection (rtx insn, int load_insn_bb)
|
|||
static int
|
||||
is_conditionally_protected (rtx load_insn, int bb_src, int bb_trg)
|
||||
{
|
||||
dep_link_t link;
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
|
||||
FOR_EACH_DEP_LINK (link, INSN_BACK_DEPS (load_insn))
|
||||
FOR_EACH_DEP (load_insn, SD_LIST_BACK, sd_it, dep)
|
||||
{
|
||||
rtx insn1 = DEP_LINK_PRO (link);
|
||||
rtx insn1 = DEP_PRO (dep);
|
||||
|
||||
/* Must be a DEF-USE dependence upon non-branch. */
|
||||
if (DEP_LINK_KIND (link) != REG_DEP_TRUE
|
||||
if (DEP_TYPE (dep) != REG_DEP_TRUE
|
||||
|| JUMP_P (insn1))
|
||||
continue;
|
||||
|
||||
|
@ -1796,27 +1799,29 @@ is_conditionally_protected (rtx load_insn, int bb_src, int bb_trg)
|
|||
static int
|
||||
is_pfree (rtx load_insn, int bb_src, int bb_trg)
|
||||
{
|
||||
dep_link_t back_link;
|
||||
sd_iterator_def back_sd_it;
|
||||
dep_t back_dep;
|
||||
candidate *candp = candidate_table + bb_src;
|
||||
|
||||
if (candp->split_bbs.nr_members != 1)
|
||||
/* Must have exactly one escape block. */
|
||||
return 0;
|
||||
|
||||
FOR_EACH_DEP_LINK (back_link, INSN_BACK_DEPS (load_insn))
|
||||
FOR_EACH_DEP (load_insn, SD_LIST_BACK, back_sd_it, back_dep)
|
||||
{
|
||||
rtx insn1 = DEP_LINK_PRO (back_link);
|
||||
rtx insn1 = DEP_PRO (back_dep);
|
||||
|
||||
if (DEP_LINK_KIND (back_link) == REG_DEP_TRUE)
|
||||
if (DEP_TYPE (back_dep) == REG_DEP_TRUE)
|
||||
/* Found a DEF-USE dependence (insn1, load_insn). */
|
||||
{
|
||||
/* Found a DEF-USE dependence (insn1, load_insn). */
|
||||
dep_link_t fore_link;
|
||||
sd_iterator_def fore_sd_it;
|
||||
dep_t fore_dep;
|
||||
|
||||
FOR_EACH_DEP_LINK (fore_link, INSN_FORW_DEPS (insn1))
|
||||
FOR_EACH_DEP (insn1, SD_LIST_FORW, fore_sd_it, fore_dep)
|
||||
{
|
||||
rtx insn2 = DEP_LINK_CON (fore_link);
|
||||
rtx insn2 = DEP_CON (fore_dep);
|
||||
|
||||
if (DEP_LINK_KIND (fore_link) == REG_DEP_TRUE)
|
||||
if (DEP_TYPE (fore_dep) == REG_DEP_TRUE)
|
||||
{
|
||||
/* Found a DEF-USE dependence (insn1, insn2). */
|
||||
if (haifa_classify_insn (insn2) != PFREE_CANDIDATE)
|
||||
|
@ -1849,7 +1854,7 @@ is_prisky (rtx load_insn, int bb_src, int bb_trg)
|
|||
if (FED_BY_SPEC_LOAD (load_insn))
|
||||
return 1;
|
||||
|
||||
if (deps_list_empty_p (INSN_BACK_DEPS (load_insn)))
|
||||
if (sd_lists_empty_p (load_insn, SD_LIST_BACK))
|
||||
/* Dependence may 'hide' out of the region. */
|
||||
return 1;
|
||||
|
||||
|
@ -2081,7 +2086,8 @@ new_ready (rtx next, ds_t ts)
|
|||
if (not_ex_free
|
||||
/* We are here because is_exception_free () == false.
|
||||
But we possibly can handle that with control speculation. */
|
||||
&& current_sched_info->flags & DO_SPECULATION)
|
||||
&& (current_sched_info->flags & DO_SPECULATION)
|
||||
&& (spec_info->mask & BEGIN_CONTROL))
|
||||
/* Here we got new control-speculative instruction. */
|
||||
ts = set_dep_weak (ts, BEGIN_CONTROL, MAX_DEP_WEAK);
|
||||
else
|
||||
|
@ -2263,8 +2269,7 @@ add_branch_dependences (rtx head, rtx tail)
|
|||
if (!NOTE_P (insn))
|
||||
{
|
||||
if (last != 0
|
||||
&& (find_link_by_pro_in_deps_list (INSN_BACK_DEPS (last), insn)
|
||||
== NULL))
|
||||
&& sd_find_dep_between (insn, last, false) == NULL)
|
||||
{
|
||||
if (! sched_insns_conditions_mutex_p (last, insn))
|
||||
add_dependence (last, insn, REG_DEP_ANTI);
|
||||
|
@ -2472,7 +2477,7 @@ propagate_deps (int bb, struct deps *pred_deps)
|
|||
pred_deps->pending_write_mems = 0;
|
||||
}
|
||||
|
||||
/* Compute backward dependences inside bb. In a multiple blocks region:
|
||||
/* Compute dependences inside bb. In a multiple blocks region:
|
||||
(1) a bb is analyzed after its predecessors, and (2) the lists in
|
||||
effect at the end of bb (after analyzing for bb) are inherited by
|
||||
bb's successors.
|
||||
|
@ -2490,7 +2495,7 @@ propagate_deps (int bb, struct deps *pred_deps)
|
|||
similar, and the result is interblock dependences in the region. */
|
||||
|
||||
static void
|
||||
compute_block_backward_dependences (int bb)
|
||||
compute_block_dependences (int bb)
|
||||
{
|
||||
rtx head, tail;
|
||||
struct deps tmp_deps;
|
||||
|
@ -2500,6 +2505,7 @@ compute_block_backward_dependences (int bb)
|
|||
/* Do the analysis for this block. */
|
||||
gcc_assert (EBB_FIRST_BB (bb) == EBB_LAST_BB (bb));
|
||||
get_ebb_head_tail (EBB_FIRST_BB (bb), EBB_LAST_BB (bb), &head, &tail);
|
||||
|
||||
sched_analyze (&tmp_deps, head, tail);
|
||||
add_branch_dependences (head, tail);
|
||||
|
||||
|
@ -2508,6 +2514,21 @@ compute_block_backward_dependences (int bb)
|
|||
|
||||
/* Free up the INSN_LISTs. */
|
||||
free_deps (&tmp_deps);
|
||||
|
||||
if (targetm.sched.dependencies_evaluation_hook)
|
||||
targetm.sched.dependencies_evaluation_hook (head, tail);
|
||||
}
|
||||
|
||||
/* Free dependencies of instructions inside BB. */
|
||||
static void
|
||||
free_block_dependencies (int bb)
|
||||
{
|
||||
rtx head;
|
||||
rtx tail;
|
||||
|
||||
get_ebb_head_tail (EBB_FIRST_BB (bb), EBB_LAST_BB (bb), &head, &tail);
|
||||
|
||||
sched_free_deps (head, tail, true);
|
||||
}
|
||||
|
||||
/* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
|
||||
|
@ -2527,7 +2548,8 @@ free_pending_lists (void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Print dependences for debugging starting from FROM_BB.
|
||||
Callable from debugger. */
|
||||
/* Print dependences for debugging starting from FROM_BB.
|
||||
Callable from debugger. */
|
||||
void
|
||||
|
@ -2567,8 +2589,6 @@ void debug_dependencies (rtx head, rtx tail)
|
|||
|
||||
for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
|
||||
{
|
||||
dep_link_t link;
|
||||
|
||||
if (! INSN_P (insn))
|
||||
{
|
||||
int n;
|
||||
|
@ -2589,7 +2609,7 @@ void debug_dependencies (rtx head, rtx tail)
|
|||
INSN_UID (insn),
|
||||
INSN_CODE (insn),
|
||||
BLOCK_NUM (insn),
|
||||
INSN_DEP_COUNT (insn),
|
||||
sd_lists_size (insn, SD_LIST_BACK),
|
||||
INSN_PRIORITY (insn),
|
||||
insn_cost (insn));
|
||||
|
||||
|
@ -2599,8 +2619,13 @@ void debug_dependencies (rtx head, rtx tail)
|
|||
print_reservation (sched_dump, insn);
|
||||
|
||||
fprintf (sched_dump, "\t: ");
|
||||
FOR_EACH_DEP_LINK (link, INSN_FORW_DEPS (insn))
|
||||
fprintf (sched_dump, "%d ", INSN_UID (DEP_LINK_CON (link)));
|
||||
{
|
||||
sd_iterator_def sd_it;
|
||||
dep_t dep;
|
||||
|
||||
FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
|
||||
fprintf (sched_dump, "%d ", INSN_UID (DEP_CON (dep)));
|
||||
}
|
||||
fprintf (sched_dump, "\n");
|
||||
}
|
||||
|
||||
|
@ -2658,23 +2683,9 @@ schedule_region (int rgn)
|
|||
for (bb = 0; bb < current_nr_blocks; bb++)
|
||||
init_deps (bb_deps + bb);
|
||||
|
||||
/* Compute backward dependencies. */
|
||||
/* Compute dependencies. */
|
||||
for (bb = 0; bb < current_nr_blocks; bb++)
|
||||
compute_block_backward_dependences (bb);
|
||||
|
||||
/* Compute forward dependencies. */
|
||||
for (bb = current_nr_blocks - 1; bb >= 0; bb--)
|
||||
{
|
||||
rtx head, tail;
|
||||
|
||||
gcc_assert (EBB_FIRST_BB (bb) == EBB_LAST_BB (bb));
|
||||
get_ebb_head_tail (EBB_FIRST_BB (bb), EBB_LAST_BB (bb), &head, &tail);
|
||||
|
||||
compute_forward_dependences (head, tail);
|
||||
|
||||
if (targetm.sched.dependencies_evaluation_hook)
|
||||
targetm.sched.dependencies_evaluation_hook (head, tail);
|
||||
}
|
||||
compute_block_dependences (bb);
|
||||
|
||||
free_pending_lists ();
|
||||
|
||||
|
@ -2826,7 +2837,6 @@ schedule_region (int rgn)
|
|||
/* Sanity check: verify that all region insns were scheduled. */
|
||||
gcc_assert (sched_rgn_n_insns == rgn_n_insns);
|
||||
|
||||
|
||||
/* Done with this region. */
|
||||
|
||||
if (current_nr_blocks > 1)
|
||||
|
@ -2837,6 +2847,13 @@ schedule_region (int rgn)
|
|||
sbitmap_vector_free (ancestor_edges);
|
||||
free (rgn_edges);
|
||||
}
|
||||
|
||||
/* Free dependencies. */
|
||||
for (bb = 0; bb < current_nr_blocks; ++bb)
|
||||
free_block_dependencies (bb);
|
||||
|
||||
gcc_assert (haifa_recovery_bb_ever_added_p
|
||||
|| deps_pools_are_empty_p ());
|
||||
}
|
||||
|
||||
/* Initialize data structures for region scheduling. */
|
||||
|
|
Loading…
Add table
Reference in a new issue