Macros |
| #define | _LIST_NEXT(L) ((L)->next) |
| #define | _XLIST_X(L) ((L)->u.x) |
| #define | _XLIST_NEXT(L) (_LIST_NEXT (L)) |
| #define | ILIST_INSN(L) (_XLIST_X (L)) |
| #define | ILIST_NEXT(L) (_XLIST_NEXT (L)) |
| #define | EXPR_VINSN(EXPR) ((EXPR)->vinsn) |
| #define | EXPR_INSN_RTX(EXPR) (VINSN_INSN_RTX (EXPR_VINSN (EXPR))) |
| #define | EXPR_PATTERN(EXPR) (VINSN_PATTERN (EXPR_VINSN (EXPR))) |
| #define | EXPR_LHS(EXPR) (VINSN_LHS (EXPR_VINSN (EXPR))) |
| #define | EXPR_RHS(EXPR) (VINSN_RHS (EXPR_VINSN (EXPR))) |
| #define | EXPR_TYPE(EXPR) (VINSN_TYPE (EXPR_VINSN (EXPR))) |
| #define | EXPR_SEPARABLE_P(EXPR) (VINSN_SEPARABLE_P (EXPR_VINSN (EXPR))) |
| #define | EXPR_SPEC(EXPR) ((EXPR)->spec) |
| #define | EXPR_USEFULNESS(EXPR) ((EXPR)->usefulness) |
| #define | EXPR_PRIORITY(EXPR) ((EXPR)->priority) |
| #define | EXPR_PRIORITY_ADJ(EXPR) ((EXPR)->priority_adj) |
| #define | EXPR_SCHED_TIMES(EXPR) ((EXPR)->sched_times) |
| #define | EXPR_ORIG_BB_INDEX(EXPR) ((EXPR)->orig_bb_index) |
| #define | EXPR_ORIG_SCHED_CYCLE(EXPR) ((EXPR)->orig_sched_cycle) |
| #define | EXPR_SPEC_DONE_DS(EXPR) ((EXPR)->spec_done_ds) |
| #define | EXPR_SPEC_TO_CHECK_DS(EXPR) ((EXPR)->spec_to_check_ds) |
| #define | EXPR_HISTORY_OF_CHANGES(EXPR) ((EXPR)->history_of_changes) |
| #define | EXPR_TARGET_AVAILABLE(EXPR) ((EXPR)->target_available) |
| #define | EXPR_NEEDS_SPEC_CHECK_P(EXPR) ((EXPR)->needs_spec_check_p) |
| #define | EXPR_WAS_SUBSTITUTED(EXPR) ((EXPR)->was_substituted) |
| #define | EXPR_WAS_RENAMED(EXPR) ((EXPR)->was_renamed) |
| #define | EXPR_CANT_MOVE(EXPR) ((EXPR)->cant_move) |
| #define | _AV_SET_EXPR(L) (&(L)->u.expr) |
| #define | _AV_SET_NEXT(L) (_LIST_NEXT (L)) |
| #define | BND_TO(B) ((B)->to) |
| #define | BND_PTR(B) ((B)->ptr) |
| #define | BND_AV(B) ((B)->av) |
| #define | BND_AV1(B) ((B)->av1) |
| #define | BND_DC(B) ((B)->dc) |
| #define | BLIST_BND(L) (&(L)->u.bnd) |
| #define | BLIST_NEXT(L) (_LIST_NEXT (L)) |
| #define | FENCE_INSN(F) ((F)->insn) |
| #define | FENCE_STATE(F) ((F)->state) |
| #define | FENCE_BNDS(F) ((F)->bnds) |
| #define | FENCE_PROCESSED_P(F) ((F)->processed_p) |
| #define | FENCE_SCHEDULED_P(F) ((F)->scheduled_p) |
| #define | FENCE_ISSUED_INSNS(F) ((F)->cycle_issued_insns) |
| #define | FENCE_CYCLE(F) ((F)->cycle) |
| #define | FENCE_STARTS_CYCLE_P(F) ((F)->starts_cycle_p) |
| #define | FENCE_AFTER_STALL_P(F) ((F)->after_stall_p) |
| #define | FENCE_DC(F) ((F)->dc) |
| #define | FENCE_TC(F) ((F)->tc) |
| #define | FENCE_LAST_SCHEDULED_INSN(F) ((F)->last_scheduled_insn) |
| #define | FENCE_ISSUE_MORE(F) ((F)->issue_more) |
| #define | FENCE_EXECUTING_INSNS(F) ((F)->executing_insns) |
| #define | FENCE_READY_TICKS(F) ((F)->ready_ticks) |
| #define | FENCE_READY_TICKS_SIZE(F) ((F)->ready_ticks_size) |
| #define | FENCE_SCHED_NEXT(F) ((F)->sched_next) |
| #define | FLIST_FENCE(L) (&(L)->u.fence) |
| #define | FLIST_NEXT(L) (_LIST_NEXT (L)) |
| #define | FLIST_TAIL_HEAD(L) ((L)->head) |
| #define | FLIST_TAIL_TAILP(L) ((L)->tailp) |
| #define | _FOR_EACH(TYPE, ELEM, I, L) |
| #define | _FOR_EACH_1(TYPE, ELEM, I, LP) |
| #define | _xlist_remove(LP) (_list_remove (LP)) |
| #define | _xlist_clear(LP) (_list_clear (LP)) |
| #define | _xlist_iter_remove(IP) (_list_iter_remove (IP)) |
| #define | _FOR_EACH_X(X, I, L) _FOR_EACH (x, (X), (I), (L)) |
| #define | _FOR_EACH_X_1(X, I, LP) _FOR_EACH_1 (x, (X), (I), (LP)) |
| #define | ilist_add(LP, INSN) (_xlist_add ((LP), (INSN))) |
| #define | ilist_remove(LP) (_xlist_remove (LP)) |
| #define | ilist_clear(LP) (_xlist_clear (LP)) |
| #define | ilist_is_in_p(L, INSN) (_xlist_is_in_p ((L), (INSN))) |
| #define | ilist_iter_remove(IP) (_xlist_iter_remove (IP)) |
| #define | FOR_EACH_INSN(INSN, I, L) _FOR_EACH_X (INSN, I, L) |
| #define | FOR_EACH_INSN_1(INSN, I, LP) _FOR_EACH_X_1 (INSN, I, LP) |
| #define | FOR_EACH_EXPR(EXPR, I, AV) _FOR_EACH (expr, (EXPR), (I), (AV)) |
| #define | FOR_EACH_EXPR_1(EXPR, I, AV) _FOR_EACH_1 (expr, (EXPR), (I), (AV)) |
| #define | DEF_LIST_NEXT(L) (_LIST_NEXT (L)) |
| #define | DEF_LIST_DEF(L) (&(L)->u.def) |
| #define | FOR_EACH_DEF(DEF, I, DEF_LIST) _FOR_EACH (def, (DEF), (I), (DEF_LIST)) |
| #define | IDATA_TYPE(ID) ((ID)->type) |
| #define | IDATA_LHS(ID) ((ID)->lhs) |
| #define | IDATA_RHS(ID) ((ID)->rhs) |
| #define | IDATA_REG_SETS(ID) ((ID)->reg_sets) |
| #define | IDATA_REG_USES(ID) ((ID)->reg_uses) |
| #define | IDATA_REG_CLOBBERS(ID) ((ID)->reg_clobbers) |
| #define | VINSN_INSN_RTX(VI) ((VI)->insn_rtx) |
| #define | VINSN_PATTERN(VI) (PATTERN (VINSN_INSN_RTX (VI))) |
| #define | VINSN_ID(VI) (&((VI)->id)) |
| #define | VINSN_HASH(VI) ((VI)->hash) |
| #define | VINSN_HASH_RTX(VI) ((VI)->hash_rtx) |
| #define | VINSN_TYPE(VI) (IDATA_TYPE (VINSN_ID (VI))) |
| #define | VINSN_SEPARABLE_P(VI) (VINSN_TYPE (VI) == SET) |
| #define | VINSN_CLONABLE_P(VI) (VINSN_SEPARABLE_P (VI) || VINSN_TYPE (VI) == USE) |
| #define | VINSN_UNIQUE_P(VI) (!VINSN_CLONABLE_P (VI)) |
| #define | VINSN_LHS(VI) (IDATA_LHS (VINSN_ID (VI))) |
| #define | VINSN_RHS(VI) (IDATA_RHS (VINSN_ID (VI))) |
| #define | VINSN_REG_SETS(VI) (IDATA_REG_SETS (VINSN_ID (VI))) |
| #define | VINSN_REG_USES(VI) (IDATA_REG_USES (VINSN_ID (VI))) |
| #define | VINSN_REG_CLOBBERS(VI) (IDATA_REG_CLOBBERS (VINSN_ID (VI))) |
| #define | VINSN_COUNT(VI) ((VI)->count) |
| #define | VINSN_MAY_TRAP_P(VI) ((VI)->may_trap_p) |
| #define | SID(INSN) (&s_i_d[INSN_LUID (INSN)]) |
| #define | SID_BY_UID(UID) (&s_i_d[LUID_BY_UID (UID)]) |
| #define | INSN_ASM_P(INSN) (SID (INSN)->asm_p) |
| #define | INSN_SCHED_NEXT(INSN) (SID (INSN)->sched_next) |
| #define | INSN_ANALYZED_DEPS(INSN) (SID (INSN)->analyzed_deps) |
| #define | INSN_FOUND_DEPS(INSN) (SID (INSN)->found_deps) |
| #define | INSN_DEPS_CONTEXT(INSN) (SID (INSN)->deps_context) |
| #define | INSN_ORIGINATORS(INSN) (SID (INSN)->originators) |
| #define | INSN_ORIGINATORS_BY_UID(UID) (SID_BY_UID (UID)->originators) |
| #define | INSN_TRANSFORMED_INSNS(INSN) (SID (INSN)->transformed_insns) |
| #define | INSN_EXPR(INSN) (&SID (INSN)->expr) |
| #define | INSN_LIVE(INSN) (SID (INSN)->live) |
| #define | INSN_LIVE_VALID_P(INSN) (SID (INSN)->live_valid_p) |
| #define | INSN_VINSN(INSN) (EXPR_VINSN (INSN_EXPR (INSN))) |
| #define | INSN_TYPE(INSN) (VINSN_TYPE (INSN_VINSN (INSN))) |
| #define | INSN_SIMPLEJUMP_P(INSN) (INSN_TYPE (INSN) == PC) |
| #define | INSN_LHS(INSN) (VINSN_LHS (INSN_VINSN (INSN))) |
| #define | INSN_RHS(INSN) (VINSN_RHS (INSN_VINSN (INSN))) |
| #define | INSN_REG_SETS(INSN) (VINSN_REG_SETS (INSN_VINSN (INSN))) |
| #define | INSN_REG_CLOBBERS(INSN) (VINSN_REG_CLOBBERS (INSN_VINSN (INSN))) |
| #define | INSN_REG_USES(INSN) (VINSN_REG_USES (INSN_VINSN (INSN))) |
| #define | INSN_SCHED_TIMES(INSN) (EXPR_SCHED_TIMES (INSN_EXPR (INSN))) |
| #define | INSN_SEQNO(INSN) (SID (INSN)->seqno) |
| #define | INSN_AFTER_STALL_P(INSN) (SID (INSN)->after_stall_p) |
| #define | INSN_SCHED_CYCLE(INSN) (SID (INSN)->sched_cycle) |
| #define | INSN_READY_CYCLE(INSN) (SID (INSN)->ready_cycle) |
| #define | INSN_SPEC_CHECKED_DS(INSN) (SID (INSN)->spec_checked_ds) |
| #define | INSN_WS_LEVEL(INSN) (SID (INSN)->ws_level) |
| #define | AV_SET(INSN) (get_av_set (INSN)) |
| #define | AV_LEVEL(INSN) (get_av_level (INSN)) |
| #define | AV_SET_VALID_P(INSN) (AV_LEVEL (INSN) == global_level) |
| #define | INSN_INIT_TODO_LUID (1) |
| #define | INSN_INIT_TODO_SSID (2) |
| #define | INSN_INIT_TODO_SIMPLEJUMP (4) |
| #define | INSN_NOP_P(INSN) (PATTERN (INSN) == nop_pattern) |
| #define | INSN_IN_STREAM_P(INSN) (PREV_INSN (INSN) && NEXT_INSN (INSN)) |
| #define | IN_CURRENT_FENCE_P(INSN) (flist_lookup (fences, INSN) != NULL) |
| #define | MARK_LOOP_FOR_PIPELINING(LOOP) ((LOOP)->aux = (void *)(size_t)(1)) |
| #define | LOOP_MARKED_FOR_PIPELINING_P(LOOP) ((size_t)((LOOP)->aux)) |
| #define | LOOP_PREHEADER_BLOCKS(LOOP) |
| #define | SET_LOOP_PREHEADER_BLOCKS(LOOP, BLOCKS) |
| #define | SEL_GLOBAL_BB_INFO(BB) (&sel_global_bb_info[(BB)->index]) |
| #define | BB_LV_SET(BB) (SEL_GLOBAL_BB_INFO (BB)->lv_set) |
| #define | BB_LV_SET_VALID_P(BB) (SEL_GLOBAL_BB_INFO (BB)->lv_set_valid_p) |
| #define | SEL_REGION_BB_INFO(BB) (&sel_region_bb_info[(BB)->index]) |
| #define | BB_NOTE_LIST(BB) (SEL_REGION_BB_INFO (BB)->note_list) |
| #define | BB_AV_SET(BB) (SEL_REGION_BB_INFO (BB)->av_set) |
| #define | BB_AV_LEVEL(BB) (SEL_REGION_BB_INFO (BB)->av_level) |
| #define | BB_AV_SET_VALID_P(BB) (BB_AV_LEVEL (BB) == global_level) |
| #define | MAX_WS (PARAM_VALUE (PARAM_SELSCHED_MAX_LOOKAHEAD)) |
| #define | SUCCS_NORMAL (1) |
| #define | SUCCS_BACK (2) |
| #define | SUCCS_OUT (4) |
| #define | SUCCS_SKIP_TO_LOOP_EXITS (8) |
| #define | SUCCS_ALL (SUCCS_NORMAL | SUCCS_BACK | SUCCS_OUT) |
| #define | FOR_EACH_SUCC_1(SUCC, ITER, INSN, FLAGS) |
| #define | FOR_EACH_SUCC(SUCC, ITER, INSN) FOR_EACH_SUCC_1 (SUCC, ITER, INSN, SUCCS_NORMAL) |
| #define | SUCC_ITER_EDGE(ITER) ((ITER)->e1) |
Functions |
| static _list_t | _list_alloc () |
| static void | _list_add () |
| static void | _list_remove_nofree () |
| static void | _list_remove () |
| static void | _list_clear () |
| static void | _list_iter_start () |
| static void | _list_iter_next () |
| static void | _list_iter_remove () |
| static void | _list_iter_remove_nofree () |
| static void | _xlist_add () |
| static bool | _xlist_is_in_p () |
| static bool | _list_iter_cond_x () |
| bool | _list_iter_cond_expr () |
| static bool | _list_iter_cond_def () |
| sel_insn_data_def | insn_sid (insn_t) |
| av_set_t | get_av_set (insn_t) |
| int | get_av_level (insn_t) |
| void | sel_extend_global_bb_info (void) |
| void | sel_finish_global_bb_info (void) |
| insn_t | sel_bb_head (basic_block) |
| insn_t | sel_bb_end (basic_block) |
| bool | sel_bb_empty_p (basic_block) |
| bool | in_current_region_p (basic_block) |
| static bool | inner_loop_header_p () |
| static vec< edge > | get_loop_exit_edges_unique_dests () |
| static bool | sel_bb_empty_or_nop_p () |
| static vec< edge > | get_all_loop_exits () |
| static succ_iterator | _succ_iter_start () |
| static bool | _succ_iter_cond (succ_iterator *ip, rtx *succp, rtx insn, bool check(edge, succ_iterator *)) |
| static void | _succ_iter_next () |
| static bool | _eligible_successor_edge_p () |
| static basic_block | bb_next_bb () |
| ilist_t | ilist_copy (ilist_t) |
| ilist_t | ilist_invert (ilist_t) |
| void | blist_add (blist_t *, insn_t, ilist_t, deps_t) |
| void | blist_remove (blist_t *) |
| void | flist_tail_init (flist_tail_t) |
| fence_t | flist_lookup (flist_t, insn_t) |
| void | flist_clear (flist_t *) |
| void | def_list_add (def_list_t *, insn_t, bool) |
| tc_t | create_target_context (bool) |
| void | set_target_context (tc_t) |
| void | reset_target_context (tc_t, bool) |
| void | advance_deps_context (deps_t, insn_t) |
| void | init_fences (insn_t) |
| void | add_clean_fence_to_fences (flist_tail_t, insn_t, fence_t) |
| void | add_dirty_fence_to_fences (flist_tail_t, insn_t, fence_t) |
| void | move_fence_to_fences (flist_t, flist_tail_t) |
| regset | get_regset_from_pool (void) |
| regset | get_clear_regset_from_pool (void) |
| void | return_regset_to_pool (regset) |
| void | free_regset_pool (void) |
| insn_t | get_nop_from_pool (insn_t) |
| void | return_nop_to_pool (insn_t, bool) |
| void | free_nop_pool (void) |
| bool | vinsn_separable_p (vinsn_t) |
| bool | vinsn_cond_branch_p (vinsn_t) |
| void | recompute_vinsn_lhs_rhs (vinsn_t) |
| int | sel_vinsn_cost (vinsn_t) |
| insn_t | sel_gen_insn_from_rtx_after (rtx, expr_t, int, insn_t) |
| insn_t | sel_gen_recovery_insn_from_rtx_after (rtx, expr_t, int, insn_t) |
| insn_t | sel_gen_insn_from_expr_after (expr_t, vinsn_t, int, insn_t) |
| insn_t | sel_move_insn (expr_t, int, insn_t) |
| void | vinsn_attach (vinsn_t) |
| void | vinsn_detach (vinsn_t) |
| vinsn_t | vinsn_copy (vinsn_t, bool) |
| bool | vinsn_equal_p (vinsn_t, vinsn_t) |
| void | copy_expr (expr_t, expr_t) |
| void | copy_expr_onside (expr_t, expr_t) |
| void | merge_expr_data (expr_t, expr_t, insn_t) |
| void | merge_expr (expr_t, expr_t, insn_t) |
| void | clear_expr (expr_t) |
| unsigned | expr_dest_regno (expr_t) |
| rtx | expr_dest_reg (expr_t) |
| int | find_in_history_vect (vec< expr_history_def >, rtx, vinsn_t, bool) |
| void | insert_in_history_vect (vec< expr_history_def > *, unsigned, enum local_trans_type, vinsn_t, vinsn_t, ds_t) |
| void | mark_unavailable_targets (av_set_t, av_set_t, regset) |
| int | speculate_expr (expr_t, ds_t) |
| void | av_set_add (av_set_t *, expr_t) |
| void | av_set_iter_remove (av_set_iterator *) |
| expr_t | av_set_lookup (av_set_t, vinsn_t) |
| expr_t | merge_with_other_exprs (av_set_t *, av_set_iterator *, expr_t) |
| bool | av_set_is_in_p (av_set_t, vinsn_t) |
| av_set_t | av_set_copy (av_set_t) |
| void | av_set_union_and_clear (av_set_t *, av_set_t *, insn_t) |
| void | av_set_union_and_live (av_set_t *, av_set_t *, regset, regset, insn_t) |
| void | av_set_clear (av_set_t *) |
| void | av_set_leave_one_nonspec (av_set_t *) |
| expr_t | av_set_element (av_set_t, int) |
| void | av_set_substract_cond_branches (av_set_t *) |
| void | av_set_split_usefulness (av_set_t, int, int) |
| void | av_set_code_motion_filter (av_set_t *, av_set_t) |
| void | sel_save_haifa_priorities (void) |
| void | sel_init_global_and_expr (bb_vec_t) |
| void | sel_finish_global_and_expr (void) |
| regset | compute_live (insn_t) |
| bool | register_unavailable_p (regset, rtx) |
| void | sel_clear_has_dependence (void) |
| ds_t | has_dependence_p (expr_t, insn_t, ds_t **) |
| int | tick_check_p (expr_t, deps_t, fence_t) |
| bool | lhs_of_insn_equals_to_dest_p (insn_t, rtx) |
| bool | insn_eligible_for_subst_p (insn_t) |
| void | get_dest_and_mode (rtx, rtx *, enum machine_mode *) |
| bool | bookkeeping_can_be_created_if_moved_through_p (insn_t) |
| bool | sel_remove_insn (insn_t, bool, bool) |
| bool | bb_header_p (insn_t) |
| void | sel_init_invalid_data_sets (insn_t) |
| bool | insn_at_boundary_p (insn_t) |
| bool | sel_bb_head_p (insn_t) |
| bool | sel_bb_end_p (insn_t) |
| basic_block | fallthru_bb_of_jump (rtx) |
| void | sel_init_bbs (bb_vec_t) |
| void | sel_finish_bbs (void) |
| struct succs_info * | compute_succs_info (insn_t, short) |
| void | free_succs_info (struct succs_info *) |
| bool | sel_insn_has_single_succ_p (insn_t, int) |
| bool | sel_num_cfg_preds_gt_1 (insn_t) |
| int | get_seqno_by_preds (rtx) |
| bool | bb_ends_ebb_p (basic_block) |
| bool | in_same_ebb_p (insn_t, insn_t) |
| bool | tidy_control_flow (basic_block, bool) |
| void | free_bb_note_pool (void) |
| void | purge_empty_blocks (void) |
| basic_block | sel_split_edge (edge) |
| basic_block | sel_create_recovery_block (insn_t) |
| bool | sel_redirect_edge_and_branch (edge, basic_block) |
| void | sel_redirect_edge_and_branch_force (edge, basic_block) |
| void | sel_init_pipelining (void) |
| void | sel_finish_pipelining (void) |
| void | sel_sched_region (int) |
| loop_p | get_loop_nest_for_rgn (unsigned int) |
| bool | considered_for_pipelining_p (struct loop *) |
| void | make_region_from_loop_preheader (vec< basic_block > *&) |
| void | sel_add_loop_preheaders (bb_vec_t *) |
| bool | sel_is_loop_preheader_p (basic_block) |
| void | clear_outdated_rtx_info (basic_block) |
| void | free_data_sets (basic_block) |
| void | exchange_data_sets (basic_block, basic_block) |
| void | copy_data_sets (basic_block, basic_block) |
| void | sel_register_cfg_hooks (void) |
| void | sel_unregister_cfg_hooks (void) |
| rtx | create_insn_rtx_from_pattern (rtx, rtx) |
| vinsn_t | create_vinsn_from_insn_rtx (rtx, bool) |
| rtx | create_copy_of_insn_rtx (rtx) |
| void | change_vinsn_in_expr (expr_t, vinsn_t) |
| void | init_lv_sets (void) |
| void | free_lv_sets (void) |
| void | setup_nop_and_exit_insns (void) |
| void | free_nop_and_exit_insns (void) |
| void | free_data_for_scheduled_insn (insn_t) |
| void | setup_nop_vinsn (void) |
| void | free_nop_vinsn (void) |
| void | sel_set_sched_flags (void) |
| void | sel_setup_sched_infos (void) |
| void | alloc_sched_pools (void) |
| void | free_sched_pools (void) |
| static bool _eligible_successor_edge_p |
( |
| ) |
|
|
inlinestatic |
Returns true when E1 is an eligible successor edge, possibly skipping empty blocks. When E2P is not null, the resulting edge is written there. FLAGS are used to specify whether back edges and out-of-region edges should be considered.
Any successor of the block that is outside current region is
ineligible, except when we're skipping to loop exits.
Skip empty blocks, but be careful not to leave the region.
Save the second edge for later checks.
BLOCK_TO_BB sets topological order of the region here.
It is important to use real predecessor here, which is ip->bb,
as we may well have e1->src outside current region,
when skipping to loop exits. This is true for the all cases except the last one.
We are advancing forward in the region, as usual.
We are skipping to loop exits here.
This is a back edge. During pipelining we ignore back edges,
but only when it leads to the same loop. It can lead to the header
of the outer loop, which will also be the preheader of
the current loop. A back edge should be requested explicitly.