X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-ssa-copyrename.c;h=393bfb600c6b196110b8e5ab5f0a5b58559722e8;hb=48be990a98811c6114000276eefdec809e20272a;hp=a05935f574299be4e4a57447fe3aff73b8c61e46;hpb=d471893dcbdfab38ec021b746517d648db7dbb42;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c index a05935f5742..393bfb600c6 100644 --- a/gcc/tree-ssa-copyrename.c +++ b/gcc/tree-ssa-copyrename.c @@ -33,15 +33,12 @@ Boston, MA 02111-1307, USA. */ #include "tree-gimple.h" #include "tree-inline.h" #include "timevar.h" -#include "tree-alias-common.h" #include "hashtab.h" #include "tree-dump.h" #include "tree-ssa-live.h" #include "tree-pass.h" #include "langhooks.h" -extern void rename_ssa_copies (void); - /* The following routines implement the SSA copy renaming phase. This optimization looks for copies between 2 SSA_NAMES, either through a @@ -49,7 +46,7 @@ extern void rename_ssa_copies (void); Each copy is examined to determine if it is possible to rename the base variable of one of the operands to the same variable as the other operand. - ie. + i.e. T.3_5 = a_1 = T.3_5 @@ -117,13 +114,12 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) { int p1, p2, p3; tree root1, root2; + tree rep1, rep2; var_ann_t ann1, ann2, ann3; - bool ign1, ign2; + bool ign1, ign2, abnorm; -#ifdef ENABLE_CHECKING - if (TREE_CODE (var1) != SSA_NAME || TREE_CODE (var2) != SSA_NAME) - abort (); -#endif + gcc_assert (TREE_CODE (var1) == SSA_NAME); + gcc_assert (TREE_CODE (var2) == SSA_NAME); register_ssa_partition (map, var1, false); register_ssa_partition (map, var2, true); @@ -140,26 +136,13 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) fprintf (debug, "(P%d)", p2); } -#ifdef ENABLE_CHECKING - if (p1 == NO_PARTITION || p2 == NO_PARTITION) - abort (); -#endif - - root1 = SSA_NAME_VAR (partition_to_var (map, p1)); - root2 = SSA_NAME_VAR (partition_to_var (map, p2)); + gcc_assert (p1 != NO_PARTITION); + gcc_assert (p2 != NO_PARTITION); - if (DECL_HARD_REGISTER (root1) || DECL_HARD_REGISTER (root2)) - { - if (debug) - { - if (DECL_HARD_REGISTER (root1)) - print_generic_expr (debug, var1, TDF_SLIM); - else - print_generic_expr (debug, var2, TDF_SLIM); - fprintf (debug, " is a hardware register. No Coalescing.\n"); - } - return; - } + rep1 = partition_to_var (map, p1); + rep2 = partition_to_var (map, p2); + root1 = SSA_NAME_VAR (rep1); + root2 = SSA_NAME_VAR (rep2); ann1 = var_ann (root1); ann2 = var_ann (root2); @@ -171,6 +154,16 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) return; } + /* Don't coalesce if one of the variables occurs in an abnormal PHI. */ + abnorm = (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rep1) + || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rep2)); + if (abnorm) + { + if (debug) + fprintf (debug, " : Abnormal PHI barrier. No coalesce.\n"); + return; + } + /* Partitions already have the same root, simply merge them. */ if (root1 == root2) { @@ -253,6 +246,18 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) return; } + /* Don't coalesce if the aliasing sets of the types are different. */ + if (POINTER_TYPE_P (TREE_TYPE (root1)) + && POINTER_TYPE_P (TREE_TYPE (root2)) + && get_alias_set (TREE_TYPE (TREE_TYPE (root1))) + != get_alias_set (TREE_TYPE (TREE_TYPE (root2)))) + { + if (debug) + fprintf (debug, " : 2 different alasing sets. No coalesce.\n"); + return; + } + + /* Merge the two partitions. */ p3 = partition_union (map->var_partition, p1, p2); @@ -286,7 +291,7 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) then cause the SSA->normal pass to attempt to coalesce them all to the same variable. */ -void +static void rename_ssa_copies (void) { var_map map; @@ -391,6 +396,7 @@ struct tree_opt_pass pass_rename_ssa_copies = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */ + TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */ + 0 /* letter */ };