Commit 4d779342 by Daniel Berlin Committed by Kenneth Zadeck

df.h (DF_SCAN, [...]): New macros.

2005-01-11  Danny Berlin <dberlin@dberlin.org>
            Kenneth Zadeck <zadeck@naturalbridge.com>

	* df.h (DF_SCAN, DF_RU, DF_RD, DF_LR, DF_UR, DF_UREC, DF_CHAIN,
	DF_RI, DF_LAST_PROBLEM_PLUS1, DF_DU_CHAIN, DF_UD_CHAIN,
	DF_REF_TYPE_NAMES, DF_HARD_REGS, DF_EQUIV_NOTES, DF_SUBREGS,
	DF_SCAN_BB_INFO, DF_RU_BB_INFO, DF_RD_BB_INFO, DF_LR_BB_INFO,
	DF_UR_BB_INFO, DF_UREC_BB_INFO, DF_LIVE_IN, DF_LIVE_OUT,
	DF_RA_LIVE_IN, DF_RA_LIVE_OUT, DF_UPWARD_LIVE_IN,
	DF_UPWARD_LIVE_OUT, DF_REF_REAL_REG, DF_REF_REGNO,
	DF_REF_REAL_LOC, DF_REF_REG, DF_REF_LOC, DF_REF_BB, DF_REF_BBNO,
	DF_REF_INSN, DF_REF_INSN_UID, DF_REF_TYPE, DF_REF_CHAIN,
	DF_REF_ID, DF_REF_FLAGS, DF_REF_NEXT_REG, DF_REF_PREV_REG,
	DF_REF_NEXT_REF, DF_REF_DATA, DF_REF_REG_DEF_P, DF_REF_REG_USE_P,
	DF_REF_REG_MEM_STORE_P, DF_REF_REG_MEM_LOAD_P, DF_REF_REG_MEM_P,
	DF_DEFS_SIZE, DF_DEFS_GET, DF_DEFS_SET, DF_USES_SIZE, DF_USES_GET,
	DF_USES_SET, DF_REG_SIZE, DF_REG_DEF_GET, DF_REG_DEF_SET,
	DF_REG_USE_GET, DF_REG_USE_SET, DF_REGNO_FIRST_DEF,
	DF_REGNO_LAST_USE, DF_INSN_SIZE, DF_INSN_GET, DF_INSN_SET,
	DF_INSN_CONTAINS_ASM, DF_INSN_LUID, DF_INSN_DEFS, DF_INSN_USES,
	DF_INSN_UID_GET, DF_INSN_UID_LUID, DF_INSN_UID_DEFS,
	DF_INSN_UID_USES, DF_SCAN_INITIAL, DF_SCAN_GLOBAL,
	DF_SCAN_POST_ALLOC): New macros.
	(df_flow_dir, df_ref_type, df_ref_flags, df_alloc_function,
	df_free_bb_function, df_local_compute_function, df_init_function,
	df_dataflow_function, df_confluence_function_0,
	df_confluence_function_n, df_transfer_function,
	df_finalizer_function, df_free_function, df_dump_problem_function,
	df_problem, dataflow, df_insn_info, df_reg_info, df_ref, df_link,
	df_ref_info, df, df_map, df_scan_bb_info, df_ru_bb_info,
	df_ru_bb_info, df_rd_bb_info, df_lr_bb_info, df_ur_bb_info,
	df_urec_bb_info, ) New types.
	(df_invalidated_by_call, df_all_hard_regs, df_state) New public
	variables.
	(df_init, df_add_problem, df_set_blocks, df_finish, df_analyze,
	df_analyze_simple_change_some_blocks,
	df_analyze_simple_change_one_block, df_compact_blocks,
	df_bb_replace, df_bb_regno_last_use_find,
	df_bb_regno_first_def_find, df_bb_regno_last_def_find,
	df_insn_regno_def_p, df_find_def, df_find_use,
	df_iterative_dataflow, df_dump, df_chain_dump, df_refs_chain_dump,
	df_regs_chain_dump, df_insn_debug, df_insn_debug_regno,
	df_regno_debug, df_ref_debug, debug_df_insn, debug_df_regno,
	debug_df_reg, debug_df_defno, debug_df_useno, debug_df_ref,
	debug_df_chain, df_get_dependent_problem, df_chain_create,
	df_chain_unlink, df_chain_copy, df_get_live_in, df_get_live_out,
	df_grow_bb_info, df_chain_dump, df_print_bb_index,
	df_ru_add_problem, df_ru_get_bb_info, df_rd_add_problem,
	df_rd_get_bb_info, df_lr_add_problem, df_lr_get_bb_info,
	df_ur_add_problem, df_ur_get_bb_info, df_urec_add_problem,
	df_urec_get_bb_info, df_chain_add_problem, df_ri_add_problem,
	df_reg_lifetime, df_scan_get_bb_info, df_scan_add_problem,
	df_rescan_blocks, df_ref_create, df_get_artificial_defs,
	df_get_artificial_uses, df_reg_chain_create, df_reg_chain_unlink,
	df_ref_remove, df_insn_refs_delete, df_refs_delete,
	df_reorganize_refs, df_set_state, df_hard_reg_init,
	df_read_modify_subreg_p) New public functions.
        * df-core.c: The core dataflow solver and glue routines for rtl
	dataflow.
	(df_init, df_add_problem, df_set_blocks, df_finish,
	df_hybrid_search_forward, df_hybrid_search_backward,
	df_iterative_dataflow, df_prune_to_subcfg, df_analyze_problem,
	df_analyze, df_get_bb_info, df_set_bb_info, df_bb_replace,
	df_bb_regno_last_use_find, df_bb_regno_first_def_find,
	df_bb_regno_last_def_find, df_insn_regno_def_p, df_find_def,
	df_reg_defined, df_find_use, df_reg_used, df_dump,
	df_refs_chain_dump, df_regs_chain_dump, df_insn_debug,
	df_insn_debug_regno, df_regno_debug, df_ref_debug, debug_df_insn,
	debug_df_reg, debug_df_regno, debug_df_ref debug_df_defno,
	debug_df_useno, reset_df_after_reload): New functions.
	* df-scan.c: The scanning fuctions, once in df.c, completely
	rewritten so that they now fully model the functionality of
	register usage at the backend.
	(df_scan_free_internal, df_scan_get_bb_info, df_scan_set_bb_info,
	df_scan_free_bb_info, df_scan_alloc, df_scan_free, df_scan_dump,
	df_scan_add_problem, df_grow_reg_info, df_grow_ref_info,
	df_grow_insn_info, df_rescan_blocks, df_ref_create,
	df_get_artificial_defs, df_get_artificial_uses,
	df_reg_chain_create, df_ref_unlink, df_reg_chain_unlink,
	df_ref_remove, df_insn_create_insn_record, df_insn_refs_delete,
	df_refs_delete, df_reorganize_refs, df_set_state,
	df_ref_create_structure, df_ref_record, df_read_modify_subreg_p,
	df_def_record_1, df_defs_record, df_uses_record,
	df_insn_contains_asm_1, df_insn_contains_asm, df_insn_refs_record,
	df_has_eh_preds, df_bb_refs_record, df_refs_record, df_mark_reg,
	df_record_exit_block_uses, df_hard_reg_init): New functions.

	* df-problems.c: Seven concrete dataflow problems that use the
	scanning in df-scan.c and are solved by the engine in df-core.c.
	(df_get_dependent_problem, df_chain_create, df_chain_unlink,
	df_chain_copy, df_get_live_in, df_get_live_out, df_grow_bb_info,
	df_chain_dump, df_print_bb_index, df_ref_bitmap, df_set_seen,
	df_unset_seen, df_ru_get_bb_info, df_ru_set_bb_info,
	df_ru_free_bb_info, df_ru_alloc,
	df_ru_bb_local_compute_process_def,
	df_ru_bb_local_compute_process_use, df_ru_bb_local_compute,
	df_ru_local_compute, df_ru_init_solution, df_ru_confluence_n,
	df_ru_transfer_function, df_ru_free, df_ru_dump,
	df_ru_add_problem, df_rd_get_bb_info, df_rd_set_bb_info,
	df_rd_free_bb_info, df_rd_alloc,
	df_rd_bb_local_compute_process_def, df_rd_bb_local_compute,
	df_rd_local_compute, df_rd_init_solution, df_rd_confluence_n,
	df_rd_transfer_function, df_rd_free, df_rd_dump,
	df_rd_add_problem, df_lr_get_bb_info, df_lr_set_bb_info,
	df_lr_free_bb_info, df_lr_alloc, df_lr_bb_local_compute,
	df_lr_local_compute, df_lr_init, df_lr_confluence_0,
	df_lr_confluence_n, df_lr_transfer_function, df_lr_free,
	df_lr_dump, df_lr_add_problem, df_ur_get_bb_info,
	df_ur_set_bb_info, df_ur_free_bb_info, df_ur_alloc,
	df_ur_bb_local_compute, df_ur_local_compute, df_ur_init,
	df_ur_local_finalize, df_ur_confluence_n, df_ur_transfer_function,
	df_ur_free, df_ur_dump, df_ur_add_problem, df_urec_get_bb_info,
	df_urec_set_bb_info, df_urec_free_bb_info, df_urec_alloc,
	df_urec_mark_reg_change, df_urec_check_earlyclobber,
	df_urec_mark_reg_use_for_earlyclobber,
	df_urec_mark_reg_use_for_earlyclobber_1, df_urec_bb_local_compute,
	df_urec_local_compute, df_urec_init, df_urec_local_finalize,
	df_urec_confluence_n, df_urec_transfer_function, df_urec_free,
	df_urec_dump, df_urec_add_problem, df_chain_alloc,
	df_chain_create_bb_process_use, df_chain_create_bb,
	df_chain_finalize, df_chain_free, df_chains_dump,
	df_chain_add_problem, df_ri_alloc, df_ri_bb_compute,
	df_ri_compute, df_ri_free, df_ri_dump, df_ri_add_problem,
	df_reg_lifetime): New functions.
	* df.c: Deleted file.
        * ddg.c (create_ddg_dep_no_link, build_inter_loop_deps): Made code
	consistent with new df api.
        * modulo-sched.c (sms_schedule, rest_of_handle_sms,
        rest_of_handle_sms): Ditto.
        * web.c (unionfind_union, union_defs, entry_register, web_main):
	Ditto.
	* loop_invariant.c (invariant_for_use, hash_invariant_expr_1,
	invariant_expr_equal_p, find_defs, check_dependencies,
	find_invariant_insn, find_invariants_to_move, move_invariant_reg,
	free_inv_motion_data, move_loop_invariants): Ditto.
	* sched-deps.c (sched_analyze_1): Ditto.


Co-Authored-By: Kenneth Zadeck <zadeck@naturalbridge.com>

From-SVN: r109577
parent 243cdfa8
2005-01-11 Danny Berlin <dberlin@dberlin.org>
Kenneth Zadeck <zadeck@naturalbridge.com>
* df.h (DF_SCAN, DF_RU, DF_RD, DF_LR, DF_UR, DF_UREC, DF_CHAIN,
DF_RI, DF_LAST_PROBLEM_PLUS1, DF_DU_CHAIN, DF_UD_CHAIN,
DF_REF_TYPE_NAMES, DF_HARD_REGS, DF_EQUIV_NOTES, DF_SUBREGS,
DF_SCAN_BB_INFO, DF_RU_BB_INFO, DF_RD_BB_INFO, DF_LR_BB_INFO,
DF_UR_BB_INFO, DF_UREC_BB_INFO, DF_LIVE_IN, DF_LIVE_OUT,
DF_RA_LIVE_IN, DF_RA_LIVE_OUT, DF_UPWARD_LIVE_IN,
DF_UPWARD_LIVE_OUT, DF_REF_REAL_REG, DF_REF_REGNO,
DF_REF_REAL_LOC, DF_REF_REG, DF_REF_LOC, DF_REF_BB, DF_REF_BBNO,
DF_REF_INSN, DF_REF_INSN_UID, DF_REF_TYPE, DF_REF_CHAIN,
DF_REF_ID, DF_REF_FLAGS, DF_REF_NEXT_REG, DF_REF_PREV_REG,
DF_REF_NEXT_REF, DF_REF_DATA, DF_REF_REG_DEF_P, DF_REF_REG_USE_P,
DF_REF_REG_MEM_STORE_P, DF_REF_REG_MEM_LOAD_P, DF_REF_REG_MEM_P,
DF_DEFS_SIZE, DF_DEFS_GET, DF_DEFS_SET, DF_USES_SIZE, DF_USES_GET,
DF_USES_SET, DF_REG_SIZE, DF_REG_DEF_GET, DF_REG_DEF_SET,
DF_REG_USE_GET, DF_REG_USE_SET, DF_REGNO_FIRST_DEF,
DF_REGNO_LAST_USE, DF_INSN_SIZE, DF_INSN_GET, DF_INSN_SET,
DF_INSN_CONTAINS_ASM, DF_INSN_LUID, DF_INSN_DEFS, DF_INSN_USES,
DF_INSN_UID_GET, DF_INSN_UID_LUID, DF_INSN_UID_DEFS,
DF_INSN_UID_USES, DF_SCAN_INITIAL, DF_SCAN_GLOBAL,
DF_SCAN_POST_ALLOC): New macros.
(df_flow_dir, df_ref_type, df_ref_flags, df_alloc_function,
df_free_bb_function, df_local_compute_function, df_init_function,
df_dataflow_function, df_confluence_function_0,
df_confluence_function_n, df_transfer_function,
df_finalizer_function, df_free_function, df_dump_problem_function,
df_problem, dataflow, df_insn_info, df_reg_info, df_ref, df_link,
df_ref_info, df, df_map, df_scan_bb_info, df_ru_bb_info,
df_ru_bb_info, df_rd_bb_info, df_lr_bb_info, df_ur_bb_info,
df_urec_bb_info, ) New types.
(df_invalidated_by_call, df_all_hard_regs, df_state) New public
variables.
(df_init, df_add_problem, df_set_blocks, df_finish, df_analyze,
df_analyze_simple_change_some_blocks,
df_analyze_simple_change_one_block, df_compact_blocks,
df_bb_replace, df_bb_regno_last_use_find,
df_bb_regno_first_def_find, df_bb_regno_last_def_find,
df_insn_regno_def_p, df_find_def, df_find_use,
df_iterative_dataflow, df_dump, df_chain_dump, df_refs_chain_dump,
df_regs_chain_dump, df_insn_debug, df_insn_debug_regno,
df_regno_debug, df_ref_debug, debug_df_insn, debug_df_regno,
debug_df_reg, debug_df_defno, debug_df_useno, debug_df_ref,
debug_df_chain, df_get_dependent_problem, df_chain_create,
df_chain_unlink, df_chain_copy, df_get_live_in, df_get_live_out,
df_grow_bb_info, df_chain_dump, df_print_bb_index,
df_ru_add_problem, df_ru_get_bb_info, df_rd_add_problem,
df_rd_get_bb_info, df_lr_add_problem, df_lr_get_bb_info,
df_ur_add_problem, df_ur_get_bb_info, df_urec_add_problem,
df_urec_get_bb_info, df_chain_add_problem, df_ri_add_problem,
df_reg_lifetime, df_scan_get_bb_info, df_scan_add_problem,
df_rescan_blocks, df_ref_create, df_get_artificial_defs,
df_get_artificial_uses, df_reg_chain_create, df_reg_chain_unlink,
df_ref_remove, df_insn_refs_delete, df_refs_delete,
df_reorganize_refs, df_set_state, df_hard_reg_init,
df_read_modify_subreg_p) New public functions.
* df-core.c: The core dataflow solver and glue routines for rtl
dataflow.
(df_init, df_add_problem, df_set_blocks, df_finish,
df_hybrid_search_forward, df_hybrid_search_backward,
df_iterative_dataflow, df_prune_to_subcfg, df_analyze_problem,
df_analyze, df_get_bb_info, df_set_bb_info, df_bb_replace,
df_bb_regno_last_use_find, df_bb_regno_first_def_find,
df_bb_regno_last_def_find, df_insn_regno_def_p, df_find_def,
df_reg_defined, df_find_use, df_reg_used, df_dump,
df_refs_chain_dump, df_regs_chain_dump, df_insn_debug,
df_insn_debug_regno, df_regno_debug, df_ref_debug, debug_df_insn,
debug_df_reg, debug_df_regno, debug_df_ref debug_df_defno,
debug_df_useno, reset_df_after_reload): New functions.
* df-scan.c: The scanning fuctions, once in df.c, completely
rewritten so that they now fully model the functionality of
register usage at the backend.
(df_scan_free_internal, df_scan_get_bb_info, df_scan_set_bb_info,
df_scan_free_bb_info, df_scan_alloc, df_scan_free, df_scan_dump,
df_scan_add_problem, df_grow_reg_info, df_grow_ref_info,
df_grow_insn_info, df_rescan_blocks, df_ref_create,
df_get_artificial_defs, df_get_artificial_uses,
df_reg_chain_create, df_ref_unlink, df_reg_chain_unlink,
df_ref_remove, df_insn_create_insn_record, df_insn_refs_delete,
df_refs_delete, df_reorganize_refs, df_set_state,
df_ref_create_structure, df_ref_record, df_read_modify_subreg_p,
df_def_record_1, df_defs_record, df_uses_record,
df_insn_contains_asm_1, df_insn_contains_asm, df_insn_refs_record,
df_has_eh_preds, df_bb_refs_record, df_refs_record, df_mark_reg,
df_record_exit_block_uses, df_hard_reg_init): New functions.
* df-problems.c: Seven concrete dataflow problems that use the
scanning in df-scan.c and are solved by the engine in df-core.c.
(df_get_dependent_problem, df_chain_create, df_chain_unlink,
df_chain_copy, df_get_live_in, df_get_live_out, df_grow_bb_info,
df_chain_dump, df_print_bb_index, df_ref_bitmap, df_set_seen,
df_unset_seen, df_ru_get_bb_info, df_ru_set_bb_info,
df_ru_free_bb_info, df_ru_alloc,
df_ru_bb_local_compute_process_def,
df_ru_bb_local_compute_process_use, df_ru_bb_local_compute,
df_ru_local_compute, df_ru_init_solution, df_ru_confluence_n,
df_ru_transfer_function, df_ru_free, df_ru_dump,
df_ru_add_problem, df_rd_get_bb_info, df_rd_set_bb_info,
df_rd_free_bb_info, df_rd_alloc,
df_rd_bb_local_compute_process_def, df_rd_bb_local_compute,
df_rd_local_compute, df_rd_init_solution, df_rd_confluence_n,
df_rd_transfer_function, df_rd_free, df_rd_dump,
df_rd_add_problem, df_lr_get_bb_info, df_lr_set_bb_info,
df_lr_free_bb_info, df_lr_alloc, df_lr_bb_local_compute,
df_lr_local_compute, df_lr_init, df_lr_confluence_0,
df_lr_confluence_n, df_lr_transfer_function, df_lr_free,
df_lr_dump, df_lr_add_problem, df_ur_get_bb_info,
df_ur_set_bb_info, df_ur_free_bb_info, df_ur_alloc,
df_ur_bb_local_compute, df_ur_local_compute, df_ur_init,
df_ur_local_finalize, df_ur_confluence_n, df_ur_transfer_function,
df_ur_free, df_ur_dump, df_ur_add_problem, df_urec_get_bb_info,
df_urec_set_bb_info, df_urec_free_bb_info, df_urec_alloc,
df_urec_mark_reg_change, df_urec_check_earlyclobber,
df_urec_mark_reg_use_for_earlyclobber,
df_urec_mark_reg_use_for_earlyclobber_1, df_urec_bb_local_compute,
df_urec_local_compute, df_urec_init, df_urec_local_finalize,
df_urec_confluence_n, df_urec_transfer_function, df_urec_free,
df_urec_dump, df_urec_add_problem, df_chain_alloc,
df_chain_create_bb_process_use, df_chain_create_bb,
df_chain_finalize, df_chain_free, df_chains_dump,
df_chain_add_problem, df_ri_alloc, df_ri_bb_compute,
df_ri_compute, df_ri_free, df_ri_dump, df_ri_add_problem,
df_reg_lifetime): New functions.
* df.c: Deleted file.
* ddg.c (create_ddg_dep_no_link, build_inter_loop_deps): Made code
consistent with new df api.
* modulo-sched.c (sms_schedule, rest_of_handle_sms,
rest_of_handle_sms): Ditto.
* web.c (unionfind_union, union_defs, entry_register, web_main):
Ditto.
* loop_invariant.c (invariant_for_use, hash_invariant_expr_1,
invariant_expr_equal_p, find_defs, check_dependencies,
find_invariant_insn, find_invariants_to_move, move_invariant_reg,
free_inv_motion_data, move_loop_invariants): Ditto.
* sched-deps.c (sched_analyze_1): Ditto.
2006-01-11 Zdenek Dvorak <dvorakz@suse.cz> 2006-01-11 Zdenek Dvorak <dvorakz@suse.cz>
* tree-ssa-operands.c (get_expr_operands): Record addressable * tree-ssa-operands.c (get_expr_operands): Record addressable
......
...@@ -761,7 +761,7 @@ IPA_UTILS_H = ipa-utils.h $(TREE_H) $(CGRAPH_H) ...@@ -761,7 +761,7 @@ IPA_UTILS_H = ipa-utils.h $(TREE_H) $(CGRAPH_H)
IPA_REFERENCE_H = ipa-reference.h bitmap.h $(TREE_H) IPA_REFERENCE_H = ipa-reference.h bitmap.h $(TREE_H)
IPA_TYPE_ESCAPE_H = ipa-type-escape.h $(TREE_H) IPA_TYPE_ESCAPE_H = ipa-type-escape.h $(TREE_H)
CGRAPH_H = cgraph.h $(TREE_H) CGRAPH_H = cgraph.h $(TREE_H)
DF_H = df.h bitmap.h sbitmap.h $(BASIC_BLOCK_H) DF_H = df.h bitmap.h $(BASIC_BLOCK_H) alloc-pool.h
DDG_H = ddg.h sbitmap.h $(DF_H) DDG_H = ddg.h sbitmap.h $(DF_H)
GCC_H = gcc.h version.h GCC_H = gcc.h version.h
GGC_H = ggc.h gtype-desc.h GGC_H = ggc.h gtype-desc.h
...@@ -973,7 +973,8 @@ OBJS-common = \ ...@@ -973,7 +973,8 @@ OBJS-common = \
cfgloopanal.o cfgloopmanip.o loop-init.o loop-unswitch.o loop-unroll.o \ cfgloopanal.o cfgloopmanip.o loop-init.o loop-unswitch.o loop-unroll.o \
cfgrtl.o combine.o conflict.o convert.o coverage.o cse.o cselib.o \ cfgrtl.o combine.o conflict.o convert.o coverage.o cse.o cselib.o \
dbxout.o ddg.o tree-ssa-loop-ch.o loop-invariant.o tree-ssa-loop-im.o \ dbxout.o ddg.o tree-ssa-loop-ch.o loop-invariant.o tree-ssa-loop-im.o \
debug.o df.o dfp.o diagnostic.o dojump.o dominance.o loop-doloop.o \ debug.o df-core.o df-problems.o odf.o df-scan.o dfp.o diagnostic.o dojump.o \
dominance.o loop-doloop.o \
dwarf2asm.o dwarf2out.o emit-rtl.o except.o explow.o loop-iv.o \ dwarf2asm.o dwarf2out.o emit-rtl.o except.o explow.o loop-iv.o \
expmed.o expr.o final.o flow.o fold-const.o function.o gcse.o \ expmed.o expr.o final.o flow.o fold-const.o function.o gcse.o \
genrtl.o ggc-common.o global.o graph.o gtype-desc.o \ genrtl.o ggc-common.o global.o graph.o gtype-desc.o \
...@@ -2301,9 +2302,22 @@ tree-vect-generic.o : tree-vect-generic.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \ ...@@ -2301,9 +2302,22 @@ tree-vect-generic.o : tree-vect-generic.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(FLAGS_H) $(OPTABS_H) $(RTL_H) $(MACHMODE_H) $(EXPR_H) \ $(FLAGS_H) $(OPTABS_H) $(RTL_H) $(MACHMODE_H) $(EXPR_H) \
langhooks.h $(FLAGS_H) $(DIAGNOSTIC_H) gt-tree-vect-generic.h $(GGC_H) \ langhooks.h $(FLAGS_H) $(DIAGNOSTIC_H) gt-tree-vect-generic.h $(GGC_H) \
coretypes.h insn-codes.h coretypes.h insn-codes.h
df.o : df.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ df-core.o : df-core.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
insn-config.h $(RECOG_H) function.h $(REGS_H) alloc-pool.h hard-reg-set.h \ insn-config.h $(RECOG_H) $(FUNCTION_H) $(REGS_H) alloc-pool.h \
$(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h $(TM_P_H) hard-reg-set.h $(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h \
$(TM_P_H) $(FLAGS_H) output.h tree-pass.h
df-problems.o : df-problems.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) insn-config.h $(RECOG_H) $(FUNCTION_H) $(REGS_H) alloc-pool.h \
hard-reg-set.h $(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h $(TM_P_H) \
$(FLAGS_H) output.h
odf.o : odf.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
insn-config.h $(RECOG_H) $(FUNCTION_H) $(REGS_H) alloc-pool.h hard-reg-set.h \
$(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h $(TM_P_H) $(FLAGS_H) \
output.h
df-scan.o : df-scan.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
insn-config.h $(RECOG_H) $(FUNCTION_H) $(REGS_H) alloc-pool.h hard-reg-set.h \
$(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h $(TM_P_H) $(FLAGS_H) \
output.h
var-tracking.o : var-tracking.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ var-tracking.o : var-tracking.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(TREE_H) hard-reg-set.h insn-config.h reload.h $(FLAGS_H) \ $(RTL_H) $(TREE_H) hard-reg-set.h insn-config.h reload.h $(FLAGS_H) \
$(BASIC_BLOCK_H) output.h sbitmap.h alloc-pool.h $(FIBHEAP_H) $(HASHTAB_H) \ $(BASIC_BLOCK_H) output.h sbitmap.h alloc-pool.h $(FIBHEAP_H) $(HASHTAB_H) \
......
/* DDG - Data Dependence Graph implementation. /* DDG - Data Dependence Graph implementation.
Copyright (C) 2004, 2005 Copyright (C) 2004, 2005, 2006
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Ayal Zaks and Mustafa Hagog <zaks,mustafa@il.ibm.com> Contributed by Ayal Zaks and Mustafa Hagog <zaks,mustafa@il.ibm.com>
...@@ -222,10 +222,10 @@ create_ddg_dep_no_link (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to, ...@@ -222,10 +222,10 @@ create_ddg_dep_no_link (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to,
for all its uses in the next iteration, and an output dependence to the for all its uses in the next iteration, and an output dependence to the
first def of the next iteration. */ first def of the next iteration. */
static void static void
add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd) add_deps_for_def (ddg_ptr g, struct df *df, struct df_ref *rd)
{ {
int regno = DF_REF_REGNO (rd); int regno = DF_REF_REGNO (rd);
struct bb_info *bb_info = DF_BB_INFO (df, g->bb); struct df_rd_bb_info *bb_info = DF_RD_BB_INFO (df, g->bb);
struct df_link *r_use; struct df_link *r_use;
int use_before_def = false; int use_before_def = false;
rtx def_insn = DF_REF_INSN (rd); rtx def_insn = DF_REF_INSN (rd);
...@@ -235,7 +235,7 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd) ...@@ -235,7 +235,7 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd)
that is upwards exposed in RD's block. */ that is upwards exposed in RD's block. */
for (r_use = DF_REF_CHAIN (rd); r_use != NULL; r_use = r_use->next) for (r_use = DF_REF_CHAIN (rd); r_use != NULL; r_use = r_use->next)
{ {
if (bitmap_bit_p (bb_info->ru_gen, r_use->ref->id)) if (bitmap_bit_p (bb_info->gen, r_use->ref->id))
{ {
rtx use_insn = DF_REF_INSN (r_use->ref); rtx use_insn = DF_REF_INSN (r_use->ref);
ddg_node_ptr dest_node = get_node_of_insn (g, use_insn); ddg_node_ptr dest_node = get_node_of_insn (g, use_insn);
...@@ -257,7 +257,7 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd) ...@@ -257,7 +257,7 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd)
there is a use between the two defs. */ there is a use between the two defs. */
if (! use_before_def) if (! use_before_def)
{ {
struct ref *def = df_bb_regno_first_def_find (df, g->bb, regno); struct df_ref *def = df_bb_regno_first_def_find (df, g->bb, regno);
int i; int i;
ddg_node_ptr dest_node; ddg_node_ptr dest_node;
...@@ -266,7 +266,7 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd) ...@@ -266,7 +266,7 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd)
/* Check if there are uses after RD. */ /* Check if there are uses after RD. */
for (i = src_node->cuid + 1; i < g->num_nodes; i++) for (i = src_node->cuid + 1; i < g->num_nodes; i++)
if (df_reg_used (df, g->nodes[i].insn, rd->reg)) if (df_find_use (df, g->nodes[i].insn, rd->reg))
return; return;
dest_node = get_node_of_insn (g, def->insn); dest_node = get_node_of_insn (g, def->insn);
...@@ -278,16 +278,16 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd) ...@@ -278,16 +278,16 @@ add_deps_for_def (ddg_ptr g, struct df *df, struct ref *rd)
(nearest BLOCK_BEGIN) def of the next iteration, unless USE is followed (nearest BLOCK_BEGIN) def of the next iteration, unless USE is followed
by a def in the block. */ by a def in the block. */
static void static void
add_deps_for_use (ddg_ptr g, struct df *df, struct ref *use) add_deps_for_use (ddg_ptr g, struct df *df, struct df_ref *use)
{ {
int i; int i;
int regno = DF_REF_REGNO (use); int regno = DF_REF_REGNO (use);
struct ref *first_def = df_bb_regno_first_def_find (df, g->bb, regno); struct df_ref *first_def = df_bb_regno_first_def_find (df, g->bb, regno);
ddg_node_ptr use_node; ddg_node_ptr use_node;
ddg_node_ptr def_node; ddg_node_ptr def_node;
struct bb_info *bb_info; struct df_rd_bb_info *bb_info;
bb_info = DF_BB_INFO (df, g->bb); bb_info = DF_RD_BB_INFO (df, g->bb);
if (!first_def) if (!first_def)
return; return;
...@@ -304,7 +304,7 @@ add_deps_for_use (ddg_ptr g, struct df *df, struct ref *use) ...@@ -304,7 +304,7 @@ add_deps_for_use (ddg_ptr g, struct df *df, struct ref *use)
/* We must not add ANTI dep when there is an intra-loop TRUE dep in /* We must not add ANTI dep when there is an intra-loop TRUE dep in
the opposite direction. If the first_def reaches the USE then there is the opposite direction. If the first_def reaches the USE then there is
such a dep. */ such a dep. */
if (! bitmap_bit_p (bb_info->rd_gen, first_def->id)) if (! bitmap_bit_p (bb_info->gen, first_def->id))
create_ddg_dep_no_link (g, use_node, def_node, ANTI_DEP, REG_DEP, 1); create_ddg_dep_no_link (g, use_node, def_node, ANTI_DEP, REG_DEP, 1);
} }
...@@ -313,25 +313,28 @@ static void ...@@ -313,25 +313,28 @@ static void
build_inter_loop_deps (ddg_ptr g, struct df *df) build_inter_loop_deps (ddg_ptr g, struct df *df)
{ {
unsigned rd_num, u_num; unsigned rd_num, u_num;
struct bb_info *bb_info; struct df_rd_bb_info *rd_bb_info;
struct df_ru_bb_info *ru_bb_info;
bitmap_iterator bi; bitmap_iterator bi;
bb_info = DF_BB_INFO (df, g->bb); rd_bb_info = DF_RD_BB_INFO (df, g->bb);
/* Find inter-loop output and true deps by connecting downward exposed defs /* Find inter-loop output and true deps by connecting downward exposed defs
to the first def of the BB and to upwards exposed uses. */ to the first def of the BB and to upwards exposed uses. */
EXECUTE_IF_SET_IN_BITMAP (bb_info->rd_gen, 0, rd_num, bi) EXECUTE_IF_SET_IN_BITMAP (rd_bb_info->gen, 0, rd_num, bi)
{ {
struct ref *rd = df->defs[rd_num]; struct df_ref *rd = DF_DEFS_GET (df, rd_num);
add_deps_for_def (g, df, rd); add_deps_for_def (g, df, rd);
} }
ru_bb_info = DF_RU_BB_INFO (df, g->bb);
/* Find inter-loop anti deps. We are interested in uses of the block that /* Find inter-loop anti deps. We are interested in uses of the block that
appear below all defs; this implies that these uses are killed. */ appear below all defs; this implies that these uses are killed. */
EXECUTE_IF_SET_IN_BITMAP (bb_info->ru_kill, 0, u_num, bi) EXECUTE_IF_SET_IN_BITMAP (ru_bb_info->kill, 0, u_num, bi)
{ {
struct ref *use = df->uses[u_num]; struct df_ref *use = DF_USES_GET (df, u_num);
/* We are interested in uses of this BB. */ /* We are interested in uses of this BB. */
if (BLOCK_FOR_INSN (use->insn) == g->bb) if (BLOCK_FOR_INSN (use->insn) == g->bb)
......
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This source diff could not be displayed because it is too large. You can view the blob instead.
/* RTL-level loop invariant motion. /* RTL-level loop invariant motion.
Copyright (C) 2004, 2005 Free Software Foundation, Inc. Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -153,7 +153,7 @@ static VEC(invariant_p,heap) *invariants; ...@@ -153,7 +153,7 @@ static VEC(invariant_p,heap) *invariants;
/* The dataflow object. */ /* The dataflow object. */
static struct df *df; static struct df *df = NULL;
/* Test for possibility of invariantness of X. */ /* Test for possibility of invariantness of X. */
...@@ -226,10 +226,10 @@ check_maybe_invariant (rtx x) ...@@ -226,10 +226,10 @@ check_maybe_invariant (rtx x)
invariant. */ invariant. */
static struct invariant * static struct invariant *
invariant_for_use (struct ref *use) invariant_for_use (struct df_ref *use)
{ {
struct df_link *defs; struct df_link *defs;
struct ref *def; struct df_ref *def;
basic_block bb = BLOCK_FOR_INSN (use->insn), def_bb; basic_block bb = BLOCK_FOR_INSN (use->insn), def_bb;
defs = DF_REF_CHAIN (use); defs = DF_REF_CHAIN (use);
...@@ -255,7 +255,7 @@ hash_invariant_expr_1 (rtx insn, rtx x) ...@@ -255,7 +255,7 @@ hash_invariant_expr_1 (rtx insn, rtx x)
const char *fmt; const char *fmt;
hashval_t val = code; hashval_t val = code;
int do_not_record_p; int do_not_record_p;
struct ref *use; struct df_ref *use;
struct invariant *inv; struct invariant *inv;
switch (code) switch (code)
...@@ -306,7 +306,7 @@ invariant_expr_equal_p (rtx insn1, rtx e1, rtx insn2, rtx e2) ...@@ -306,7 +306,7 @@ invariant_expr_equal_p (rtx insn1, rtx e1, rtx insn2, rtx e2)
enum rtx_code code = GET_CODE (e1); enum rtx_code code = GET_CODE (e1);
int i, j; int i, j;
const char *fmt; const char *fmt;
struct ref *use1, *use2; struct df_ref *use1, *use2;
struct invariant *inv1 = NULL, *inv2 = NULL; struct invariant *inv1 = NULL, *inv2 = NULL;
rtx sub1, sub2; rtx sub1, sub2;
...@@ -600,7 +600,8 @@ find_defs (struct loop *loop, basic_block *body) ...@@ -600,7 +600,8 @@ find_defs (struct loop *loop, basic_block *body)
for (i = 0; i < loop->num_nodes; i++) for (i = 0; i < loop->num_nodes; i++)
bitmap_set_bit (blocks, body[i]->index); bitmap_set_bit (blocks, body[i]->index);
df_analyze_subcfg (df, blocks, DF_UD_CHAIN | DF_HARD_REGS | DF_EQUIV_NOTES); df_set_blocks (df, blocks);
df_analyze (df);
BITMAP_FREE (blocks); BITMAP_FREE (blocks);
} }
...@@ -673,16 +674,14 @@ record_use (struct def *def, rtx *use, rtx insn) ...@@ -673,16 +674,14 @@ record_use (struct def *def, rtx *use, rtx insn)
static bool static bool
check_dependencies (rtx insn, bitmap depends_on) check_dependencies (rtx insn, bitmap depends_on)
{ {
struct df_link *uses, *defs; struct df_link *defs;
struct ref *use, *def; struct df_ref *use, *def;
basic_block bb = BLOCK_FOR_INSN (insn), def_bb; basic_block bb = BLOCK_FOR_INSN (insn), def_bb;
struct def *def_data; struct def *def_data;
struct invariant *inv; struct invariant *inv;
for (uses = DF_INSN_USES (df, insn); uses; uses = uses->next) for (use = DF_INSN_GET (df, insn)->uses; use; use = use->next_ref)
{ {
use = uses->ref;
defs = DF_REF_CHAIN (use); defs = DF_REF_CHAIN (use);
if (!defs) if (!defs)
continue; continue;
...@@ -718,7 +717,7 @@ check_dependencies (rtx insn, bitmap depends_on) ...@@ -718,7 +717,7 @@ check_dependencies (rtx insn, bitmap depends_on)
static void static void
find_invariant_insn (rtx insn, bool always_reached, bool always_executed) find_invariant_insn (rtx insn, bool always_reached, bool always_executed)
{ {
struct ref *ref; struct df_ref *ref;
struct def *def; struct def *def;
bitmap depends_on; bitmap depends_on;
rtx set, dest; rtx set, dest;
...@@ -781,13 +780,11 @@ find_invariant_insn (rtx insn, bool always_reached, bool always_executed) ...@@ -781,13 +780,11 @@ find_invariant_insn (rtx insn, bool always_reached, bool always_executed)
static void static void
record_uses (rtx insn) record_uses (rtx insn)
{ {
struct df_link *uses; struct df_ref *use;
struct ref *use;
struct invariant *inv; struct invariant *inv;
for (uses = DF_INSN_USES (df, insn); uses; uses = uses->next) for (use = DF_INSN_GET (df, insn)->uses; use; use = use->next_ref)
{ {
use = uses->ref;
inv = invariant_for_use (use); inv = invariant_for_use (use);
if (inv) if (inv)
record_use (inv->def, DF_REF_LOC (use), DF_REF_INSN (use)); record_use (inv->def, DF_REF_LOC (use), DF_REF_INSN (use));
...@@ -1025,6 +1022,7 @@ find_invariants_to_move (void) ...@@ -1025,6 +1022,7 @@ find_invariants_to_move (void)
{ {
unsigned i, regs_used, n_inv_uses, regs_needed = 0, new_regs; unsigned i, regs_used, n_inv_uses, regs_needed = 0, new_regs;
struct invariant *inv = NULL; struct invariant *inv = NULL;
unsigned int n_regs = DF_REG_SIZE (df);
if (!VEC_length (invariant_p, invariants)) if (!VEC_length (invariant_p, invariants))
return; return;
...@@ -1037,7 +1035,7 @@ find_invariants_to_move (void) ...@@ -1037,7 +1035,7 @@ find_invariants_to_move (void)
here to stand for induction variables etc. that we do not detect. */ here to stand for induction variables etc. that we do not detect. */
regs_used = 2; regs_used = 2;
for (i = 0; i < df->n_regs; i++) for (i = 0; i < n_regs; i++)
{ {
if (!DF_REGNO_FIRST_DEF (df, i) && DF_REGNO_LAST_USE (df, i)) if (!DF_REGNO_FIRST_DEF (df, i) && DF_REGNO_LAST_USE (df, i))
{ {
...@@ -1098,8 +1096,7 @@ move_invariant_reg (struct loop *loop, unsigned invno) ...@@ -1098,8 +1096,7 @@ move_invariant_reg (struct loop *loop, unsigned invno)
need to create a temporary register. */ need to create a temporary register. */
set = single_set (inv->insn); set = single_set (inv->insn);
reg = gen_reg_rtx (GET_MODE (SET_DEST (set))); reg = gen_reg_rtx (GET_MODE (SET_DEST (set)));
df_pattern_emit_after (df, gen_move_insn (SET_DEST (set), reg), emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
BLOCK_FOR_INSN (inv->insn), inv->insn);
/* If the SET_DEST of the invariant insn is a reg, we can just move /* If the SET_DEST of the invariant insn is a reg, we can just move
the insn out of the loop. Otherwise, we have to use gen_move_insn the insn out of the loop. Otherwise, we have to use gen_move_insn
...@@ -1108,13 +1105,11 @@ move_invariant_reg (struct loop *loop, unsigned invno) ...@@ -1108,13 +1105,11 @@ move_invariant_reg (struct loop *loop, unsigned invno)
{ {
SET_DEST (set) = reg; SET_DEST (set) = reg;
reorder_insns (inv->insn, inv->insn, BB_END (preheader)); reorder_insns (inv->insn, inv->insn, BB_END (preheader));
df_insn_modify (df, preheader, inv->insn);
} }
else else
{ {
df_pattern_emit_after (df, gen_move_insn (reg, SET_SRC (set)), emit_insn_after (gen_move_insn (reg, SET_SRC (set)), BB_END (preheader));
preheader, BB_END (preheader)); delete_insn (inv->insn);
df_insn_delete (df, BLOCK_FOR_INSN (inv->insn), inv->insn);
} }
} }
else else
...@@ -1122,9 +1117,8 @@ move_invariant_reg (struct loop *loop, unsigned invno) ...@@ -1122,9 +1117,8 @@ move_invariant_reg (struct loop *loop, unsigned invno)
move_invariant_reg (loop, repr->invno); move_invariant_reg (loop, repr->invno);
reg = repr->reg; reg = repr->reg;
set = single_set (inv->insn); set = single_set (inv->insn);
df_pattern_emit_after (df, gen_move_insn (SET_DEST (set), reg), emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
BLOCK_FOR_INSN (inv->insn), inv->insn); delete_insn (inv->insn);
df_insn_delete (df, BLOCK_FOR_INSN (inv->insn), inv->insn);
} }
inv->reg = reg; inv->reg = reg;
...@@ -1135,10 +1129,7 @@ move_invariant_reg (struct loop *loop, unsigned invno) ...@@ -1135,10 +1129,7 @@ move_invariant_reg (struct loop *loop, unsigned invno)
if (inv->def) if (inv->def)
{ {
for (use = inv->def->uses; use; use = use->next) for (use = inv->def->uses; use; use = use->next)
{ *use->pos = reg;
*use->pos = reg;
df_insn_modify (df, BLOCK_FOR_INSN (use->insn), use->insn);
}
} }
} }
...@@ -1174,20 +1165,22 @@ free_inv_motion_data (void) ...@@ -1174,20 +1165,22 @@ free_inv_motion_data (void)
struct def *def; struct def *def;
struct invariant *inv; struct invariant *inv;
for (i = 0; i < df->n_defs; i++) for (i = 0; i < DF_DEFS_SIZE (df); i++)
{ {
if (!df->defs[i]) struct df_ref * ref = DF_DEFS_GET (df, i);
if (!ref)
continue; continue;
inv = DF_REF_DATA (df->defs[i]); inv = DF_REF_DATA (ref);
if (!inv) if (!inv)
continue; continue;
def = inv->def; def = inv->def;
gcc_assert (def != NULL); gcc_assert (def != NULL);
free_use_list (def->uses); free_use_list (def->uses);
free (def); free (def);
DF_REF_DATA (df->defs[i]) = NULL; DF_REF_DATA (ref) = NULL;
} }
for (i = 0; VEC_iterate (invariant_p, invariants, i, inv); i++) for (i = 0; VEC_iterate (invariant_p, invariants, i, inv); i++)
...@@ -1231,8 +1224,9 @@ move_loop_invariants (struct loops *loops) ...@@ -1231,8 +1224,9 @@ move_loop_invariants (struct loops *loops)
struct loop *loop; struct loop *loop;
unsigned i; unsigned i;
df = df_init (); df = df_init (DF_HARD_REGS | DF_EQUIV_NOTES);
df_chain_add_problem (df, DF_UD_CHAIN);
/* Process the loops, innermost first. */ /* Process the loops, innermost first. */
loop = loops->tree_root; loop = loops->tree_root;
while (loop->inner) while (loop->inner)
......
/* Swing Modulo Scheduling implementation. /* Swing Modulo Scheduling implementation.
Copyright (C) 2004, 2005 Copyright (C) 2004, 2005, 2006
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Ayal Zaks and Mustafa Hagog <zaks,mustafa@il.ibm.com> Contributed by Ayal Zaks and Mustafa Hagog <zaks,mustafa@il.ibm.com>
...@@ -976,8 +976,11 @@ sms_schedule (FILE *dump_file) ...@@ -976,8 +976,11 @@ sms_schedule (FILE *dump_file)
sched_init (NULL); sched_init (NULL);
/* Init Data Flow analysis, to be used in interloop dep calculation. */ /* Init Data Flow analysis, to be used in interloop dep calculation. */
df = df_init (); df = df_init (DF_HARD_REGS | DF_EQUIV_NOTES | DF_SUBREGS);
df_analyze (df, 0, DF_ALL); df_rd_add_problem (df);
df_ru_add_problem (df);
df_chain_add_problem (df, DF_DU_CHAIN | DF_UD_CHAIN);
df_analyze (df);
/* Allocate memory to hold the DDG array one entry for each loop. /* Allocate memory to hold the DDG array one entry for each loop.
We use loop->num as index into this array. */ We use loop->num as index into this array. */
...@@ -1091,6 +1094,7 @@ sms_schedule (FILE *dump_file) ...@@ -1091,6 +1094,7 @@ sms_schedule (FILE *dump_file)
/* Release Data Flow analysis data structures. */ /* Release Data Flow analysis data structures. */
df_finish (df); df_finish (df);
df = NULL;
/* We don't want to perform SMS on new loops - created by versioning. */ /* We don't want to perform SMS on new loops - created by versioning. */
num_loops = loops->num; num_loops = loops->num;
...@@ -2536,7 +2540,6 @@ rest_of_handle_sms (void) ...@@ -2536,7 +2540,6 @@ rest_of_handle_sms (void)
{ {
#ifdef INSN_SCHEDULING #ifdef INSN_SCHEDULING
basic_block bb; basic_block bb;
sbitmap blocks;
/* We want to be able to create new pseudos. */ /* We want to be able to create new pseudos. */
no_new_pseudos = 0; no_new_pseudos = 0;
...@@ -2547,9 +2550,7 @@ rest_of_handle_sms (void) ...@@ -2547,9 +2550,7 @@ rest_of_handle_sms (void)
/* Update the life information, because we add pseudos. */ /* Update the life information, because we add pseudos. */
max_regno = max_reg_num (); max_regno = max_reg_num ();
allocate_reg_info (max_regno, FALSE, FALSE); allocate_reg_info (max_regno, FALSE, FALSE);
blocks = sbitmap_alloc (last_basic_block); update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
sbitmap_ones (blocks);
update_life_info (blocks, UPDATE_LIFE_GLOBAL_RM_NOTES,
(PROP_DEATH_NOTES (PROP_DEATH_NOTES
| PROP_REG_INFO | PROP_REG_INFO
| PROP_KILL_DEAD_CODE | PROP_KILL_DEAD_CODE
......
/* Instruction scheduling pass. This file computes dependencies between /* Instruction scheduling pass. This file computes dependencies between
instructions. instructions.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by, Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
and currently maintained by, Jim Wilson (wilson@cygnus.com) and currently maintained by, Jim Wilson (wilson@cygnus.com)
...@@ -520,7 +521,7 @@ sched_analyze_1 (struct deps *deps, rtx x, rtx insn) ...@@ -520,7 +521,7 @@ sched_analyze_1 (struct deps *deps, rtx x, rtx insn)
{ {
if (GET_CODE (dest) == STRICT_LOW_PART if (GET_CODE (dest) == STRICT_LOW_PART
|| GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == ZERO_EXTRACT
|| read_modify_subreg_p (dest)) || df_read_modify_subreg_p (dest))
{ {
/* These both read and modify the result. We must handle /* These both read and modify the result. We must handle
them as writes to get proper dependencies for following them as writes to get proper dependencies for following
......
/* Web construction code for GNU compiler. /* Web construction code for GNU compiler.
Contributed by Jan Hubicka. Contributed by Jan Hubicka.
Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. Copyright (C) 2001, 2002, 2004, 2006
Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -71,10 +72,10 @@ struct web_entry ...@@ -71,10 +72,10 @@ struct web_entry
static struct web_entry *unionfind_root (struct web_entry *); static struct web_entry *unionfind_root (struct web_entry *);
static void unionfind_union (struct web_entry *, struct web_entry *); static void unionfind_union (struct web_entry *, struct web_entry *);
static void union_defs (struct df *, struct ref *, struct web_entry *, static void union_defs (struct df *, struct df_ref *, struct web_entry *,
struct web_entry *); struct web_entry *);
static rtx entry_register (struct web_entry *, struct ref *, char *); static rtx entry_register (struct web_entry *, struct df_ref *, char *);
static void replace_ref (struct ref *, rtx); static void replace_ref (struct df_ref *, rtx);
/* Find the root of unionfind tree (the representative of set). */ /* Find the root of unionfind tree (the representative of set). */
...@@ -110,13 +111,13 @@ unionfind_union (struct web_entry *first, struct web_entry *second) ...@@ -110,13 +111,13 @@ unionfind_union (struct web_entry *first, struct web_entry *second)
register, union them. */ register, union them. */
static void static void
union_defs (struct df *df, struct ref *use, struct web_entry *def_entry, union_defs (struct df *df, struct df_ref *use, struct web_entry *def_entry,
struct web_entry *use_entry) struct web_entry *use_entry)
{ {
rtx insn = DF_REF_INSN (use); rtx insn = DF_REF_INSN (use);
struct df_link *link = DF_REF_CHAIN (use); struct df_link *link = DF_REF_CHAIN (use);
struct df_link *use_link = DF_INSN_USES (df, insn); struct df_ref *use_link = DF_INSN_USES (df, insn);
struct df_link *def_link = DF_INSN_DEFS (df, insn); struct df_ref *def_link = DF_INSN_DEFS (df, insn);
rtx set = single_set (insn); rtx set = single_set (insn);
/* Some instructions may use match_dup for their operands. In case the /* Some instructions may use match_dup for their operands. In case the
...@@ -126,11 +127,11 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry, ...@@ -126,11 +127,11 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry,
while (use_link) while (use_link)
{ {
if (use != use_link->ref if (use != use_link
&& DF_REF_REAL_REG (use) == DF_REF_REAL_REG (use_link->ref)) && DF_REF_REAL_REG (use) == DF_REF_REAL_REG (use_link))
unionfind_union (use_entry + DF_REF_ID (use), unionfind_union (use_entry + DF_REF_ID (use),
use_entry + DF_REF_ID (use_link->ref)); use_entry + DF_REF_ID (use_link));
use_link = use_link->next; use_link = use_link->next_ref;
} }
/* Recognize trivial noop moves and attempt to keep them as noop. /* Recognize trivial noop moves and attempt to keep them as noop.
...@@ -143,10 +144,10 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry, ...@@ -143,10 +144,10 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry,
{ {
while (def_link) while (def_link)
{ {
if (DF_REF_REAL_REG (use) == DF_REF_REAL_REG (def_link->ref)) if (DF_REF_REAL_REG (use) == DF_REF_REAL_REG (def_link))
unionfind_union (use_entry + DF_REF_ID (use), unionfind_union (use_entry + DF_REF_ID (use),
def_entry + DF_REF_ID (def_link->ref)); def_entry + DF_REF_ID (def_link));
def_link = def_link->next; def_link = def_link->next_ref;
} }
} }
while (link) while (link)
...@@ -160,14 +161,14 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry, ...@@ -160,14 +161,14 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry,
register. Find it and union. */ register. Find it and union. */
if (use->flags & DF_REF_READ_WRITE) if (use->flags & DF_REF_READ_WRITE)
{ {
struct df_link *link = DF_INSN_DEFS (df, DF_REF_INSN (use)); struct df_ref *link = DF_INSN_DEFS (df, DF_REF_INSN (use));
while (link) while (link)
{ {
if (DF_REF_REAL_REG (link->ref) == DF_REF_REAL_REG (use)) if (DF_REF_REAL_REG (link) == DF_REF_REAL_REG (use))
unionfind_union (use_entry + DF_REF_ID (use), unionfind_union (use_entry + DF_REF_ID (use),
def_entry + DF_REF_ID (link->ref)); def_entry + DF_REF_ID (link));
link = link->next; link = link->next_ref;
} }
} }
} }
...@@ -175,7 +176,7 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry, ...@@ -175,7 +176,7 @@ union_defs (struct df *df, struct ref *use, struct web_entry *def_entry,
/* Find the corresponding register for the given entry. */ /* Find the corresponding register for the given entry. */
static rtx static rtx
entry_register (struct web_entry *entry, struct ref *ref, char *used) entry_register (struct web_entry *entry, struct df_ref *ref, char *used)
{ {
struct web_entry *root; struct web_entry *root;
rtx reg, newreg; rtx reg, newreg;
...@@ -217,7 +218,7 @@ entry_register (struct web_entry *entry, struct ref *ref, char *used) ...@@ -217,7 +218,7 @@ entry_register (struct web_entry *entry, struct ref *ref, char *used)
/* Replace the reference by REG. */ /* Replace the reference by REG. */
static void static void
replace_ref (struct ref *ref, rtx reg) replace_ref (struct df_ref *ref, rtx reg)
{ {
rtx oldreg = DF_REF_REAL_REG (ref); rtx oldreg = DF_REF_REAL_REG (ref);
rtx *loc = DF_REF_REAL_LOC (ref); rtx *loc = DF_REF_REAL_LOC (ref);
...@@ -242,28 +243,31 @@ web_main (void) ...@@ -242,28 +243,31 @@ web_main (void)
int max = max_reg_num (); int max = max_reg_num ();
char *used; char *used;
df = df_init (); df = df_init (DF_EQUIV_NOTES);
df_analyze (df, 0, DF_UD_CHAIN | DF_EQUIV_NOTES); df_chain_add_problem (df, DF_UD_CHAIN);
df_analyze (df);
df_reorganize_refs (&df->def_info);
df_reorganize_refs (&df->use_info);
def_entry = xcalloc (df->n_defs, sizeof (struct web_entry)); def_entry = xcalloc (DF_DEFS_SIZE (df), sizeof (struct web_entry));
use_entry = xcalloc (df->n_uses, sizeof (struct web_entry)); use_entry = xcalloc (DF_USES_SIZE (df), sizeof (struct web_entry));
used = xcalloc (max, sizeof (char)); used = xcalloc (max, sizeof (char));
if (dump_file) if (dump_file)
df_dump (df, DF_UD_CHAIN | DF_DU_CHAIN, dump_file); df_dump (df, dump_file);
/* Produce the web. */ /* Produce the web. */
for (i = 0; i < df->n_uses; i++) for (i = 0; i < DF_USES_SIZE (df); i++)
union_defs (df, df->uses[i], def_entry, use_entry); union_defs (df, DF_USES_GET (df, i), def_entry, use_entry);
/* Update the instruction stream, allocating new registers for split pseudos /* Update the instruction stream, allocating new registers for split pseudos
in progress. */ in progress. */
for (i = 0; i < df->n_uses; i++) for (i = 0; i < DF_USES_SIZE (df); i++)
replace_ref (df->uses[i], entry_register (use_entry + i, df->uses[i], replace_ref (DF_USES_GET (df, i),
used)); entry_register (use_entry + i, DF_USES_GET (df, i), used));
for (i = 0; i < df->n_defs; i++) for (i = 0; i < DF_DEFS_SIZE (df); i++)
replace_ref (df->defs[i], entry_register (def_entry + i, df->defs[i], replace_ref (DF_DEFS_GET (df, i),
used)); entry_register (def_entry + i, DF_DEFS_GET (df, i), used));
/* Dataflow information is corrupt here, but it can be easily updated /* Dataflow information is corrupt here, but it can be easily updated
by creating new entries for new registers and updates or calling by creating new entries for new registers and updates or calling
...@@ -272,6 +276,7 @@ web_main (void) ...@@ -272,6 +276,7 @@ web_main (void)
free (use_entry); free (use_entry);
free (used); free (used);
df_finish (df); df_finish (df);
df = NULL;
} }
static bool static bool
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment