diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/gimple.c | 38 | ||||
-rw-r--r-- | gcc/tree-outof-ssa.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-coalesce.c | 41 | ||||
-rw-r--r-- | gcc/tree-ssa-coalesce.h | 25 | ||||
-rw-r--r-- | gcc/tree-ssa-live.h | 4 |
6 files changed, 74 insertions, 44 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8764f0dd2f3..8431db03726 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2013-10-01 Andrew MacLeod <amacleod@redhat.com> + * tree-ssa-live.h (coalesce_ssa_name): Move Prototype to... + * tree-ssa-coalesce.h: New. Move prototype to here. + * tree-outof-ssa.h: Include tree-ssa-coalesce.h. + * tree-ssa-coalesce.c: Include tree-outof-ssa.h. + (gimple_can_coalesce_p): Move to... + * gimple.c (gimple_can_coalesce_p): Here. + +2013-10-01 Andrew MacLeod <amacleod@redhat.com> + * tree-into-ssa.c (enum need_phi_state): Relocate from tree-flow.h. (dump_decl_set): Move to gimple.c. * gimple.h: Don't include tree-ssa-operands.h. diff --git a/gcc/gimple.c b/gcc/gimple.c index a75604fdad4..26c78c806b5 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4380,4 +4380,42 @@ dump_decl_set (FILE *file, bitmap set) fprintf (file, "NIL"); } +/* Given SSA_NAMEs NAME1 and NAME2, return true if they are candidates for + coalescing together, false otherwise. + + This must stay consistent with var_map_base_init in tree-ssa-live.c. */ + +bool +gimple_can_coalesce_p (tree name1, tree name2) +{ + /* First check the SSA_NAME's associated DECL. We only want to + coalesce if they have the same DECL or both have no associated DECL. */ + tree var1 = SSA_NAME_VAR (name1); + tree var2 = SSA_NAME_VAR (name2); + var1 = (var1 && (!VAR_P (var1) || !DECL_IGNORED_P (var1))) ? var1 : NULL_TREE; + var2 = (var2 && (!VAR_P (var2) || !DECL_IGNORED_P (var2))) ? var2 : NULL_TREE; + if (var1 != var2) + return false; + + /* Now check the types. If the types are the same, then we should + try to coalesce V1 and V2. */ + tree t1 = TREE_TYPE (name1); + tree t2 = TREE_TYPE (name2); + if (t1 == t2) + return true; + + /* If the types are not the same, check for a canonical type match. This + (for example) allows coalescing when the types are fundamentally the + same, but just have different names. + + Note pointer types with different address spaces may have the same + canonical type. Those are rejected for coalescing by the + types_compatible_p check. */ + if (TYPE_CANONICAL (t1) + && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2) + && types_compatible_p (t1, t2)) + return true; + + return false; +} #include "gt-gimple.h" diff --git a/gcc/tree-outof-ssa.h b/gcc/tree-outof-ssa.h index e44808e9f77..8c37f55ce50 100644 --- a/gcc/tree-outof-ssa.h +++ b/gcc/tree-outof-ssa.h @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-live.h" #include "tree-ssa-ter.h" +#include "tree-ssa-coalesce.h" /* This structure (of which only a singleton SA exists) is used to pass around information between the outof-SSA functions, cfgexpand diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c index 087272fe13a..2f5507ca8fc 100644 --- a/gcc/tree-ssa-coalesce.c +++ b/gcc/tree-ssa-coalesce.c @@ -29,7 +29,7 @@ along with GCC; see the file COPYING3. If not see #include "dumpfile.h" #include "tree-ssa.h" #include "hash-table.h" -#include "tree-ssa-live.h" +#include "tree-outof-ssa.h" #include "diagnostic-core.h" @@ -1333,42 +1333,3 @@ coalesce_ssa_name (void) return map; } - -/* Given SSA_NAMEs NAME1 and NAME2, return true if they are candidates for - coalescing together, false otherwise. - - This must stay consistent with var_map_base_init in tree-ssa-live.c. */ - -bool -gimple_can_coalesce_p (tree name1, tree name2) -{ - /* First check the SSA_NAME's associated DECL. We only want to - coalesce if they have the same DECL or both have no associated DECL. */ - tree var1 = SSA_NAME_VAR (name1); - tree var2 = SSA_NAME_VAR (name2); - var1 = (var1 && (!VAR_P (var1) || !DECL_IGNORED_P (var1))) ? var1 : NULL_TREE; - var2 = (var2 && (!VAR_P (var2) || !DECL_IGNORED_P (var2))) ? var2 : NULL_TREE; - if (var1 != var2) - return false; - - /* Now check the types. If the types are the same, then we should - try to coalesce V1 and V2. */ - tree t1 = TREE_TYPE (name1); - tree t2 = TREE_TYPE (name2); - if (t1 == t2) - return true; - - /* If the types are not the same, check for a canonical type match. This - (for example) allows coalescing when the types are fundamentally the - same, but just have different names. - - Note pointer types with different address spaces may have the same - canonical type. Those are rejected for coalescing by the - types_compatible_p check. */ - if (TYPE_CANONICAL (t1) - && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2) - && types_compatible_p (t1, t2)) - return true; - - return false; -} diff --git a/gcc/tree-ssa-coalesce.h b/gcc/tree-ssa-coalesce.h new file mode 100644 index 00000000000..6b2831fc537 --- /dev/null +++ b/gcc/tree-ssa-coalesce.h @@ -0,0 +1,25 @@ +/* Header file for tree-ssa-coalesce.c exports. + Copyright (C) 2013 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the 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 COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_TREE_SSA_COALESCE_H +#define GCC_TREE_SSA_COALESCE_H + +extern var_map coalesce_ssa_name (void); + +#endif /* GCC_TREE_SSA_COALESCE_H */ diff --git a/gcc/tree-ssa-live.h b/gcc/tree-ssa-live.h index 542f6a1944e..5d80d988711 100644 --- a/gcc/tree-ssa-live.h +++ b/gcc/tree-ssa-live.h @@ -321,8 +321,4 @@ make_live_on_entry (tree_live_info_p live, basic_block bb , int p) bitmap_set_bit (live->global, p); } - -/* From tree-ssa-coalesce.c */ -extern var_map coalesce_ssa_name (void); - #endif /* _TREE_SSA_LIVE_H */ |