diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2013-10-01 16:23:52 +0000 |
---|---|---|
committer | Andrew Macleod <amacleod@gcc.gnu.org> | 2013-10-01 16:23:52 +0000 |
commit | 1df9f5a99845ac0468a73f2d9c8226bd739a33a0 (patch) | |
tree | 705fb39524c1af4fc7251567df4f88f848dd5e99 /gcc/gimple.c | |
parent | 80560f9521f81ae2c50b52b091b4caaf7d3d4397 (diff) |
tree-ssa-live.h (coalesce_ssa_name): Move Prototype to...
* 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.
From-SVN: r203069
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r-- | gcc/gimple.c | 38 |
1 files changed, 38 insertions, 0 deletions
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" |