X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fddg.c;h=adecb707749840180520770adf67fb31fe4c3206;hb=77524490203648e1d072661d624592cdae0a0e56;hp=295811db4c158deb585aba95014f6bc304fd9e46;hpb=93f6b030c8559728003051bce232aadba0e01e96;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/ddg.c b/gcc/ddg.c index 295811db4c1..adecb707749 100644 --- a/gcc/ddg.c +++ b/gcc/ddg.c @@ -1,5 +1,5 @@ /* DDG - Data Dependence Graph implementation. - Copyright (C) 2004, 2005, 2006, 2007 + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Ayal Zaks and Mustafa Hagog @@ -44,6 +44,8 @@ along with GCC; see the file COPYING3. If not see #include "bitmap.h" #include "ddg.h" +#ifdef INSN_SCHEDULING + /* A flag indicating that a ddg edge belongs to an SCC or not. */ enum edge_flag {NOT_IN_SCC = 0, IN_SCC}; @@ -176,14 +178,18 @@ create_ddg_dep_from_intra_loop_link (ddg_ptr g, ddg_node_ptr src_node, rtx set; set = single_set (dest_node->insn); - if (set) + /* TODO: Handle registers that REG_P is not true for them, i.e. + subregs and special registers. */ + if (set && REG_P (SET_DEST (set))) { int regno = REGNO (SET_DEST (set)); - struct df_ref *first_def = - df_bb_regno_first_def_find (g->bb, regno); + df_ref first_def; struct df_rd_bb_info *bb_info = DF_RD_BB_INFO (g->bb); - if (bitmap_bit_p (bb_info->gen, first_def->id)) + first_def = df_bb_regno_first_def_find (g->bb, regno); + gcc_assert (first_def); + + if (bitmap_bit_p (bb_info->gen, DF_REF_ID (first_def))) return; } } @@ -233,7 +239,7 @@ create_ddg_dep_no_link (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to, and anti-dependences from its uses in the current iteration to the first definition in the next iteration. */ static void -add_cross_iteration_register_deps (ddg_ptr g, struct df_ref *last_def) +add_cross_iteration_register_deps (ddg_ptr g, df_ref last_def) { int regno = DF_REF_REGNO (last_def); struct df_link *r_use; @@ -244,14 +250,14 @@ add_cross_iteration_register_deps (ddg_ptr g, struct df_ref *last_def) #ifdef ENABLE_CHECKING struct df_rd_bb_info *bb_info = DF_RD_BB_INFO (g->bb); #endif - struct df_ref *first_def = df_bb_regno_first_def_find (g->bb, regno); + df_ref first_def = df_bb_regno_first_def_find (g->bb, regno); gcc_assert (last_def_node); gcc_assert (first_def); #ifdef ENABLE_CHECKING - if (last_def->id != first_def->id) - gcc_assert (!bitmap_bit_p (bb_info->gen, first_def->id)); + if (DF_REF_ID (last_def) != DF_REF_ID (first_def)) + gcc_assert (!bitmap_bit_p (bb_info->gen, DF_REF_ID (first_def))); #endif /* Create inter-loop true dependences and anti dependences. */ @@ -283,11 +289,11 @@ add_cross_iteration_register_deps (ddg_ptr g, struct df_ref *last_def) deps when broken. If the first_def reaches the USE then there is such a dep. */ ddg_node_ptr first_def_node = get_node_of_insn (g, - first_def->insn); + DF_REF_INSN (first_def)); gcc_assert (first_def_node); - if (last_def->id != first_def->id + if (DF_REF_ID (last_def) != DF_REF_ID (first_def) || !flag_modulo_sched_allow_regmoves) create_ddg_dep_no_link (g, use_node, first_def_node, ANTI_DEP, REG_DEP, 1); @@ -305,10 +311,10 @@ add_cross_iteration_register_deps (ddg_ptr g, struct df_ref *last_def) { ddg_node_ptr dest_node; - if (last_def->id == first_def->id) + if (DF_REF_ID (last_def) == DF_REF_ID (first_def)) return; - dest_node = get_node_of_insn (g, first_def->insn); + dest_node = get_node_of_insn (g, DF_REF_INSN (first_def)); gcc_assert (dest_node); create_ddg_dep_no_link (g, last_def_node, dest_node, OUTPUT_DEP, REG_DEP, 1); @@ -327,7 +333,7 @@ build_inter_loop_deps (ddg_ptr g) /* Find inter-loop register output, true and anti deps. */ EXECUTE_IF_SET_IN_BITMAP (rd_bb_info->gen, 0, rd_num, bi) { - struct df_ref *rd = DF_DEFS_GET (rd_num); + df_ref rd = DF_DEFS_GET (rd_num); add_cross_iteration_register_deps (g, rd); } @@ -339,6 +345,10 @@ build_inter_loop_deps (ddg_ptr g) static void add_inter_loop_mem_dep (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to) { + if (!insn_alias_sets_conflict_p (from->insn, to->insn)) + /* Do not create edge if memory references have disjoint alias sets. */ + return; + if (mem_write_insn_p (from->insn)) { if (mem_read_insn_p (to->insn)) @@ -1100,3 +1110,5 @@ longest_simple_path (struct ddg * g, int src, int dest, sbitmap nodes) sbitmap_free (tmp); return result; } + +#endif /* INSN_SCHEDULING */