X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-ssa-copyrename.c;h=45f65678e1a01ee1b09c6eaec5908854e5b3ad2f;hb=2040a4ca2673caec7bbd253f2c348ab2e903becf;hp=db85d9c01621559d98208f7db6d5493dd052b81a;hpb=0f9005ddc07f0919938a893f0fb526b68783c72c;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c index db85d9c0162..45f65678e1a 100644 --- a/gcc/tree-ssa-copyrename.c +++ b/gcc/tree-ssa-copyrename.c @@ -16,8 +16,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #include "config.h" #include "system.h" @@ -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) { @@ -215,8 +208,9 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) } /* Don't coalesce if there are two different memory tags. */ - if (ann1->type_mem_tag && ann2->type_mem_tag - && ann1->type_mem_tag != ann2->type_mem_tag) + if (ann1->symbol_mem_tag + && ann2->symbol_mem_tag + && ann1->symbol_mem_tag != ann2->symbol_mem_tag) { if (debug) fprintf (debug, " : 2 memory tags. No coalesce.\n"); @@ -253,6 +247,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 aliasing sets. No coalesce.\n"); + return; + } + + /* Merge the two partitions. */ p3 = partition_union (map->var_partition, p1, p2); @@ -265,10 +271,10 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) /* Update the various flag widgitry of the current base representative. */ ann3 = var_ann (SSA_NAME_VAR (partition_to_var (map, p3))); - if (ann1->type_mem_tag) - ann3->type_mem_tag = ann1->type_mem_tag; + if (ann1->symbol_mem_tag) + ann3->symbol_mem_tag = ann1->symbol_mem_tag; else - ann3->type_mem_tag = ann2->type_mem_tag; + ann3->symbol_mem_tag = ann2->symbol_mem_tag; if (debug) { @@ -286,7 +292,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 unsigned int rename_ssa_copies (void) { var_map map; @@ -368,6 +374,7 @@ rename_ssa_copies (void) } delete_var_map (map); + return 0; } /* Return true if copy rename is to be performed. */