diff options
Diffstat (limited to 'gcc/tree-ssa-copyrename.c')
-rw-r--r-- | gcc/tree-ssa-copyrename.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c index c65b828..ac7c00a 100644 --- a/gcc/tree-ssa-copyrename.c +++ b/gcc/tree-ssa-copyrename.c @@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA. */ #include "tree-dump.h" #include "tree-ssa-live.h" #include "tree-pass.h" +#include "langhooks.h" extern void rename_ssa_copies (void); @@ -247,16 +248,24 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) gimp2 = false; } + /* Don't coalesce if the two variables aren't type compatible. */ + if (!lang_hooks.types_compatible_p (TREE_TYPE (root1), TREE_TYPE (root2))) + { + if (debug) + fprintf (debug, " : Incompatible types. No coalesce.\n"); + return; + } + /* Merge the two partitions. */ p3 = partition_union (map->var_partition, p1, p2); /* Set the root variable of the partition to the better choice, if there is one. */ if (!gimp2) - SSA_NAME_VAR (partition_to_var (map, p3)) = root2; + replace_ssa_name_symbol (partition_to_var (map, p3), root2); else if (!gimp1) - SSA_NAME_VAR (partition_to_var (map, p3)) = root1; + replace_ssa_name_symbol (partition_to_var (map, p3), root1); /* Update the various flag widgitry of the current base representative. */ ann3 = var_ann (SSA_NAME_VAR (partition_to_var (map, p3))); @@ -359,7 +368,7 @@ rename_ssa_copies (void) fprintf (debug, "\n"); } } - SSA_NAME_VAR (var) = SSA_NAME_VAR (part_var); + replace_ssa_name_symbol (var, SSA_NAME_VAR (part_var)); } delete_var_map (map); |